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 サーバを利用しているという情報があったため、この方法でいくことにする。
以下などを参考にさせてもらう。
以下のような設定を行った。(上に書かれていないことや違うこともある)
だが、不要だったかもしれない。後述。
これは、試行錯誤していたときの /var/log/maillog に、以下の URL が書かれており、そこから知った。
なお、二段階認証を有効にしないと、アプリパスワードを生成できない (メニューが出てこない)。
最初、既存の Google アカウントにアプリパスワードを設定して、動くことを確かめた後 (後述)、次に 新規アカウントの作成を Android から実行した際に、このアカウントについて Android からアプリパスワードの生成も行った。
以下で示す差分を追記した。 (以下に示すように /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 には詳細なログが出るので、それを見ながら試行錯誤した。
以下のような内容のファイルを作成し、所有者は root で、且つ root 以外からは読めないように chmod しておく。
[smtp.gmail.com]:587 Googleアカウント@gmail.com:アプリパスワード
ここには、前述の「アプリパスワード」を記述する。 通常の Google アカウントのパスワードではダメで、アプリパスワードを設定したらいけるようになった。
/etc/postfix にて実行し、sasl_passwd.db が生成される。
これは必要なのかどうか定かではないが実行しておいた。
メールが受信されたら成功。
先ほどの参考ページでは cyrus-sasl が必要と読めるし、試行錯誤する途中で cyrus-sasl もインストールしていた。
しかし、自分は cyrus-sasl は必要だったのか疑問に思えてきたため、メール送信に成功した後、cyrus-sasl をアンインストールして、sasl_passwd.db も再生成し (関係あるか? 同一のファイルが生成されたことを確認した)、postfix を再起動したり、その後 reboot もしてみたが、メール送信は成功する。
もしかしたら、たとえ cyrus-sasl をアンインストールしても、一部の設定が残っていて (/etc/passwd のエントリとか?)、そのためにうまくいっている可能性もあるが、定かではない。
もう一度 OS からクリーンインストールすればはっきりしそうだが..