Azure VM上のUbuntuからメールが送信できない件を解決する

Azure VM上にUbuntu 18.04 LTS環境を構築し、Postfixでメールを送信することを試みます。
例えば、rootへのメールをすべてGmailに転送しようとすると、Gmailにメールは到着せず、/var/log/mail.logを見ると、このようなログが出ています。

Jun 27 14:17:01 srv01 postfix/smtp[128130]: connect to alt1.gmail-smtp-in.l.google.com[74.125.127.27]:25: Connection timed out
Jun 27 14:17:01 srv01 postfix/smtp[128130]: connect to alt2.gmail-smtp-in.l.google.com[2607:f8b0:4001:c0d::1a]:25: Network is unreachable
Jun 27 14:17:02 srv01 postfix/smtp[128130]: C3843BED47: to=<[email protected]>, orig_to=<[email protected]>, relay=none, delay=344887, delays=344827/0.01/60/0, dsn=4.4.1, status=deferred (connect to alt2.gmail-smtp-in.l.google.com[2607:f8b0:4001:c0d::1a]:25: Network is unreachable)

これはGmail宛てに限ったことではなく、いろいろな宛先で同じエラーになります。

原因はAzure VMの制約

調べてみると、原因はAzure VMに特有のもののようなのです。

2017 年 11 月 15 日以降、外部ドメイン (outlook.com や gmail.com など) に直接送信される仮想マシン (VM) からのアウトバウンド メール メッセージは、Microsoft Azure の特定のサブスクリプションの種類でのみ使用できます。 TCP ポート 25 を使用するアウトバウンド SMTP 接続はブロックされました (ポート 25 は主に、認証されていないメール配信で使用されます)。

で、どうすれば良いか?というと、Microsoftから許可を得るという方法もあるようですが、推奨はSendGridなどのSMTPリレーサービスを使うこと。

SendGridのFreeプランを使う

SendGridはこちら。

日本では構造計画研究所が代理店としているようですが、海外のサービスに直接で問題ありません。無料のFreeプランでは、最初の30日間は40,000件、その後は100件/日の送信が可能です。私の場合、1日に100通送信できれば問題ないので、Freeプランで充分です。

SendGridにログインできたら、Setup Guideにある「Integrate using our Web API or SMTP relay」を選択し、SMTP relayの設定を行います。

適当なAPIKEY名を入力し、Create Keyボタンをクリックすると、APIキーが発行されます。

Postfixの設定

/etc/postfix/main.cfにこのように追記します。

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_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587

/etc/postfix/sasl_passwdを作成し、このようにします。

[smtp.sendgrid.net]:587 apikey:発行されたAPIキー

作成したsasl_passwdの権限の変更とハッシュテーブルの作成を行います。

chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

後は、Postfixを再起動します。

SendGridで送信元ドメインを認証する

ここまでの設定でUbuntuサーバのPostfixを介したメール送信はSendGridにリレーされるようになりますが、このままではまだエラーになってしまいます。それは、リレーされたメールの送信元が認証されていないからです。

そこで、SendGridのSender Authentication画面から、送信元ドメインの認証を行います。下図は既に認証済みの状態ですが、送信元となるドメインを登録し、表示されるCAMEの設定をDNSサーバに行えば、認証されます。

また、メールアドレス毎の認証を行うことも可能です。

これでAzure VM上から外部にメール送信できるようになりました。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。