▼ 2008/06/22(日) mail関数(PHP)のハマりどころ
Qdmailは原則としてPHP標準のmail関数を使用している*1。
このPHPのmail関数は何かとクセがあり*2、特に改行コードでは苦労させられた。
マニュアル(mail)を熟読すれば、載っていることばかりだけど、今後のために整理しておく。
しかし、PHPのmail関数には時と場合により、LFで渡さなければならない時がある。
特に、ヘッダーと本文の改行コードは分けて考える必要があるので、注意すること。
subject以外のヘッダーはCRLFで渡さなくてはならないのが、面倒なところ。
たぶんlinux,unix系のサーバーは、OS標準の改行コードがLFであることから、このようにしているように思うけど、それならヘッダーもLFで渡すようにすればいいのに。。。。
こちら(PHPのmail()のできの悪さ-よくきたblog)でもご指摘ありますが、ちょっと、その実装は。。。。
私の環境では、sendmaneというsendmailのラッパーを使わせていただいてるので、この制限はないけれど。
これだと誤判別もあり得るので、他にもっといい判別方法があったら、ぜひ教えて下さい。
PHPのmail()のできの悪さ-よくきたblog
このPHPのmail関数は何かとクセがあり*2、特に改行コードでは苦労させられた。
マニュアル(mail)を熟読すれば、載っていることばかりだけど、今後のために整理しておく。
改行コード
インターネットメールの世界では、改行コードは原則として、CRLFである。それは、RFC2822を参照されたい。SMTPサーバーに直接渡す時は、これでOK。しかし、PHPのmail関数には時と場合により、LFで渡さなければならない時がある。
特に、ヘッダーと本文の改行コードは分けて考える必要があるので、注意すること。
mail関数の改行コード注意点
- 本文の改行コードはLFで渡すこと*3。
- ヘッダーの改行コードは、原則としてCRLFだが、MTA(送信サーバー)によっては、LFで渡さなければならない場合がある。現在、LFで渡さなくてはならないMTAは、qmailであることが判明しているが、他もあるかも知れない。qdmailとqmailをごちゃごちゃにしないよう留意を。
混乱しがちな点
本文はLF。subject以外のヘッダーはCRLFで渡さなくてはならないのが、面倒なところ。
たぶんlinux,unix系のサーバーは、OS標準の改行コードがLFであることから、このようにしているように思うけど、それならヘッダーもLFで渡すようにすればいいのに。。。。
こちら(PHPのmail()のできの悪さ-よくきたblog)でもご指摘ありますが、ちょっと、その実装は。。。。
Windows版の制限
to引数
Windows版のmail関数は、第1引数のtoでは、name<address@example.com>が使えず、
address@example.comしか許されない。
私の環境では、sendmaneというsendmailのラッパーを使わせていただいてるので、この制限はないけれど。
ピリオドだけの行
PHP が SMTP サーバと直接通信をする際、ピリオドから 始まる行は無視されますFromとReturn-Path
Windows では、From ヘッダを設定すると Return-Path も設定されます。送信サーバーがqmailかどうかの判別
Qdmail0.8.6aでは、ini_get('sendmail_path');でもってPHP.iniのsendmail_pathを読み取り、そこに、qmailという文字列があるかどうかで判別している。これだと誤判別もあり得るので、他にもっといい判別方法があったら、ぜひ教えて下さい。
参考にさせていただいたサイト
qmail の RFC 違反PHPのmail()のできの悪さ-よくきたblog
▼ コメント(0件)
- TB-URL http://www.cpa-lab.com/tech/0149/tb/
-
▼
SMTP送信を使うべき3つの理由-PHP
CPA-LABテクニカル ■さらば、mail,mb_send_mail関数SMTP送信を使うべし!mail,mb_send_mailはトラブルの元改行コードこちらmail関数のハマりどころ でも書いたように、mail関数は、改行コードが難解である。mb_send_mailも、文字化...