PHPのmb_send_mailでメール送信をしています。


送信が成功すればDB(MySQL)に送信先の情報を保存し、失敗しても「送信出来なかった」という情報を保存出来ればと思います。

有効でないメールアドレスにメール送信を行った場合、エラーメールが返ってきますが、そのエラーメールを解析(メールサーバを解析する?)し、DBに保存するしか方法はないのでしょうか?

出来ればPHPだけの対応で「メールが送れた/送れなかった」が判別出来ればと思います。

完璧でなくても結構ですので、「このような方法は使える」というのがありましたら、教えて下さい。PHPは5.2.0を使っています。

回答の条件
  • 1人2回まで
  • 登録:2007/12/22 20:04:07
  • 終了:2007/12/24 02:12:02

回答(2件)

id:ttomo No.1

ttomo回答回数16ベストアンサー獲得回数02007/12/22 21:24:49

ポイント35pt

PHPの中で、相手先MTAを探してそこに送る方法をとればある程度のエラーはオンラインで吸収できます。

ただ画面応答を返すのはその分遅くなってしまいますが…。

方法としては、通常のWebアプリであれば

  1. デフォルトのメールサーバの25/tcpに接続して
  2. From/Toを送信してメールを送る

というプログラムにして、デフォルトのメールサーバより先(受信者側)への送信はメールサーバに任せてしまいます。

この実装であれば、メールアドレスの誤り(「@」の左の誤り・右の誤り)はほとんどオンラインのWebアプリで知ることはできません。

これを

  1. メールアドレスの「@」より右をキーにしてDNSのMXレコードを引き
  2. メールサーバが得られなければエラーとする[エラー1]
  3. メールサーバが得られればそのサーバの25/tcpに接続して
  4. From/Toを送信してメールを送る。その時メールサーバからエラーが返ることがある[エラー2]

という風に変更すると、一定範囲のエラーはオンラインWebアプリで拾うことができます。

つまり@の右側を間違えて taro@hattena.ne.jp などとしたときはエラー1になりますし、

@の左側を間違えてttaro@hatena.ne.jp などとしたときはエラー2になることがあります。

どちらの場合も偶然他人に一致した時はエラーになりませんし、

@の左側の間違いについてはあえてエラーとしない(黙って無視する)設定になっているメールサーバも存在しますので完璧ではありません。

企業などでは、MXレコードで公開しているサーバでいったん黙って受け取って、さらに社内のメールサーバにリレーしている場合もありますので、その場合もオンラインWebアプリではエラーを検出することはできません。


環境的に、PHPが稼働しているサーバがグローバルのDNSを引ける、かつ、任意のメールサーバにconnectできる環境なら使えると思います。

頑張ってください。

id:kt26

回答ありがとうございます。

つまり「サーバをいじらないと駄目・サーバの知識が必要」と言うことですね。

本質問の求めていた回答と異なりますが、考え方・意味としては理解出来ます。ありがとうございました。

2007/12/22 21:49:45
id:tezcello No.2

tezcello回答回数460ベストアンサー獲得回数692007/12/23 23:51:36

ポイント35pt

「メールを送った」と「メールが届いた」とは違います。

PHP の mail(), mb_send_mail() では、届いたかどうかまでは関知しないのでは?

(多分設定されているMUAにパラメータを渡す事が出来たかどうかが返り値として得られると思います)


それをする為には、PHP で MUA を作る(=最初の回答者さんの考え方)の他にも、

  • エラーメールの返り先を定期的にチェックする
  • 自サバなら、.forward でキックするような別プログラムを仕込む

の方法が考えられると思います。

id:kt26

そうですね。とりあえず、DBに保存するのは「送った先」としたいと思います。

もう一歩上の仕様にする時は、メールサーバも勉強します。


回答ありがとうございました。

2007/12/24 02:11:48

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません