宛先不明などで戻ってきたリターンメールの内容を取得し、送信した宛先に再送信しないようにしたいと思っています。


メール内容の取得は、PHPのfsockopenを使って出来ています。
ヘッダーの情報を解析して、正規表現でメールアドレスを抽出し、DBなどに保存して再送信しない。
と言うのもわかるのですが、参考サイトなども見当たらず、いまいち構造が掴めません。
(空メールや自動返信に関する説明は多くあるのですが…)

参考になるサイトや処理の考え方をアドバイスしていただけないでしょうか。

ちなみに、環境はPHP5.3.5とさくらインターネットのスタンダードでテストしています。

※出来ればPHPだけで何とか出来ればと思っています。
※PHPだけで無理な場合は、回答いただかなくて結構です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/10/04 00:25:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:gaziro2000 No.1

回答回数56ベストアンサー獲得回数2

ポイント27pt

メール送信は、PHPからやりますよね?

メール送信前にDBを見て、送信NGアドレスかどうかをチェックする必要があると思います。

.

1.リターンメールの際のメールアドレスをDBに格納。(MySQLなど?)

.

2.メール送信する際に、DBに登録されているアドレスか確認をして、無ければメール送信。

.

で良いのではないでしょうか?

id:kt26

少々質問の意味を誤解されているようです。ここでの質問は「送信後」の事です。送信前ではありません。


送信先のメールアドレスが存在するか否か、mail関数で送信した時、


$flag = mail($to,$subject,$body,$headers);

if(flag==""){

送信されていない場合の処理

}


と言うような事は行っています。

ここでの質問はあくまで”受け取ったリターンメールに関する処理”方法をお尋ねしています。

送信時やDBのチェック方法ではありません。

2008/09/27 05:02:10
id:yuyam-82 No.2

回答回数1ベストアンサー獲得回数0

ポイント27pt

VERPを使われてはいかがでしょう。

id:kt26

一行回答ではなく、もう少し質問を読んで具体的に回答いただければ良かったです。

2008/09/27 08:15:40
id:tezcello No.3

回答回数460ベストアンサー獲得回数69

ポイント26pt

エラー通知メールの内容についての記述があるらしいですが...例によって分かりにくいですねぇ。

http://weio.at.infoseek.co.jp/rfc1894ej.txt


時々届く事があるので、いくつか残しておいたのを見てみると、サーバによって違うみたいですね。

ヘッダ部は

Return-Path: <>

となっているのは共通なようですね

From MAILER-DAEMON

とか、

Subject: Undelivered Mail Returned to Sender

はよく似たものが多いようです。


メールの本文は、いろいろありました。

あるものは

  • Below this line is a copy of the message.

の行があって、これ以下に配達できなかったメールのソースが(送信時のヘッダが付いた状態で)続いています。


別なのは

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では一部取り入れています)

既知のパターンでチェックしてみて、当てはまらないものは管理者宛に転送するとか、どこかに保存しておいて定期的に(人力で)作業するしかないでしょう。

この作業中に、また違ったパターンが見つかるでしょうから、都度追加していくという事になるでしょうね。

id:kt26

かなり細かく検証していただき、助かりました。ありがとうございます。


サイト運営で取り入れるなら、自サイトのサーバが発するリターンメールのパターンを解析して、正規表現でメールアドレスを抽出すれば、自動化は可能だと思います。

基本的にはそれで問題ないと思うのですが、別サーバの事も考慮しなければいけないと思い、悩んでいました。


PHPで出来ること(また出来ないこと)という点について、もう少し勉強してみます。回答ありがとうございました。

2008/09/27 17:47:45
  • id:kn1967
    エラーログみれれば一番楽なんだけどスタンダードじゃ無理なのですよね?

    既に取得まで出来ているのであれば
    ヘッダーではなくメールの本文に
    http://support.sakura.ad.jp/support/web/manual/trouble/
    # 550 User unknown / 550 Host unknown
    # 552 Message is too large ~ bytes max
    のいずれかのエラーが含まれていればエラーと判断して
    同じくメール本文に含まれているメールアドレスを抜き出す。
    (メアドを抜き出す正規表現はあちこちにあるので割愛)

    もう少し楽したいのであれば
    リターンメール専用のメールアドレスを用意して
    メール送信時に Return-Path を指定するか、
    もしくは振分ルールでリターンメール専用アドレスに転送。
    (転送であればメアドは非公開なのでReturn-Pathを用いるよりも
    外部から直接攻撃を受ける可能性が低くなる。)
    この方法ならばメールを全数検査するよりも処理が単純で済み、時間も短縮。

    といったところだと思うのだけど例題を示せないのでコメント欄で・・・。
  • id:kt26
    >エラーログみれれば一番楽なんだけどスタンダードじゃ無理なのですよね?

    エラーログを直接見て手作業で判断すれば、メールの精査は出来るでしょうが、
    あくまで”自動”で作業させたい場合です。またエラーログに対する処理を求めていません。


    質問に「リターンメールの内容を取得し~」としていますから、
    もちろん、Return-Pathで指定したメールアドレスの内容を受け取っています。


    >メアドを抜き出す正規表現はあちこちにあるので割愛

    確かにあちこち記載していますし、実際に空メール送信システムなどを作成していますが、
    受信したメールの場合、TOもFROMも明確なのでメール情報が取得しやすいですが、

    「リターンメールはサーバが吐き出すものだから、各サーバによって
     正規表現での取得方法は違うのではないか?
     どのサーバからのリターンメールも正確に解析したいので、その方法を知りたい」

    と言う点で悩んでいるので、質問した次第です。

    何か明確に「この方法だとリターンメールを解析できる」という参考サイトがあればい一番いいのですが…
  • id:kn1967
    エラーログ見れればって話は、phpでエラーログファイルを取得して
    550と552に該当するエラー行だけ抜き出すって話であって、
    目で見てパターンを探せってレベルの話じゃないですよ。
    といっても、
    スタンダードでは自動取得させる事自体が無理なので意味の無い会話ですが。

    メールサーバによって「吐き出されるヘッダーや本文に違いはあります」が
    共通する点として「メアドが本文内にある」ので
    メアドを抜き出す正規表現さえ知ってれば、あとは本文から抜き出すだけです。
    (メールがマルチパートになっている場合は
    マルチパートの各ソースが本文にあたります。)
  • id:gaziro2000
    1.送信したメールの内容が帰ってくるとありますが。
    だいたい帰ってくるのでしょうか?もし、確実に帰ってくるのであれば、
    送信メールのヘッダか何かに、独自のヘッダ
    hogehoge-soushin-adress:mail@sample.jp
    みたいなものを付けておいて、hogehoge-soushi-adress:を正規表現で探す。
    のはどうでしょうか?
    .
    2.もしくは、hogehoge-soushin-no:12345
    などとしておいて、送信したNOとメールアドレスのヒモ付けをローカルに持っておいて、
    DBからアドレスを検索する。
    .
    3.リターン先を特別なメアドにする。
    mail_sample.jp@return-domain.jp
    みたいな形で、戻ってきたメールの@より前を処理する。
    .
    ん~、sendmagicとかの配信サービスはどうやっていたかな?
    たしか、メール送信のsessiono内で、550とかのエラーって帰ってくるので、
    メール送信時の段階でエラーのフラグを付けていた気がします。
    つまり、MTAレベルで実装とか?
    何かヒントになれば幸いです。
  • id:kt26
    gaziro2000さん

    コメントありがとうございます。
    たまにポータルサイトから送られてくるメールはおっしゃるような形になっている
    事があるので、gaziro2000さんが提案してくれた方法も利用出来ると思います。

    ただ、その「設定方法」というのがわからなく、検索するにも
    どういう単語で検索して情報をさがせばいいのかわかりません。

    単に、Retun-Pathの設定に「hogehoge-soushin-adress:mail@sample.jp」
    とするわけでもないですよね?

    出来れば、具体的なやり方・記述方法を回答にて記載していただければ助かります。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません