[PHP-users 32445] Re: mail 関数について
KKuji_Y2a
kkuji @ mwb.biglobe.ne.jp
2007年 7月 16日 (月) 16:24:57 JST
KK @ IB です
以下、何か勘違いがあればご指摘ください。
http://www.webpipe.net/howto/Php_mail_envelope_header
Example Code: (envelope fromの指定法)
$to_address = "somebody @ somewhere.com";
$email_subject = "Subject of your message";
$email_body = "This is the body of the email message!";
$email_header = "From: Website Name <from_address @ your_domain.com>\r\n";
$sendmail_args = "-fbounce_address @ your_domain.com";
mail($to_address, $email_subject, $email_body, $email_header,
$sendmail_args);
上記は、英語圏なので、mb_send_mailを使っていませんが、
-f以下の部分が、envelope fromの部分だと思います。
($email_header = "From: Website Name <from_address @ your_domain.com>\r\n"; は
envelope のfromではないようです。)
あて先の該当ないメールは、このenvelope fromにエラーで返ってくるのが普通です。
(http://sec.ntt.com/glossary/ja_ha/bounce_mail.html など)
これが指定されていない場合、headerのFROMに返ってくる場合と、送信サーバーの管理者へ返る場合とあるようです。
ここへエラーメールが返ってきたかの調べ方ですが、popで受信してみればよいのですが...
pearか何か使うと便利かな。
(この投稿の末尾にPEARを使わないサンプルを引用しておきます。)
上記-fは、代表的なMTAであるsendmailのコマンドですね。
http://sonic64.com/2004-11-07.html
envelope fromについては、上鍵さんという方が熱心に、書かなければだめ、という具合に説いておられたと記憶しています。
前に(昨年、8月〜9月あたり)、このMLで、この件も含めいろいろやり取りがありました。
http://suika.fam.cx/~wakaba/-temp/wiki/wiki?envelope%20from
http://blog.poyo.jp/
なお、先日も書きましたが、RFC2821を是非ご覧ください。
参考になると思います。(下記再掲)
http://www.puni.net/~mimori/rfc/menu.html
また、メールのやり取り、送受信に関しては先日も言及しました川崎 高志さんのcmail
writer(特にソースや吐き出すlog)や、
馬場 達夫さんのbasp21というモジュールなども参考になるかと思います。
参考:(受信)
$sock = fsockopen($host, 110, $err, $errno, 10) or die("サーバーに接続できません");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) != '+OK') die($buf);
$buf = _sendcmd("USER $user");
$buf = _sendcmd("PASS $pass");
$data = _sendcmd("STAT");//STAT -件数とサイズ取得 +OK 8 1234
sscanf($data, '+OK %d %d', $num, $size);
// 件数が0の場合は、終了する。
if ($num == "0")
{
$buf = _sendcmd("QUIT");
fclose($sock);
exit;
}
// 件数分
for($i=1;$i<=$num;$i++)
{
//RETR n -n番目のメッセージ取得(ヘッダ含)
$line = _sendcmd("RETR $i");
//EOFの.まで読む
while (!ereg("^\.\r\n",$line)) {
$line = fgets($sock,512);
$dat[$i].= $line;
}
//DELE n n番目のメッセージ削除
$data = _sendcmd("DELE $i");
}
// 終わり
$buf = _sendcmd("QUIT");
fclose($sock);
/* コマンド送信!! */
function _sendcmd($cmd) {
global $sock;
fputs($sock, $cmd."\r\n");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) == '+OK')
{
return $buf;
}
else
{
die($buf);
}
return false;
}
なお、以下も参考になるはずです。
http://www.phpguru.org/static/pop3.html
>> > メールを何時配信するかどうかはMTA間のやりとりで決まるので、Envelope-From
>> > に指定されている送信者アドレスにFairue Noticeが返ってくるかどうかで判断
>> > するしかないでしょうね。
>>
>> で処理した方が賢明かと思います。
>
> こちらの処理について、詳しく具体的に知りたいのですが参考になるサイトまたは
> 書籍などありますか?
PHP-users メーリングリストの案内