サイトの問い合わせフォーム等に入力した内容をフィードバックでフォーム入力したユーザーに確認用の自動返信メールを送る場合、送信元アドレスを no-reply@mydomain.com として、返信不可のメールアドレスを指定したい場合はないでしょうか?
送信専用メールアドレス
要するにどういうことかというと、結局「送信専用メールアドレス」ということですね。
こちらのアドレスは送信専用です
とか、
このメールに返信しても受信できません
とかいう「アレ」です。要件で言えば、
- 送信用のアドレス
- そのアドレスに返信は、すべて
> /dev/null
に流し込むか、同等の処理をしたい
ということになります。
例としてあげてみると、問い合わせフォームに対するフィードバックとして、自動送信されるようなメールに用いるメールアドレス、と想定しています。
メールの送信元が仮に no-reply@mydomain.com
に指定されているとして、受信したユーザーが、返信したとしてもこちらには何も届かないし、そのユーザーにもレスポンスが(user unknown などのエラーも含めて)返されることが無いように設定したい、ということです。
今回は、ちょっとそのあたりの設定の煮詰めに色々調べたので、そのことをこちらでまとみたいと思います。
前置き
この内容は、前提として Postfix + Dovecot を使用して、「仮想アカウント」 を使って構成しています。
詳細は、以下の記事に書いてあります。
また、送信専用のメールアドレスとしては、先ほどの例でも示したように、
no-reply@mydomain.com
を使用したいと思います。
方法その1・・失敗
この項目の内容は、実際に設定しても機能しないので注意! |
方法その1としては、ローカルユーザーを作って、そこにメールを流し込むという形です。
参考: postfix: how do I set virtual mailbox to create null client? [closed]
まず、該当するローカルユーザー (no-reply
) を作成し、適当にパスワードを設定します。
sudo useradd -s /usr/sbin/nologin -d /dev/null no-reply
sudo passwd no-reply
次に、/etc/aliases
に次の行を追加します。
no-reply: /dev/null
これは、ローカルユーザー no-reply
宛のメッセージは、すべて /dev/null
に流し込んで亡き者にしようとしているわけです。
要するに、このユーザーに送信されてきたメールは、Postofix がまさに文字通りに
握りつぶす
わけです。
また次に、postfix の main.cf
で指定しているエイリアスマップ、$virtual_alias_maps
(上記の記事では、/etc/postfix/virtual
) を開いて次の行を追加します。
no-reply@mydomain.com no-reply
それぞれ保存したら、エイリアスマップのデータベースを更新します。
sudo newaliases
sudo postmap /etc/postfix/virtual
最後に忘れずに、Postfix を再起動しておきましょう。
sudo systemctl restart postfix
これで、メールの送信をテストしてみます。テストには、swaks
コマンド1を使います。
echo "hello world" | swaks -4 --server localhost --from hoge@anotherdomain.com -to no-reply@mydomain.com -h-subject "Test Message" --body -
すると、以下のような応答が返ってきます。
=== Trying localhost:25...
=== Connected to localhost.
<- 220 mail.mydomain.com ESMTP
-> EHLO myhost.mydomain.com
<- 250-mail.mydomain.com
<- 250-PIPELINING
<- 250-SIZE 10485760
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH CRAM-MD5 PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 SMTPUTF8
-> MAIL FROM:<hoge@anotherdomain.com>
<- 250 2.1.0 Ok
-> RCPT TO:<no-reply@mydomain.com>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Mon, 01 Feb 2021 14:08:33 +0900
-> To: no-reply@mydomain.com
-> From: hoge@anotherdomain.com
-> Subject: test Mon, 01 Feb 2021 14:08:33 +0900
-> Message-Id: <20210201140833.014333@orionis1811.rough-and-cheap.jp>
-> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
-> subject: Test Message
->
-> hello world
->
->
-> .
<- 250 2.0.0 Ok: queued as 9DCD918663A
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
内容には、SMTP サーバ (Postfix) と、SMTP クライアント (swaks) との対話になっています。で、この一連の流れを見ていただくとわかるように、エラーも発生することなくメールを受信できたことになっています。
というわけで、なんだかすんなりと出来たような気がしたのですが、no-reply 宛も送った送信主 (hoge@anotherdomain.com
) 宛に、
Undelivered Mail Returnd to Sender
というメールが送られ来てしまいました。
原因は、案の定
<no-reply@mydomain.com>: user unknown
念の為、$virtual_alias_maps
に指定しているエイリアスを、
no-reply@mydomain.com no-reply@localhost
のようにしても同様、エラーを告げるメールが返ってきます。
それもそのはず、前回でも軽く触れたとおり、「仮想アカウント」を利用したメール配信は、/etc/aliases
を参照することがないので、自ずと配信する先を見つけることができずにエラーになるのでしょう2。
実際のログを確認しても、7行目あたりで user unknown
をバウンスしているようにも見えます。
Feb 1 16:27:06 myhost postfix/smtpd[27451]: connect from localhost[127.0.0.1]
Feb 1 16:27:06 myhost postfix/smtpd[27451]: A0FD5186C38: client=localhost[127.0.0.1]
Feb 1 16:27:06 myhost postfix/cleanup[27979]: A0FD5186C38: message-id=<20210201162706.027977@myhost.mydomain.com>
Feb 1 16:27:06 myhost postfix/qmgr[7104]: A0FD5186C38: from=<hoge@anotherdomain.com>, size=541, nrcpt=2 (queue active)
Feb 1 16:27:06 myhost postfix/smtpd[27451]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
Feb 1 16:27:06 myhost postfix/local[27980]: A0FD5186C38: to=<no-reply@localhost>, orig_to=<no-reply@mydomain.com>, relay=local, delay=0.01, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to file: /dev/null)
Feb 1 16:27:06 myhost postfix/pipe[27981]: A0FD5186C38: to=<no-reply@mydomain.com>, relay=dovecot, delay=0.02, delays=0.01/0.01/0/0.01, dsn=5.1.1, status=bounced (user unknown)
Feb 1 16:27:06 myhost postfix/cleanup[27979]: A61CE186C42: message-id=<20210201072706.A61CE186C42@mail.mydomain.com>
Feb 1 16:27:06 myhost postfix/bounce[27983]: A0FD5186C38: sender non-delivery notification: A61CE186C42
Feb 1 16:27:06 myhost postfix/qmgr[7104]: A61CE186C42: from=<>, size=2531, nrcpt=1 (queue active)
Feb 1 16:27:06 myhost postfix/qmgr[7104]: A0FD5186C38: removed
Feb 1 16:27:06 myhost postfix/smtp[27984]: A61CE186C42: to=<hoge@anotherdomain.com>, relay=mail.mydomain.com[XXX.XXX.XXX.XXX]:25, delay=0.26, delays=0/0/0.2/0.05, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as DCC623808E0)
Feb 1 16:27:06 myhost postfix/qmgr[7104]: A61CE186C42: removed
方法その2・・ smtpd_recipient_restrictions
そこで、今度は別の方法で対処してみたいと思います。
どのようにするのかというと、main.cf
に新しくアクセス制御に関する設定を追加します。
参考:postfix + virtual users (db) : adding a donotreply address
私の現在の main.cf
には、次のような設定が入っています。
smtpd_client_restrictions =
permit_mynetworks,
check_client_access hash:/etc/postfix/access,
reject_unknown_client,
permit
smtpd_relay_restrictions =
permit_mynetworks,
check_recipient_access hash:/etc/postfix/access,
permit_sasl_authenticated,
permit_auth_destination,
reject
smtpd_client_restrictions
も smtpd_relay_restrictions
も、共にアクセスを制御するためのリストになっているのですが、これとは別に以下の制限を追加します。
smtpd_recipient_restrictions =
check_recipient_access hash:/etc/postfix/access,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
次に、/etc/postfix/access
に以下を追加します。
no-reply@mydomain.com DISCARD DEV-NULL
最後に、postmap
でデータベースを更新し、Postfix を再起動します。
sudo postmap /etc/postfix/access
sudo systemctl restart postfix
では、先程のテストを実行してみましょう。
$ sudo echo "hello world" | swaks -4 --server localhost --from hoge@anotherdomain.com -to no-reply@mydomain.com -h-subject "Test Message" --body -
=== Trying localhost:25...
=== Connected to localhost.
<- 220 mail.mydomain.com ESMTP
-> EHLO myhost.mydomain.com
<- 250-mail.mydomain.com
<- 250-PIPELINING
<- 250-SIZE 10485760
<- 250-VRFY
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH CRAM-MD5 PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 SMTPUTF8
-> MAIL FROM:<hoge@anotherdomain.com>
<- 250 2.1.0 Ok
-> RCPT TO:<no-reply@mydomain.com>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Fri, 29 Jan 2021 18:11:11 +0900
-> To: no-reply@mydomain.com
-> From: hoge@anotherdomain.com
-> Subject: test Fri, 29 Jan 2021 18:11:11 +0900
-> Message-Id: <20210129181111.017986@myhost.mydomain.com>
-> X-Mailer: swaks v20170101.0 jetmore.org/john/code/swaks/
-> subject: Test Message
->
-> hello world
->
->
-> .
<- 250 2.0.0 Ok: queued as A4B41182AA6
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
この時、メールログ(/var/log/mail.log
) を確認すると次のように確認できると思います。
Jan 29 18:11:11 orionis1811 postfix/smtpd[17561]: connect from localhost[127.0.0.1]
Jan 29 18:11:11 orionis1811 postfix/smtpd[17561]: NOQUEUE: discard: RCPT from localhost[127.0.0.1]: <no-reply@mydomain.com>: Recipient address DEV-NULL; from=<hoge@anotherdomain.com> to=<no-reply@mydomain.com> proto=ESMTP helo=<myhost.mydomain.com>
Jan 29 18:11:11 orionis1811 postfix/smtpd[17561]: A4B41182AA6: client=localhost[127.0.0.1]
Jan 29 18:11:11 orionis1811 postfix/smtpd[17561]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
ちょうど2行目に、... discard: ... Recipient address DEV-NULL;
とログが記録されていて、送信したメールが確かに DISCARD されているのがわかります。
まとめ
このような感じで、no-reply@mydomain.com
宛のメッセージを、どこにも配送せずにもみ消すことができるようになりました。ひとまず、送信専用で、受信してもどこにも配送されないメールの実装はできた、としても良いと思います。
しかし、ここで色々疑問の湧いてくる、smtpd_client_restrictions
、smtpd_relay_restrictions
、そして smtpd_recipient_restrictions
とはいったい何なのか、ということなんですが、これはこれで結構深い話になるので、次回に回したいと思います。
0件のコメント