Macのローカル開発環境でメール送信できるようにする(Postfixを使う)
- 公開日:2021/9/28
重い腰をあげてローカル開発環境でもメール送信できるようにしました。
macOSに標準で用意されているPostfixを利用します。
Postfix(ポストフィックス)はオープンソースのメール転送エージェント(MTA:Message Transfer Agent)です。
メール送信サーバはGmailを利用します。
事前にGoogleアカウントの準備が必要になります。後で説明しますが、アカウントの設定でセキュリティを下げる必要があり、2段階認証プロセスが有効になっているアカウントでは利用できませんのでご注意を。
手順
1. main.cfを設定
管理者権限で /etc/postfix/main.cf を編集します。
$ sudo vi /etc/postfix/main.cf
パスワードを聞かれるのでMacのパスワードを入力します。
relayhostを変更
外部にメールを送信するSMTPサーバを指定します。
relayhost = [smtp.gmail.com]:587
SASLの設定を追記
SASL(Simple Authentication and Security Layer)によるSMTP認証をするのため、main.cfの最後に以下を追記します。
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes
tls_random_source=dev:/dev/urandom
smtp_sasl_password_maps の sasl_passwd は任意の名前でOKです。この名前はSASL認証情報を記述したファイル作成で使用します。
記述内容をチェック
$ sudo postfix check
エラーが出なければOKです。
2. SASL認証情報を記述したファイルを作成
ファイルを作成
SASLの認証情報を記載したファイルを作成します。
$ sudo vi /etc/postfix/sasl_passwd
sasl_passwd は先程の手順で smtp_sasl_password_maps に記述したものと同じにします。
認証情報を記述
viエディタが起動したら、以下を記述し保存します。
[smtp.gmail.com]:587 sampleaccount@gmail.com:12345467
sampleaccountは、使用するGoogleアカウント名です。
1234567は、そのGoogleアカウントのパスワードです。
3. ハッシュマップデータベースを生成
ハッシュマップデータベースを作成
SASL認証情報を記述したファイルを作成できたら以下を実行します。
$ sudo postmap /etc/postfix/sasl_passwd
/etc/postfix ディレクトリに「sasl_passwd.db」というファイルが生成されていればOKです。
確認できたら、sasl_passwdファイルは削除します。(パスワードが丸見えなので・・・)
$ sudo rm -rf /etc/postfix/sasl_passwd
4. Googleアカウントを設定
Google経由でメールを送信するには、先程設定したGoogleアカウントで「安全性の低いアプリのアクセス」を許可(有効)する必要があります。この設定をしなければGoogleのセキュリティにひっかかってしまい、メール送信ができません。
2段階認証を有効にしているGoogleアカウントではこれを有効にすることはできませんのでご注意ください。
5. メール送信テスト
実際にメールを送信できるかテストしてみます。
ターミナルからメール送信
mailコマンドで簡単に以下のように送信してみます。
$ mail -s 件名(任意のメールのタイトル) 送信先メールアドレス
ここにメール本文
.
EOT
1行目でENTERキーを押すと待機状態になるのでメール本文を入力します。
最後に3行目のように.(ピリオド)を入力してENTERキーを押すと完了です。
PHPでメール送信
以下を記述してPHPファイルをローカル開発環境に設置して実行します。
<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$to = 'taro@example.com'; //送信先メールアドレス※実在するメールアドレス
$subject = 'メール送信テスト';
$message = 'これはテストです';
$headers = 'From: test@example.com'; //送信元メールアドレス
if (mb_send_mail($to, $subject, $message, $headers)) {
echo "成功";
} else {
echo "失敗";
}
これで送信先メールアドレスにメールが届いていればOKです。