前書き
プロバイダでOB25対策が始まり既に15年以上経過していますが、2年ほど前に私の使用しているプロバイダでOB25対策と共に用意されたSMTP-AUTH対応SUBMISSIONポートのメールサーバで「SMTP-AUTHで認証したプロバイダのメールアドレス以外をMAIL FROM:に指定するとメールのリレーを拒否」すると言う新たな対策がサイレント導入されました。
普通(?)に使っている分には問題はありませんが、独自ドメインを取得してdynamic dnsを使いメールサーバ(qmail)を運用していると内部から独自ドメイン名でメールを送信する事が出来なくなってしまいます。
最近、qmailを弄っていてそういえばこの手の情報は見たことがないのでニッチであるとは思いますが、smtp-auth対応パッチを当てたqmailのRCPT TO:で常に「smtproutesに指定したメールアドレス」を使うようにする為のqmail-remote.cの変更箇所を共有したいと思います。
前提条件
独自ドメインでqmailサーバを運用していて以下パッチが当たっている事
- qmail-smtpd-auth-0.31.tar.gz
- qmail-smtpd-auth-close3.patch
- qmail-remote-auth.patch
以下の様に smtproutes でプロバイダのメールサーバへメール配信を依頼していて尚且つクライアントとしてメールアドレスでsmtp-authしている事
touch /var/qmail/control/smtproutes
chown qmailr.root /var/qmail/control/smtproutes
chmod 640 /var/qmail/control/smtproutes
cat > /var/qmail/control/smtproutes << EOF
:プロバイダのメールサーバFQDN:587 プロバイダのメールアドレス プロバイダのメールパスワード
EOF
プロバイダのメールサーバに前書きと同様の対策がされているかの確認方法
# SMTP AUTH文字列を作成
printf "%s\0%s\0%s" プロバイダのメールアドレス プロバイダのメールアドレス メールパスワード | openssl base64 -e | tr -d '\n'; echo
# 以下の様なbase64化されたSMTP AUTH文字列が表示されるので、表示された文字をコピーしておく
Zm9vQGV4YW1wbGUuY29tAGZvb0BleGFtcGxlLmNvbQBwYXNzd29yZA==
# 暗号化必須の場合の接続方法
openssl s_client -quiet -ign_eof -connect プロバイダのメールサーバ:ポート番号 -tls1_2
# 平文でいい場合の接続方法
telnet プロバイダのメールサーバ ポート番号
接続出来ると大体以下の様な表示がされるので、グレーの部分のみ入力(サーバによって表示内容は微妙に違います)
Trying メールサーバのIPアドレス...
Connected to メールサーバ名
Escape character is '^]'.
220 メールサーバ名 ESMTP Service ready
EHLO localhost
250-メールサーバ名
250-DSN
250-8BITMIME
250-PIPELINING
250-AUTH=LOGIN
250-AUTH LOGIN CRAM-MD5 PLAIN
250 SIZE 20971520
AUTH PLAIN 予め作成したSMTP AUTH文字列
235 PLAIN authentication successful
MAIL FROM:foo@example.com
… MAIL FROMがSMTP-AUTHしたアドレスと異なると受け付けを拒否される
553 MAIL FROM:foo@example.com does not match authenticated user name
MAIL FROM:プロバイダのメールアカウント
… MAIL FROMがSMTP AUTHのユーザ名と同じ場合は受け付けられる
250 MAIL FROM:<プロバイダのメールアカウント> OK
QUIT
qmailの変更箇所
受け付けられない場合は、SMTP-AUTHしたメールアドレスをMAIL FROM:に指定するようにqmail-remote.cの264行目付近 を変更。(コメントアウトされているのは変更前のコード)
substdio_put(&smtpto,auth_smtp_user,auth_smtp_user.len); // substdio_put(&smtpto,sender.s,sender.len);
後はいつも通り(必要に応じてqmailを止めるなどしてください)
make setup check