監視用のスクリプトからメールを飛ばしたかったので、Gmail で送信する方法を調べた。
環境
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) # postconf | grep mail_version mail_version = 2.10.1 milter_macro_v = $mail_name $mail_version # mailx Heirloom Mail version 12.5 7/5/10.
基本的にはここそのまま。

Gmail の設定
Gmail を使って送信するために、アプリパスワードを発行します。
[アカウント] > [ログインとセキュリティ] > [アプリパスワード]で、16桁のパスワードを発行します。
あとで使用するので、メモしておきます。一応あとからでも見れます。
インストール
必要なものをインストールしておきます。CentOS7 は minimal では Postfix や Mailx は入ってないみたいなので、これらを入れます。
yum -y update yum install -y postfix mailx cyrus-sasl-plain
postfix はメール転送エージェント、mailx はメールを送信するメーラー、cyrus-sasl-plain は sasl 認証を行うために使います。
sasl ってなに?
Wikipedia は訳がわかんなかったので、簡単にまとめると、認証やセキュリティに関する処理を行うための機構で、sasl を使うことで特定の認証方式に縛られずに認証が行えるみたいです。
使用する認証には ldap や kerberos, pam などが利用できて、主に SMTP-AUTH などで使われることが多いみたいです。
postfix では Cyrus SASL ライブラリを使用します。
Postfix の設定
Gmail で送るには SMTP-AUTH と TLS の設定が必要みたいです。
Postfix の設定は /etc/postfix/main.cf を編集します。今回は以下を追記するだけで OK です。
## add for gmail relayhost = [smtp.gmail.com]:587 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_sasl_mechanism_filter = plain smtp_use_tls = yes
smtp_sasl_auth_enable = yes | sasl を有効にします |
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd | リレー先のサーバアドレスとユーザ名、パスワードを記述したファイルを指定します |
smtp_sasl_security_options = noanonymous | 匿名ユーザのログインを禁止します |
smtp_sasl_tls_security_options = noanonymous | tls の場合の匿名ログインを禁止します |
smtp_sasl_mechanism_filter = plain | SMTP-AUTH で認証方法を試す順番を指定します。今回は平文のみ |
smtp_use_tls = yes | tls を使用します |
Gmail のパスワードファイルを作成します。
[smtp.gmail.com]:587 xxxxx@gmail.com:PASSWORD
PASSWORD のところに上で作成したアプリパスワードを入れます。
次にこのファイルをハッシュ化します。
sudo postmap /etc/postfix/sasl_passwd sudo chmod 600 /etc/postfix/sasl_passwd
最後に postfix を再起動します
sudo systemctl reload postfix.service
送信テスト
echo "test" | mail -s "test1" xxxxx@gmail.com
自分のアカウントから xxxxx@gmail.com 宛にメールが送信されます。
ログは /var/log/maillog に出力されるので、エラーが出たら確認しましょう。
トラブル例
docker で作ったときに以下のエラーが出ました。
send-mail: fatal: parameter inet_interfaces: no local interface found for ::1
::1 のインターフェイスがないとのことでしたが、/etc/hosts で ipv6 をコメントアウトするとエラーは消えました。
127.0.0.1 localhost #::1 localhost ip6-localhost ip6-loopback
コメント