最近、家庭内で使っている 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 に設定します。
1 2 |
$ cd /etc/postfix $ sudo vi main.cf |
main.cf の末尾に以下の内容を追加しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 の元になるパスワードファイルを作ります。
1 2 |
$cd /etc/postfix $sudo vi gmail_authinfo |
パスワードファイルのファイル名は、先ほど main.cf で smtp_sasl_password_maps という項目に設定した値と同じにしてください。では、このファイルに以下の内容を記載します。
1 |
smtp.gmail.com:587 foo@gmail.com:your_password_string |
Gmailのメールアドレス:Gmailのパスワード を記載します。(二段階認証を設定している場合、このパスワードに一工夫が必要です。後述しますので、今はそんなもんか、と思っておいてください)。
このファイルを保存したら、以下のコマンドでパスワードDBを作成します。
1 |
$sudo postmap /etc/postfix/gmail_authinfo |
このコマンドを実行すると /etc/postfix/gmail_authinfo.db というファイルができているはずです。このファイルができていたら、先ほどパスワード文字列を記載した gmail_authinfo ファイルは不要ですので、しっかり削除しておきましょう。ゴミ箱に入れただけ、だと復元できてしまうので注意してください。
ここまで gmail に向けてメールを飛ばす設定は完了です。この設定を postfix がちゃんと読んでくれるかを試すために、以下のコマンドを打ってみます。
1 |
$sudo postfix start |
これでエラーが出なければ stop で postfix のプロセスを止めておきましょう。(最近の Mac OS では launchd がメールスプールを確認して勝手に postfix を起動してくれるので postfix 自体を起動しておく必要はありません。)
場合によっては、以下のエラーが出ることがあります。
1 |
postfix: To disable backwards compatibility use "postconf compatibility_level=2" and "postfix reload" |
このエラーが出たら、ここに書かれている通りに postconf コマンドを打ってから、reload してみましょう。postfix プロセスが起動していない場合は、 postfix start をしてください。
あとは、ターミナルからメールが送れるか、mail コマンドを使って試してみましょう。この時に、もう一枚ターミナルを立ち上げておいて、以下のコマンドを入力して sendmail の挙動を見れるようにしておきます。
1 |
$log stream --predicate '(process == "smtpd") || (process == "smtp")' --info |
二段階認証でのエラーを回避する
上手くメールが送れればこれで設定は終わりです。が、最近は多くの人が二段階認証を設定していると思うので、大抵失敗すると思います。私も失敗しました。
失敗すると、先ほどの log を出力しているターミナルに以下のようなエラーが出ていると思います。
1 |
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 を改めて以下の内容で作成します。
1 |
smtp.gmail.com:587 foo@gmail.com:applicaton_password_string |
ファイルができたら postmap でパスワードDBを再作成すれば OK です。これで無事にメールが送れるようになるはずです。アプリパスワードは Google アカウントの管理から削除できますので、不要になったり不安を感じたら削除するなり、新たなものに変えるなり自分できちんと管理する必要がある点は注意してください。
最後まで読んでいただきありがとうございます。
左のアイコンをクリックして、このブログを Feedly に登録していただけると嬉しいです
Facebook ページでも情報を発信していますのでよろしかったら「いいね!」をお願いします
RSSリーダへの登録は こちら からどうぞ。
コメントを残す