PHP-Pear-MailのValidation failed forエラー

| | コメント(0) | トラックバック(0)

Pear でのMailの送り方は、内部関数mail使用,sendemail(orラッパー)使用,smtp使用と3種類ある(参考:phpでメール送信[Pear::Mail])わけだが、sendmailで、こちらのPEAR::Mailを使ってメールを送信してみようの例でやってみたら下記症状がでた。

----------------------------------------------------

fromのアドレスにメールアドレス以外の文字(例えば名前)をいれるとき、Validation failed というエラーが出た。

---------------------------------------------------

なんじゃらほい。

Validation とは英和辞書によると「~の正当性を立証する」だと?

Pearのソースを眺める。あった。RFC822.phpに、_validatePhrase関数なるものが。

ああ、ここでRFC822に正当に対応(準拠)しているかどうか、というのを調べるのね。

Mailクラスには、function prepareHeadersという関数があるようだ。この関数は、配列に収まっているヘッダー情報をテキストの形に整形する関数。この関数は、fromヘッダを特別扱いしている。ユーザー指定のfromヘッダから、senderを抜き出して、 sendmail (他コマンド) -f(formアドレス)とやるよう。

さらに_validatePhraseにてfromヘッダのデータ(mailbox)をに対するRFC822準拠性チェックを行うのだが、ここで、当該ラインには、英数文字(atom)しか流さないように、チェックが行われており、当然にひらがなはひっかっかってエラーとなる。

つまりは、<メールアドレス>やダブルクオーテーションで囲まれた部分以外は、アルファベットでないとエラーを流す仕組み。

参考:http://www.mew.org/Newsletters/2.html

ああ、ダブルクオーテーション。。

アルファベットなら、ダブルクオーテーションなしで、通る。

日本語なら、ダブルクオーテーションがないとエラー。

つまり、先にmimeエンコード(&base64)しとけってことだ。

 

というわけで

$header['From'] = "ほげほげ<hoge@hoge.com>";

$header['From'] = "\"ほげほげ\"<hoge@hoge.com>";

と直して一件落着。。。ではない。

インターネットのお約束ではダブルクオーテーションの中といえども7bitで流さなくてはならない。これはsendmailラッパーが好意でmimeエンコードしてくれているだけで、こちらとしてはお行儀がよくない。

最初からRFCにきちんと準拠するには、sendmailに渡す前に、mimeエンコードしておかなくてはならない。

というわけで

$a="ほげほげ";

$def_encoding=mb_internal_encoding();
mb_internal_encoding(mb_detect_encoding($a));

$header['From'] = mb_encode_mimeheader($a)."<hoge@hoge.com>";

mb_internal_encoding($def_encoding); 

本当は、1行が76文字以下でなければならないだが、mb_encode_mimeheaderがそれも処理してくれる模様。

あ、でも、fromだけでいいのか?ああ、fromは必須ヘッダだからか?

いや他のヘッダも本当は同様にしなくてはいけない。

他のヘッダーもちゃんとmimeエンコードしておかないとホントはまずい。。てことか。

今はマルチバイトコードのまま、sendmaneに渡しちゃっているんだ。。。

つまりRFC822に準拠していないメールも、親切なメーラーさんのおかげて読めるわけだ。

しかし、人の親切に頼ってばかりはいけないので、ちゃんとエンコードしましょうね。

トラックバック(0)

このブログ記事を参照しているブログ一覧: PHP-Pear-MailのValidation failed forエラー

このブログ記事に対するトラックバックURL: http://www.cpa-lab.com/cgi-bin/mt/mt-tb.cgi/80

コメントする

このブログ記事について

このページは、spokが2007年9月26日 22:43に書いたブログ記事です。

ひとつ前のブログ記事は「PHP-Pear-Mailをwindows-sendmane環境で使う方法」です。

次のブログ記事は「php5で500エラーが起こるとき」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.01