おそらく、この世にメルマガ配信システムはたくさんあるので、この方法は
広く使われていると思うのだが、いくら検索しても具体的に説明されてるサイトが
ないので、忘れないようにメモ。
(環境:fedora9、postfix2.23以降、perl5.8.X)
まず、VERPを利用するので、sendmailを使う場合はパス指定時に、
sendmail -XV -f bounce
と指定。
※postfixのバージョンが2.2以前の場合は -XV じゃなく -V 。
※bounceの部分は別にhogeでも何でもよい。
※sendmailを使わない場合(SMTPに直接送るときとか)は、別にVERPを使わなくても、
エンベロープMailFromに
"バウンスを受けたい架空のアカウント"+"送信先のアカウント"="送信先ドメイン"@"自ドメイン"の形で指定できればOK。
次に、/etc/postfix/main.cf に以下を追記
recipient_delimiter = +
propagate_unmatched_extensions = canonical, virtual
※1行目は、送られてくるバウンスメールの宛先アドレスは、「+」で区切りますよ、とpostfixに教えている。
※2行目は、デリミタ以降(extensions)は、エイリアスに展開する際、無視しますよということをpostfixに教えている。
※これらの変数や定義値は、postfixのデフォルトなので、変更していればそれに合わせてください。
次に、バウンスメール処理用のプログラムをperlで作成。(ここでは/home/owner/に設置)
例:process_bounce.cgi(705 or 755)
#!/usr/bin/perl -w
my ($bouncetxt, $deadadd);
while(<>){ #バウンスメールのヘッダ及び本文を標準入力から取得
#最初に出てきたTo行から不逹の宛先を取得
if ($_ =~ /^To: bounce\+(.+?)\=(.+?)\@mydomain.jp\n$/){
$deadadd = $1."@".$2;
last;
}
}
#
#
#このあたりで、mysqlに接続するなどして、不逹アドレスを削除する処理
#
#
#
exit;
※これは別にperlじゃなくても、CでもJavaでもshellでもなんでもいい。
※ポイントは標準入力からメール内容を受け取れるということ。
次に、/etc/aliases (OSやpostfixのヴァージョンによっては、 /etc/postfix/aliases とか)に以下を追記。
bounce: |/home/owner/process_bounce.cgi
※エイリアスで、さっき書いたメール内容を処理するプログラムのコマンド(場所)をパイプで指定する。
※もし、セキュリティ上smrshなどの影響で、コマンドを渡せない場合は、コマンドラインから
# cd /etc/smrsh
# ln -s /home/owner/process_bounce.cgi process_bounce.cgi
などと打って対処する。
最後にエイリアスデータベースを初期化&postfix再起動
# newaliases
# /etc/init.d/postfix restart
これで、リターンメールやバウンスメールを受信する度にスクリプトが起動して、
死にアドレスを自動でデータベースから削除してくれるので、次回送信時から無駄な
送信負荷がなくなる。
ここでちょっと気になるのが、パイプでコマンドに渡されたメールキューは
どこにいくのかということだが、maillogを確認したところ、コマンドに渡した直後に
勝手にremoveされていたので一安心。
/var/spool/postfix をのぞいてみたらちゃんと削除されていた。
また、ホスト名が解決できない場合のバウンス(host not found)はすぐに返ってくるので、メルマガ送信後すぐに削除処理されるが、実在するホストの場合、アカウントが存在しなくてもホストのMTAによっては送信リトライを繰り返すような場合がある。
この場合、deferedフォルダにキューが溜まってしまうが、いずれアカウントが見つからない
といったバウンスが返ってくるので、24時間後とかに処理さる場合もあると思う。
(まだ未確認)
また、当たり前だが、相手先のMTAがアカウント不明の受信メールはすべて破棄し、バウンスを返さない設定になっていればこの方法は使えない。
広く使われていると思うのだが、いくら検索しても具体的に説明されてるサイトが
ないので、忘れないようにメモ。
(環境:fedora9、postfix2.23以降、perl5.8.X)
まず、VERPを利用するので、sendmailを使う場合はパス指定時に、
sendmail -XV -f bounce
と指定。
※postfixのバージョンが2.2以前の場合は -XV じゃなく -V 。
※bounceの部分は別にhogeでも何でもよい。
※sendmailを使わない場合(SMTPに直接送るときとか)は、別にVERPを使わなくても、
エンベロープMailFromに
"バウンスを受けたい架空のアカウント"+"送信先のアカウント"="送信先ドメイン"@"自ドメイン"の形で指定できればOK。
次に、/etc/postfix/main.cf に以下を追記
recipient_delimiter = +
propagate_unmatched_extensions = canonical, virtual
※1行目は、送られてくるバウンスメールの宛先アドレスは、「+」で区切りますよ、とpostfixに教えている。
※2行目は、デリミタ以降(extensions)は、エイリアスに展開する際、無視しますよということをpostfixに教えている。
※これらの変数や定義値は、postfixのデフォルトなので、変更していればそれに合わせてください。
次に、バウンスメール処理用のプログラムをperlで作成。(ここでは/home/owner/に設置)
例:process_bounce.cgi(705 or 755)
#!/usr/bin/perl -w
my ($bouncetxt, $deadadd);
while(<>){ #バウンスメールのヘッダ及び本文を標準入力から取得
#最初に出てきたTo行から不逹の宛先を取得
if ($_ =~ /^To: bounce\+(.+?)\=(.+?)\@mydomain.jp\n$/){
$deadadd = $1."@".$2;
last;
}
}
#
#
#このあたりで、mysqlに接続するなどして、不逹アドレスを削除する処理
#
#
#
exit;
※これは別にperlじゃなくても、CでもJavaでもshellでもなんでもいい。
※ポイントは標準入力からメール内容を受け取れるということ。
次に、/etc/aliases (OSやpostfixのヴァージョンによっては、 /etc/postfix/aliases とか)に以下を追記。
bounce: |/home/owner/process_bounce.cgi
※エイリアスで、さっき書いたメール内容を処理するプログラムのコマンド(場所)をパイプで指定する。
※もし、セキュリティ上smrshなどの影響で、コマンドを渡せない場合は、コマンドラインから
# cd /etc/smrsh
# ln -s /home/owner/process_bounce.cgi process_bounce.cgi
などと打って対処する。
最後にエイリアスデータベースを初期化&postfix再起動
# newaliases
# /etc/init.d/postfix restart
これで、リターンメールやバウンスメールを受信する度にスクリプトが起動して、
死にアドレスを自動でデータベースから削除してくれるので、次回送信時から無駄な
送信負荷がなくなる。
ここでちょっと気になるのが、パイプでコマンドに渡されたメールキューは
どこにいくのかということだが、maillogを確認したところ、コマンドに渡した直後に
勝手にremoveされていたので一安心。
/var/spool/postfix をのぞいてみたらちゃんと削除されていた。
また、ホスト名が解決できない場合のバウンス(host not found)はすぐに返ってくるので、メルマガ送信後すぐに削除処理されるが、実在するホストの場合、アカウントが存在しなくてもホストのMTAによっては送信リトライを繰り返すような場合がある。
この場合、deferedフォルダにキューが溜まってしまうが、いずれアカウントが見つからない
といったバウンスが返ってくるので、24時間後とかに処理さる場合もあると思う。
(まだ未確認)
また、当たり前だが、相手先のMTAがアカウント不明の受信メールはすべて破棄し、バウンスを返さない設定になっていればこの方法は使えない。

コメントする