サイトの問い合わせフォーム等に入力した内容をフィードバックでフォーム入力したユーザーに確認用の自動返信メールを送る場合、送信元アドレスを 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_restrictionssmtpd_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_restrictionssmtpd_relay_restrictions、そして smtpd_recipient_restrictions とはいったい何なのか、ということなんですが、これはこれで結構深い話になるので、次回に回したいと思います。

 

 

 


  1. Swiss Army Knife for SMTP の略 

  2. 実際には、Postfix にはメール配送に Dovecot を使用するように設定しているので、Postfix で受信は完了したけれど、Dovecot で配送する際にエラーになった、という考えでいいのかな? 


 

 
カテゴリー: postfix

zaturendo

中小企業社内SE。

0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です