20210129のMacに関する記事は5件です。

【macOS×XAMPP】sendmail.iniなんてないけど、どうやってPHPでメール送るの??(Gmail経由)

環境

OS → macOS Big Sur ver 11.1
サーバ/DB → XAMPP 7.4.13-0
エディタ → Visual Studio Code
メール →  Gmail

ターゲット(この記事を読むべき人)

  • PHPを用いてローカル環境からメールを送りたいけど、送れずに悩んでいる人
  • sendmailというメールエージェントが見当たらず先に進めない人
  • macOSの記事が少なく自分に合う情報が見つからず困っている人

ペルソナは私と同じような初学者向けの記事となっているので、現役のエンジニアの方々は「こんなところでお前つまづいたのか」と笑いながら読み進めていただければ...

自分が陥った状況

ローカル環境にあるPHPアプリケーションからメールを自分のGmailに飛ばそうとした結果、飛ばせない。
メールの飛ばし方をググるとたくさん記事が出てくる。
参照してみると、まずphp.iniをいじってポート番号や宛先を変える。その後どうやらsendmail.phpというファイルをいじるとのこと。

しかし、このsendmail.iniがどうやらmacOS上を漁っても出てこない...
そこからsendmailの設定ファイルであるsendmail.iniの実態を掴むまで数日かかり苦労した。

sendmail.iniはmacOSのどこにある?

結論から申すと、
sendmailはmacOSにはない。

もう少し調べてみると、どうやら違うメールサーバがmacには標準搭載されているらしい。
その名前は、「postfix」である。

そもそもメールサーバってなんぞや

sendmailやpostfixの実態を掴むためにまずはメール送信の仕組みについて話していく。

メールの送受信というものは、SMTPPOP(IMOP)というプロトコルを用いて行われる通信のことである。
プロトコルというのは、通信の手段を明確に定めた規格である。
サーバとクライアントでお互い扱うデータの種類や通信の手法をあらかじめ統一しておくためのルールみたいなもの。
メールでのやりとりをするときは常にsmtpやpop.imopが使われている。

メール配送の様子を簡易化した図がこちら。
mail-1.png.jpg

引用元: 【図解】初心者にも分かるメールの仕組み~SMTP/POP/IMAPの違い, リレーの構成, 用語について~

MTA(Mail Transfer Agent)
メールを配送するためのプログラムで、ホスト間でのメールの配送や配送されてきたメールを受け取る機能をもっています。代表的なMTPは、sendmail,qmail,Postfixなどがあります。

MDA(Mail Delivery Agent)
MTAがメールを受け取ると、各ユーザのメールボックスにメールを配信する機能を持っています。代表的なMDAは、mail.local,procmail,qmail-localなどがあります。

MUA(Mail User Agent)
主にユーザがメールを読み書きし、送受信する機能を持っています。メーラーとも言われ、アドレス帳やメールの振り分け機能を持っているアプリケーションが多く存在ます。また、インターネットメールの仕様に合わせたコード変換などを自動的に行います。代表的なMDAは、Becky!,Outlook Express,Eudora,Muleなどがあります。

引用元: SMTP配送の仕組みとsendmail

厳密にいうと、メールサーバ内にあるMTAがsendmailやpostfixである。
phpを動かすapacheサーバにメール配送機能があるのではなく、メールサーバ内にあるエージェントが相手のメールサーバに配送しているという認識だけ頭に入れて欲しい。

今回は
postfix → gmailサーバ → 相手のメールサーバ
というgmail経由でのリレー転送方法を解説していく。

転送方法

postfixの役割とメール送信の流れについて把握したところで、以下のアクションプランを提示する。今回はローカル環境での送信テストなので、必要最小限の手順のみ紹介。

  1. php.iniを編集しpostfixに対してコネクションをとる
  2. postfixの設定ファイルを開き宛先を記述する
  3. saslの設定

前提条件

ファイル編集はvimというエディタで行う。
vimの使い方がわからない人は、こちらの記事で基礎動作を把握しておいてほしい。
https://qiita.com/okamos/items/c97970ab34ff55ff3167

1 php.iniを編集する

この部分を編集。smtpのポート番号とホストを設定。

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP=localhost /* ← ここをlocalhostに */
; http://php.net/smtp-port
smtp_port=25 /* ←ここを25に */

2 postfixの設定

ここからはpostfixをいじる。
まずターミナルを使いpostfixディレクトリに移動。パスは以下の通り

cd /etc/postfix/

root権限を用いてmain.cfをvimで開く

sudo vi main.cf

main.cfにて以下の場所を探す

#relayhost = $mydomain
#relayhost = [gateway.my.domain]
#relayhost = [mailserver.isp.tld]
#relayhost = uucphost
#relayhost = [an.ip.add.ress]

直下にrelayhostの宛先と設定を記述し保存( :wq )

relayhost=[smtp.gmail.com]:587
smtp_sasl_auth_enable=yes
smtp_sasl_password_maps=hash:/etc/postfix/sasl_passwd
smtp_use_tls=yes
smtp_tls_security_level=encrypt
tls_random_source=dev:/dev/urandom
smtp_sasl_security_options = noanonymous
smtp_always_send_ehlo = yes
smtp_sasl_mechanism_filter = plain

relayhostに今回gmailを使うので、gmailのポート番号を使用する。
gmailをsmtpリレーとして使うためのポート番号の調べ方

saslというライブラリを使うためにその情報も記述している。
saslは、異なるプラットフォームのユーザ認証を手助けするライブラリ。
アプリケーション毎にリレーサーバに対してのアクセス方法が変わってきてしまうため、saslを用いてユーザ認証を共通化している。

3 saslの設定

saslのユーザ認証方法の流れ

gmail認証するためのパスワードを格納したファイルを作成
↓
ファイルのパーミッションを設定
↓
ファイルをDB化する

まずはgmail認証データをpostfixディレクトリ内にsasl_passwdというファイル名で作成。
(ここのファイル名は、main.cfに追記したsmtp_sasl_password_mapsのファイル名と一致させる)

sudo vi sasl_passwd

sasl_passwdには以下のフォーマットで必要な情報を記述

[smtp.gmail.com]:587   GMAILメールアドレス:パスワード

保存したら、sasl_passwdファイルのパーミッションを指定

sudo chmod go-rx sasl_passwd

最後にsasl_passwdをハッシュマップ データベースファイル化する。

sudo postmap hash:/etc/postfix/sasl_passwd

これでsaslの設定は終了。
最後にpostfixを起動、または再起動させます。

起動
sudo postfix start

再起動
sudo postfix reload

まとめ

macOSに関する情報がwindowsに比べて少なかったので、自分がローカル環境でメールを送信できた手法を紹介した。
「phpで簡単にメールを送れる」という情報をよく目にするが、根底にあるLinuxなどOSに関する知識やプロトコルを理解していないとテスト環境の構築は難しいと感じた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

小技の寄せあつめ

これは、何?

Mac、Raspberry Piを使うなかで、ちょっと便利だと思った小技を寄せあつめたものです。
都度、書き足します。

Mac編

zshの関数を利用してpyuic5の入力を楽にする(2021.2.2追加)

最近Qt Designerをよく使うのでpyuic5を頻繁に使用している。
そのたびに

% pyuic5 hogehoge.ui -o hogehoge.py

とするのが面倒になったので.zshrcにfunctionとして登録しました。

設定は、以下の内容を.zshrcに追加するだけです。関数名(コマンド名)は、ui2pyにしました。
同じ名前でも、.zshrcの設定が先に呼ばれるので問題ありません。

function ui2py(){
  pyuic5 $1 -o $1:r.py
}

使う前には、

% source ~/.zshrc

してください。
使い方(必要ないと思いますが、念のため)は以下のとおりです。

% ui2py hogehoge.ui

sshでログインする際に、ログイン先のディレクトリを変更(2021.1.31追加)

% ssh -X raspi4 -t "cd /home/pi/share; bash --login"

sshログイン時に、タイムアウトを防止(2021.1.31追加)

~/.ssh/configに、以下を追加。

ServerAliveInterval 30

Raspberry Pi編

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Mac】Nodeインストール手順の備忘録

はじめに

  • Mac環境上で、Nodeの開発環境を構築する機会があったので、その備忘録です。
  • Nodeの管理ツールとして、nodebrewを使用しました。

Homebrewのインストール

zsh
# スクリプト実行
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# ログ
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
# ログイン時のPasswordを入力
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/bin
︙
Already up-to-date.
==> Installation successful!
# インストール確認
brew --version
# ログ
Homebrew 2.7.7

nodebrewのインストール

zsh
# インストール実行
brew install nodebrew
# Shellの確認
echo $SHELL
# → /bin/zsh
# .zshrcが無い場合、作成
touch .zshrc
# ~/.zshrcにnodebrewのPATHを追記
% echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
# ファイル読み込み
source ~/.zshrc
# インストール確認
nodebrew
# → nodebrew 1.0.1 
# セットアップ実行
nodebrew setup

Node.jsのインストール

  • インストール可能なバージョンを確認します。
zsh
# インストール可能なバージョンを表示
nodebrew ls-remote
# → v0.0.1 v0.0.2 ~
# → v15.0.0 v15.1.0 ~
# → io@v1.0.0 io@v2.0.0 ~ 
  • バージョンを指定して、インストールします。
zsh
# v12.20.1をインストール
nodebrew install v12.20.1
  • インストール済みバージョンを確認します。
zsh
nodebrew list
# → v12.20.1
  • インストール済みバージョンを有効にします。
zsh
nodebrew use v12.20.1
node -v
# → v12.20.1
  • 別バージョンをインストールして、切り替えます。
zsh
# v14.15.3をインストール
nodebrew install v14.15.3
# インストール済みバージョンを表示
nodebrew list
# → v12.20.1
# → v14.15.3
# v14.15.3を有効化
nodebrew use v14.15.3
node -v
# → v14.15.3 
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

library not found for -lSystem

library not found for -lSystem

MacOS Big Sur 11.1にアップデートをした。
g++でコンパイルすると以下のエラーが発生した。(この時VScode上では、bits/stdc++.hのincludeエラーが出ていた)

ld: library not found for -lSystem
collect2: error: ld returned 1 exit status

解決法

brew upgrade gcc

再インストールでも大丈夫っぽい。
ちなみにこのサイトに載っていた以下の方法を先に試したが何も起きなかった。

export LIBRARY_PATH="$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Homebrewでデスクトップアプリを一気にインストールする方法

成果物

前提

  • Homebrewがインストールされている

手順

  1. インストールしたいアプリを検索
brew search google-chrome --cask
  1. インストールしたいアプリのリストを作成
    • 検索して見つかったアプリの名前を列挙していきます。
    • ここでは試しに「cask_formula.txt」というファイルを作成して、以下のように追記します。
    • 実際に動かす際は取捨選択してください。
docker
google-chrome
insomnia
insomnia-designer
iterm2
jetbrains-toolbox
middleclick
slack
tableplus
visual-studio-code
  1. インストールの実行
    • 「cask_formula.txt」が置いてあるディレクトリで以下コマンドを実行
xargs brew cask install < cask_formula.txt

備考

  • 「cask」を外せばcuiでも同じことができます。
  • 新しく人が入った際にPCを爆速でセットアップできるように社内でgitを使って「cask_formula.txt」を管理しておくといいかもしれません。
  • 上述の成果物をcloneして使い回すのがおすすめです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む