<![CDATA[久々に Mac に向かってキーボードを叩いていた azur256 です。
最近、家庭内で使っている NAS だの増設 HDD だのが不安な兆候を見せはじめたので、たまたま別件であまった 3TB の外付けHDDがあったので、rync でバックアップを取ることにしました。で、この rsync の実行結果をメールで送ろうと思ったのですが、MacBook Pro にメールの設定をし忘れていたので、軽い気持ちで始めたところ、ちょっと引っ掛かったので備忘録を兼ねてエントリしておきます。Macからメールを送れるようにする
Mac でも Mail アプリなどを使えば簡単にメールを送れるわけですが、シェルスクリプトの結果などをメールで通知しようした場合、 Mac OS X の OS でメールを送信できるようにする必要があります。
幸いにも、OS 標準で postfix というメール機能が使えるようになっていますので、これを設定しさえすれば、簡単にメールが送れるようになるわけです。(そのはずでした…)。
「postfix とは何か」、「どうやったら使えるようになるのか」、については色々なところに情報があるので、詳しく知りたい方は、そちらを見ていただくとして、今回は、ざっくり設定方法を書いておきます。
ちなみに、以下は MacOS High Sierra の内容なので、OS のバージョンによっては若干違いがあるかもしれません。
まずは postfix に Gmail の smtp サーバにリレーするための情報を /etc/postfix/main.cf に設定します。
$ cd /etc/postfix
$ sudo vi main.cf
main.cf の末尾に以下の内容を追加しました。
myhostname = [your domain]
relayhost = smtp.gmail.com:587
#SASL Authentication
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/gmail_authinfo
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_always_send_ehlo = yes
#TLS Settings
smtp_use_tls = yes
smtp_tls_security_level = encrypt
compatibility_level = 2
次に Gmail の SMTP 認証用に SASLのパスワードDBを作成します。
まず、DB の元になるパスワードファイルを作ります。
$cd /etc/postfix
$sudo vi gmail_authinfo
パスワードファイルのファイル名は、先ほど main.cf で smtp_sasl_password_maps という項目に設定した値と同じにしてください。では、このファイルに以下の内容を記載します。
smtp.gmail.com:587 [email protected]:your_password_string
Gmailのメールアドレス:Gmailのパスワード を記載します。(二段階認証を設定している場合、このパスワードに一工夫が必要です。後述しますので、今はそんなもんか、と思っておいてください)。
このファイルを保存したら、以下のコマンドでパスワードDBを作成します。
$sudo postmap /etc/postfix/gmail_authinfo
このコマンドを実行すると /etc/postfix/gmail_authinfo.db というファイルができているはずです。このファイルができていたら、先ほどパスワード文字列を記載した gmail_authinfo ファイルは不要ですので、しっかり削除しておきましょう。ゴミ箱に入れただけ、だと復元できてしまうので注意してください。
ここまで gmail に向けてメールを飛ばす設定は完了です。この設定を postfix がちゃんと読んでくれるかを試すために、以下のコマンドを打ってみます。
$sudo postfix start
これでエラーが出なければ stop で postfix のプロセスを止めておきましょう。(最近の Mac OS では launchd がメールスプールを確認して勝手に postfix を起動してくれるので postfix 自体を起動しておく必要はありません。)
場合によっては、以下のエラーが出ることがあります。
postfix: To disable backwards compatibility use "postconf compatibility_level=2" and "postfix reload"
このエラーが出たら、ここに書かれている通りに postconf コマンドを打ってから、reload してみましょう。postfix プロセスが起動していない場合は、 postfix start をしてください。
あとは、ターミナルからメールが送れるか、mail コマンドを使って試してみましょう。この時に、もう一枚ターミナルを立ち上げておいて、以下のコマンドを入力して sendmail の挙動を見れるようにしておきます。
$log stream --predicate '(process == "smtpd") || (process == "smtp")' --info
二段階認証でのエラーを回避する
上手くメールが送れればこれで設定は終わりです。が、最近は多くの人が二段階認証を設定していると思うので、大抵失敗すると思います。私も失敗しました。
失敗すると、先ほどの log を出力しているターミナルに以下のようなエラーが出ていると思います。
smtp: 1395C130A3F021: SASL authentication failed; server smtp.gmail.com[1225:3022:1369:c26::9a] said: 534-5.7.9 Application-specific password required. Learn more at?534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor
このエラーメッセージに書かれているように https://support.google.com/mail/?p=InvalidSecondFactor にアクセスしてアプリ パスワードを入手しましょう。
このページの「アプリ パスワードの生成方法」に書かれている通りの手順で、二段階認証を回避するアプリ用のパスワードを生成します。手順通りに作成すると「お使いのデバイスのアプリ パスワード」に16文字の文字列が出力されますので、これを使って、改めて SASL のパスワードDBを作成します。
先ほどの gmail_authinfo を改めて以下の内容で作成します。
smtp.gmail.com:587 [email protected]:applicaton_password_string
ファイルができたら postmap でパスワードDBを再作成すれば OK です。これで無事にメールが送れるようになるはずです。アプリパスワードは Google アカウントの管理から削除できますので、不要になったり不安を感じたら削除するなり、新たなものに変えるなり自分できちんと管理する必要がある点は注意してください。]]>