ラズパイからメールを送信する方法(2024年版)

Raspberry Pi から Gmail のメールサーバーを経由してメールを送信する方法です.

ラズパイで稼働しているサーバの監視用途,たとえばcrontabのエラー,セキュリティの警告などをメールで通知する用途を想定しています

OSはdebian系を使っているものとして,exim4を使います.

Gmail側の仕様が変わったので2024年版として新しく記事を用意しました

Gmail側の設定

メールはSMTPを使ってgmail経由で送信します.

2024年現在,gmailSMTPを使うためには「アプリパスワード」を使う必要があります.
アプリパスワードは16文字で,具体的には以下の手順で作成できます.

  1. Googleアカウントにログインする.URLは https://myaccount.google.com
  2. 「2 段階認証プロセス」を有効にする
    • 有効にしてない場合は,左のメニューから「セキュリティ」 を選択し,「Google にログインする方法」の「2 段階認証プロセス」を有効にします
  3. Googleアカウントの画面、左のメニューから「セキュリティ」 を選択
  4. 「2 段階認証プロセス」をクリックして「2 段階認証プロセス」の設定画面を開く
  5. 画面下にある「アプリ パスワード」をクリック
  6. 「アプリ パスワード」を新規作成する
    • メール送信用に使い捨てのアカウントを作成します
    • 「App name」でアカウントの名前を設定できます.とりあえず「SMTP」とでも入れておきましょう
    • 「作成」のボタンを押します
    • 16文字のパスワードが表示されます.これが送信用のパスワード(SMTPのパスワード)になります.

ラズパイ側の設定

exim4 の設定を行います

設定ファイル /etc/exim4/update-exim4.conf.conf の内容を次のように編集します

dc_eximconfig_configtype='smarthost'
dc_other_hostnames=''
dc_local_interfaces='127.0.0.1'
dc_readhost='ホスト名'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='smtp.gmail.com::587'
CFILEMODE='644'
dc_use_split_config='true'
dc_hide_mailname='false'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'

dc_readhost はホスト名を指定します.指定した文字列はメールの送信元などに利用されますが,DNSに登録されてないホスト名でもとりあえずはOKです


送信用パスワードは,ファイル /etc/exim4/passwd.client に記載します

smtp.gmail.com:GMAILのメアド:アプリパスワード

アプリパスワードは空白を除外した16文字の文字列を記載します


設定を反映させます

$ sudo /usr/sbin/update-exim4.conf
$ sudo systemctl restart exim4

動作確認

ログファイルを確認します.ファイル名は /var/log/exim4/mainlog です

試しにメールを送信してみます

$ date | mail 送信先メールアドレス

ログファイルに Completed とメッセージが出力されればメール送信は成功しています

補足

mainlogのTLS error

ログファイルに

 TLS error on connection (recv): The TLS connection was non-properly terminate

TLS のエラーが出力されますが,これは無視して良いようです.

eximのバグレポートはこちら
https://bugs.exim.org/show_bug.cgi?id=2034
要約すると

  • このメッセージはTLSの接続が切断された場合に出力される
  • 接続切断はサーバーの負荷低減になるので,サーバー側が意図的に切断している場合がある(つまりサーバー側は正常動作してる)
  • exim側からみるとこれは強制切断なのでログメッセージを消すことはできない

ということのようです.