ようこそゲストさん

CPA-LABテクニカル

2008/06/22(日) mail関数(PHP)のハマりどころ

はてブ情報 はてブに登録 はてブ数 qdmailspok
Qdmailは原則としてPHP標準のmail関数を使用している*1
この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

*1 : SMTP送信もできるけど

*2 : PHPのせいじゃない部分も多々あるけど

*3 : PHPがCRLFに変換するようです。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0149/tb/
  • SMTP送信を使うべき3つの理由-PHP CPA-LABテクニカル spok
    ■さらば、mail,mb_send_mail関数SMTP送信を使うべし!mail,mb_send_mailはトラブルの元改行コードこちらmail関数のハマりどころ でも書いたように、mail関数は、改行コードが難解である。mb_send_mailも、文字化...