postfixで587番ポート(サブミッションポート)を使う

2020.3.1 (日)

GCPのVMインスタンスは恒久的に25番ポートの利用ができない上に自身のVMで「注: ポート 25 は常にブロックされており、G Suite を使用した SMTP リレーを介したとしても利用できません。」となっております。AWSは申請制度でユーザーの審査が通れば25ポートを使うことができますがGCPは無理っぽい。
インスタンスからのメールの送信
じゃ、どうすればいいかというと、外部のSMTPサーバーにサブミッションポート587で送信を委譲するかたちにしないといけないということで結構面倒です。

ここではGmailアカウントでSMTPサーバーを使えるように設定してから、postfixの設定したVMインスタンスでGmailのSMTPを使って送信できるように設定します。

GoogleアカウントでSMTPサーバーの設定をする

Googleアカウントをもっていれば誰でもSMTPサーバーが使えます。
GmailでSMTPサーバーを使うを参考にしてください。
最終的に16桁のパスワードが発行され、それがSMTPサーバーの認証パスワードになります。パラメーターの例はこんな感じになります。

host: smtp.gmail.com
port: 465
user: user@gmail.com (自身のGoogleアカウント(メールアドレス))
password: xxxxxxxxxxxxxxxx (発行した16桁のパスワード)
encrypted: ssl

Postfixの設定

587で送信できるようにするにはmaster.cfを修正します。まずはバックアップをとっておきましょう。

# cd /etc/postfic
# cp -p master.cf master.cf.org

以下の部分を修正します。CnetOS7の場合はsmtpd_client_restrictionsの部分が変数で設定されているかもしれません。$mua_client_restrictionspermit_sasl_authenticated,rejectを設定するか、ここにべた書きするかはどっちでもいいです。ここではベタ書きで直接記述しています。

-- 中略 --
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
-- 中略 --

Cyrus SASLライブラリをインストールします。ユーザーパスワードの暗号化などに使います。

# yum install cyrus-sasl-plain cyrus-sasl-md5

main.cfを修正します。まずはバックアップを作成します。(すでに運用中の場合は、main.cf.YYYYMMDDとか)

# cd /etc/postfic
# cp -p main.cf main.cf.org

main.cfを修正します。main.cfの最終行に以下を追加します。この設定はsaslで暗号化したユーザーとパスワードを読み込み設定です。smtp.gmail.comにリレーする際のSMTP認証の設定になります。

# Gmail SMTP
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

SMTP認証の設定

ユーザーとパスワードの設定をします。先の例でいうと

user: user@gmail.com (自身のGoogleアカウント(メールアドレス))
password: xxxxxxxxxxxxxxxx (発行した16桁のパスワード)

を設定します。

# vi /etc/postfix/sasl_password

[smtp.gmail.com]:587    user@gmail.com:xxxxxxxxxxxxxxxx

パーミッションの変更をします。

# chmod 600 /etc/postfix/sasl_password

DBファイルの生成を行います。(認証情報はバイナリデータにコンパイルされます。)/etc/postfix/sasl_password.dbというファイルが生成されるはずです。

# postmap hash:/etc/postfix/sasl_password

ここまで完了したら再起動します。

# systemctl restart postfix

これでメールが外部のSMTPサーバーを通じて送信できるようになります。mailコマンドなどで確認します。

echo hogehoge | mail user@gmail.com

tail /var/log/maillogなどで確認します。

Mar  1 11:48:04 post postfix/smtp[15750]: 41F3610CA89B: to=<user@gmail.com>, relay=smtp.gmail.com[64.233.189.xxx]:587, delay=1215, delays=1213/0.02/1.1/1, dsn=2.0.0, status=sent (250 2.0.0 OK  1583063333 d14sm8712814pjz.12 - gsmtp)

status=sent (250 2.0.0 OK 1583063333 d14sm8712814pjz.12 – gsmtp)で送信に成功しています。