Postfix で Gmail の SMTP サーバを利用してメール送信する覚書
(NetBSD / Raspberry Pi)

2021-04-29

● 概略

会社に実験用に置いてあるルータ (の先につながっているインターネット回線) からメール送信しようとすると、そのままではうまくいかず、原因は ISP の OP25B によるメール送信のブロックであると推察されたため、代わりに Gmail の SMTP サーバを利用することによりメール送信することにした。 (ISP が SMTP サーバを用意しているかもしれないが都合により情報がなかった)

なお環境としては、ハードウェアは Raspberry Pi 1 (Model B) であり、OS は NetBSD (earmv6hf) 9.1 である (MTA は Postfix)。
OS に NetBSD を採用することにより、(余剰が豊富にある) わずか 2GB の (micro)SD カードによる運用を可能としている。 余談だが、このままの構成で GUI (X11) も起動可能である。
純正の Raspberry Pi OS だと 2GB ではとてもインストールできないはずである。

● 詳細

固定 IP アドレスに繋がっている、別の環境 (CentOS7) からメール送信するときは、単に標準の設定のまま (Postfix)、送信成功していた。

x123456@abc-xyz:~$ sendmail -t
To: 〜@〜.〜.〜
Subject: test2

test2
.

ところが、これを会社の居室のルータに繋いだ Raspberry Pi から行うと、送信したはずのメールが受信されなかった。

nbsdrpi$ sendmail -t
To: 〜@〜.〜.〜
Subject: test

test
.

このとき、/var/log/maillog には、以下のように出たりする。

〜
Feb 22 14:39:13 nbsdrpi postfix/pickup[7137]: 824E22484D: uid=1039 from=<nsmrtks>
Feb 22 14:39:13 nbsdrpi postfix/cleanup[22722]: 824E22484D: message-id=<20210222053912.824E22484D@nbsdrpi.localdomain>
Feb 22 14:39:15 nbsdrpi postfix/qmgr[12505]: 824E22484D: from=<nsmrtks@nbsdrpi.localdomain>, size=316, nrcpt=1 (queue active)
Feb 22 14:39:46 nbsdrpi postfix/smtp[3273]: connect to 〜-〜-〜.mail.protection.outlook.com[〜.〜.〜.〜]:25: Connection timed out
Feb 22 14:40:16 nbsdrpi postfix/smtp[3273]: connect to 〜-〜-〜.mail.protection.outlook.com[〜.〜.〜.〜]:25: Connection timed out
Feb 22 14:40:17 nbsdrpi postfix/smtp[3273]: 824E22484D: to=<〜@〜.〜.〜>, relay=none, delay=80, delays=19/0.13/61/0,
 dsn=4.4.1, status=deferred (connect to 〜-〜-〜.mail.protection.outlook.com[〜.〜.〜.〜]:25: Connection timed out)   

色々試したが、どうも ISP の OP25B によりブロックされているのではないかと思い至った。

OP25B については (会社の居室の回線は OCN ではないようだが) 以下などを参考。

OP25B(メール送信規制)(OCN迷惑メール対策) | NTTコミュニケーションズ 個人のお客さま

その後も、TLS を設定すればうまくいくのではないかとか、色々と試したが、上の参考情報も見て考えるに、普通の方法でこれを回避する方法は無さそうに思えた。 (そもそも、回避できれば迷惑メールに悪用されてしまい意味を無くすだろう。)

本筋の回避方法としては、ISP が用意しているであろう SMTP サーバを利用することだろうが、その情報が分かっていないということもあり、先行例で Gmail の SMTP サーバを利用しているという情報があったため、この方法でいくことにする。

◎ 設定

以下などを参考にさせてもらう。

Postfix で、Gmail にメールをリレーする - 私の二次記憶
Postfixの送信メールに、Gmailを使う | WEB系SEの大学ノート

以下のような設定を行った。(上に書かれていないことや違うこともある)

・ cyrus-sasl をインストールする。

だが、不要だったかもしれない。後述。

・ Google で、二段階認証を有効にし、「アプリパスワード」を生成する。

これは、試行錯誤していたときの /var/log/maillog に、以下の URL が書かれており、そこから知った。

https://support.google.com/mail/?p=BadCredentials
PC からでも、あるいは Android スマートフォンからでも実行可能である。

なお、二段階認証を有効にしないと、アプリパスワードを生成できない (メニューが出てこない)。

最初、既存の Google アカウントにアプリパスワードを設定して、動くことを確かめた後 (後述)、次に 新規アカウントの作成を Android から実行した際に、このアカウントについて Android からアプリパスワードの生成も行った。

・ /etc/postfix/main.cf の設定。

以下で示す差分を追記した。 (以下に示すように /usr/share/examples/postfix/ にも情報がある)

--- main.cf.ORG 2020-10-19 11:25:47.803973508 +0900
+++ main.cf     2021-02-18 16:11:26.168828487 +0900
@@ -344,6 +344,21 @@
 #relayhost = uucphost
 #relayhost = [an.ip.add.ress]

+# 2021-02-18 nsmrtks
+# https://ayokoyama.hatenadiary.org/entry/20061207/p1
+# /usr/share/examples/postfix/TLS_LEGACY_README
+# /usr/share/examples/postfix/SASL_README
+#
+relayhost = [smtp.gmail.com]:587
+#
+smtp_use_tls = yes
+#
+smtp_sasl_auth_enable = yes
+smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
+smtp_sasl_tls_security_options = noanonymous
+#
+#debug_peer_list = smtp.gmail.com
+
 # REJECTING UNKNOWN RELAY USERS
 #
 # The relay_recipient_maps parameter specifies optional lookup tables

なお、コメントアウトしている debug_peer_list = smtp.gmail.com を有効にすると、/var/log/maillog には詳細なログが出るので、それを見ながら試行錯誤した。

・ /etc/postfix/sasl_passwd の作成

以下のような内容のファイルを作成し、所有者は root で、且つ root 以外からは読めないように chmod しておく。

[smtp.gmail.com]:587    Googleアカウント@gmail.com:アプリパスワード

ここには、前述の「アプリパスワード」を記述する。 通常の Google アカウントのパスワードではダメで、アプリパスワードを設定したらいけるようになった。

・ sudo postmap sasl_passwd の実行。

/etc/postfix にて実行し、sasl_passwd.db が生成される。

・ sudo service postfix restart

これは必要なのかどうか定かではないが実行しておいた。

・ sendmail -t で確認。

メールが受信されたら成功。

◎ cyrus-sasl は必要だったのか?

先ほどの参考ページでは cyrus-sasl が必要と読めるし、試行錯誤する途中で cyrus-sasl もインストールしていた。

しかし、自分は cyrus-sasl は必要だったのか疑問に思えてきたため、メール送信に成功した後、cyrus-sasl をアンインストールして、sasl_passwd.db も再生成し (関係あるか? 同一のファイルが生成されたことを確認した)、postfix を再起動したり、その後 reboot もしてみたが、メール送信は成功する。

もしかしたら、たとえ cyrus-sasl をアンインストールしても、一部の設定が残っていて (/etc/passwd のエントリとか?)、そのためにうまくいっている可能性もあるが、定かではない。

もう一度 OS からクリーンインストールすればはっきりしそうだが..

以上


index