メール内容の取得は、PHPのfsockopenを使って出来ています。
ヘッダーの情報を解析して、正規表現でメールアドレスを抽出し、DBなどに保存して再送信しない。
と言うのもわかるのですが、参考サイトなども見当たらず、いまいち構造が掴めません。
(空メールや自動返信に関する説明は多くあるのですが…)
参考になるサイトや処理の考え方をアドバイスしていただけないでしょうか。
ちなみに、環境はPHP5.3.5とさくらインターネットのスタンダードでテストしています。
※出来ればPHPだけで何とか出来ればと思っています。
※PHPだけで無理な場合は、回答いただかなくて結構です。
メール送信は、PHPからやりますよね?
メール送信前にDBを見て、送信NGアドレスかどうかをチェックする必要があると思います。
.
1.リターンメールの際のメールアドレスをDBに格納。(MySQLなど?)
.
2.メール送信する際に、DBに登録されているアドレスか確認をして、無ければメール送信。
.
で良いのではないでしょうか?
エラー通知メールの内容についての記述があるらしいですが...例によって分かりにくいですねぇ。
http://weio.at.infoseek.co.jp/rfc1894ej.txt
時々届く事があるので、いくつか残しておいたのを見てみると、サーバによって違うみたいですね。
ヘッダ部は
Return-Path: <>
となっているのは共通なようですね
From MAILER-DAEMON
とか、
Subject: Undelivered Mail Returned to Sender
はよく似たものが多いようです。
メールの本文は、いろいろありました。
あるものは
の行があって、これ以下に配達できなかったメールのソースが(送信時のヘッダが付いた状態で)続いています。
別なのは
The Postfix program
<*****@********>: host ********[***.***.***.***] said:
550 Invalid recipient: <*****@********> (in reply to RCPT TO
command)
のような相手サーバからのステータスがあって、マルチパートで
Content-Description: Undelivered Message
Content-Type: message/rfc822
というヘッダに続いて
送信しようとしたメールのソースがあります。
相手サーバからのステータスなので、いろんなのがありそうです。
The Postfix program
<*****@********>: host ******[***.***.***.***] said: 550
<*****@********>: User unknown (in reply to RCPT TO command)
こんなのもありました。
単なる文字列のチェックですから、PHPで可能です。(自作のMLでは一部取り入れています)
既知のパターンでチェックしてみて、当てはまらないものは管理者宛に転送するとか、どこかに保存しておいて定期的に(人力で)作業するしかないでしょう。
この作業中に、また違ったパターンが見つかるでしょうから、都度追加していくという事になるでしょうね。
かなり細かく検証していただき、助かりました。ありがとうございます。
サイト運営で取り入れるなら、自サイトのサーバが発するリターンメールのパターンを解析して、正規表現でメールアドレスを抽出すれば、自動化は可能だと思います。
基本的にはそれで問題ないと思うのですが、別サーバの事も考慮しなければいけないと思い、悩んでいました。
PHPで出来ること(また出来ないこと)という点について、もう少し勉強してみます。回答ありがとうございました。
少々質問の意味を誤解されているようです。ここでの質問は「送信後」の事です。送信前ではありません。
送信先のメールアドレスが存在するか否か、mail関数で送信した時、
$flag = mail($to,$subject,$body,$headers);
if(flag==""){
送信されていない場合の処理
}
と言うような事は行っています。
ここでの質問はあくまで”受け取ったリターンメールに関する処理”方法をお尋ねしています。
送信時やDBのチェック方法ではありません。