伊藤清徳の垂直落下式ムーンサルトプレス

PerlとかPHPとかMySQLとか...がんばっても8割だ。

知らんうちにスパム配信サーバ扱いにならないために

オンラインCRMを開発していると、
顧客をセグメントして、メール配信なんていうことは結構行われます。
僕の場合、PHPを使って配信することが多いです。
 
数通のメールならいいですが、何百通・何千通のメールを定期送信していると、
大抵、アカウントがなくなったなどの問題で、エラーメールが返って来ます。
こういったメールアドレスに対して、繰り返しメールを送っていると、
そのうち、送信元のサーバーは「スパムメールを送っている」と判定されかねないので、
エラーが返ったメールアドレスに対しては適切に
次回以降送信しないなどの対応が必要です。
 
多くのメールマガジン送信スタンドはそういった機能をもっていますが、
自分でその機能をつくるにはどうしたらいいでしょうか。
という話です。
 
PHPでqdmail(SMTP送信)を利用して送信した場合を想定して書いていきます。


 
何も設定せずにメールを送信する場合、
エラーメールは大抵の場合、
送信メールサーバー、あるいは受信メールサーバーのどちらかのpostmasterアカウントから
「エラーが有りました」という旨のメールが返信されます。

どのメールアドレスに対してエラーがあったのかなどは、
本文中に書かれていることが多いです。
 
正規表現をつかって、本文中のメールアドレスを抜き出すなどすれば
いいかと思うかもしれませんが、
こちらのとおり(Perlの例ですが)
メールアドレスを正規表現で正しく抜き出すというのは、
非常に骨の折れる話です。
 


送信メールサーバーにPostfixが利用されているサーバーなら、
こういった問題を比較的簡単に処理してくれる機能があります。
VERPという機能です。
こちらが簡単な説明書です。
 


仕組みの概要は
 
not_exists@sample.com(送信先メアド、存在しない)
return@sample.com(エラーリターン先メアド、Return-Pathで指定)
 
という条件でメールを送った場合、

return+not_exists=sample.com@sample.com

にバウンスメール(エラーメール)が送信されます。
return@sample.comに対して
ちょうど「Gmail エイリアス」のような形式で送信をしてくれるのです。
(エラーがあったメールアドレスの「@」は「=」に変換されます)
 
この形式で送信してくれれば、
メールトリガーで何かのスクリプトを起動して
「To」をパースすれば、どのメールアドレスにエラーがあったのか、
簡単に計算出来るという仕組みです。
 
これは便利です。


qdmailでの送信の仕方はこちらを参考にしました。
ありがとうございます。

require_once('qdsmtp.php');

$param = array(
'host'=>'smtp.example.com',
'port'=> 25 ,
'from'=>'<from@example.com> XVERP',
'protocol'=>'SMTP',
);
$smtp = new QdSmtp($param);

SMTP接続の際に設定するFROMメールアドレスが、
Return-Pathになるので、
そのメールアドレスに対して「XVERP」オプションを指定すれば、
基本的には動きます。
(SMTP認証が必要な場合は、オプション値が異なるので、
 くわしくはqdmailの設定を見てください)


 
動かない時の注意点が2つ。
 


【その1】
/etc/postfix/mail.cfに設定を追加する

smtpd_authorized_verp_clients = $mynetworks

を追加しなければ動きません。
実質的には、この設定がVERPでのバウンス処理のスイッチになっているようです。
デフォルト値は「no」になっている環境が多いようです。


【その2】
PHP実行環境(つまり送信元クライアント)とSMTPサーバーが
別PC・サーバーの場合
 
この場合、まず1つに、SMTPは認証が必要になる場合が多く、
最近の場合、SMTP認証を行う場合は、
接続ポートがサブミッションポート「587」でないといけないことがあります。
まずは、そちらを確認します。
 
その上で、
/etc/postfix/mail.cf
にさらに設定を加えなければなりません。
 
通常の場合$mynetworksという変数には
「127.0.0.1」つまりローカルのみが指定されます。
その1の設定を見ると、
 

smtpd_authorized_verp_clients = $mynetworks

 
VERPが許可されるクライアントは「$mynetworks」だけですよ。
という設定なので、
つまり、ローカルからの接続のみが許可されていることになります。
 
$mynetworksに接続元を追加してやらなければいけません。
こちらを書くと長くなってしまうので、説明については
この辺りをご参考に。


最近はCMSなどにメール配信機能がついていたりして、
非常に便利ですが、
知らず知らずのうちにスパム配信サーバーとなっていることのないように、
こういった対応はおこなっておくべきでしょう。

1 Comment

  1. Buy nfl jerseys cheap from china, Wholesale replica NFL Jerseys at cheap price with free shipping,good customer service and 100% product guarantee.

コメントを残す

Your email address will not be published.

*