[PHP-users 16997]mb_send_mail()とmb_encode_mimeheader()

Shuji TANAKA stanaka @ longpro.ne.jp
2003年 7月 28日 (月) 13:09:40 JST


こんばんは.stanakaと申します.

 以前一度だけ投稿させていただきましたが,初めてのようなものですので,よろし
くお願いいたします.
 失礼ながら質問ではないのですが,mb_send_mail()などに関して・・・.

 mb_send_mail()は第三引数に追加のヘッダを渡すことができますが,どうやらここ
に日本語を渡してもMIMEエンコードしてくれないようです.そのために,
mb_encode_mimeheader()があってこれでエンコードしてから渡してやるべきなような
のですが,この関数では,文字列の先頭から,ASCII範囲外の文字が出てくる場所ま
でを走査し,そこから文字列の最後まで全てをbase64エンコードしてしまうようで
す.
 規格としてはこれでいいのかもしれませんが,たとえばFrom:ヘッダとして,

「From: 日本語名称 <youraddress @ your.domain>」

 のような文字列を設定してmb_encode_mimeheader()に渡し,結果がmb_send_mail()
経由でsendmailに渡ると,sendmailがFrom:ヘッダのMIMEエンコードされた文字列を
ローカルのメールアドレスと見なして,自動的に文字列の後尾に「@your.domain」の
ようなドメイン名を設定してしまうということが起こりました.
 sendmailの設定でこれを回避することができるのかもしれませんが,最初から
From:ヘッダのメールアドレス部分をエンコードしなければこの問題は起こらないと
思うので,PHP側で何とかならないかと思い,次のような関数群を作成しました.即
ち,

・string _encode_mimeheader( string $string ):
 下記mime_encode()を使用して,76バイトごとに区切られたエンコード文字列を作
成する.

・string mime_encode( string $string ):
 mb_strwidth()で一文字ずつバイト数を調べ,1byte幅のキャラクタの部分はそのま
ま,2byte幅以上のキャラクタの部分はエンコードする.与えられる文字列は改行を
含まない文字列でなければならず,返すエンコードされた文字列も76バイトごとに改
行されたりはしない.

 使用するエンコーディングはソース中に「ISO-2022-JP」の文字列が埋め込まれて
います.これらについて,こちらである程度のテストはやってみたのですが,適当に
Webサイトなどからコピーした文字列のに関して,

・エンコードされた文字列がメールのヘッダとして使用できているか
・mb_decode_mimeheader()によってデコードできるか

 などを散発的にやってみた分には成功しております.今のところ,mb_send_mail()
からはテストしておりませんが,コマンドラインで/usr/sbin/sendmailに直接エン
コードされた文字列を渡している状態です.ただ,あまりさまざまなテストをやる余
裕がないというか,どのようにテストをやれば良いのか良く分からない,という状態
でして,どなたかもしお時間をいただけましたら,ソースコードをみて間違い等を指
摘する(この処理は重い,とか),ちょっと動かしてみて気が付いたところを指摘す
る,などしていただけないか,と思いまして投稿させていただきました次第です.
 とにかくきちんと規格を調べてやっているわけではないし,どういう処理をすれば
PHPでは負担がかかるのか,などの知識も欠けております.

 了解がいただけるようでしたら,次のメールでソースコードをみていただこうと思
うのですが,いかがでしょうか?.

 尚,www.php.netのオンラインマニュアル,mb_send_mail()のuser contributed
notesに,dynamis @ skillup.jpという方が次のように投稿なさっておられます.曰
く,

・mb_encode_mimeheader()では,「=?エンコーディング名?」で始まる部分を含む文
字列を正確にエンコードすることができない.

 これを解決されるために自作のencode_mimeheader()関数を投稿されておられま
す.私の作成したものではこの問題には対応できませんが,dynamis @ skillup.jp氏の
ものを使用しましたところ,冒頭で述べた問題に加えて,

・二行目以降の文字列を本文の始まりと見なし,それ以降のヘッダがすべて本文に追
い出される.

 という問題が起こりました.いろいろ実験してみたところ,sendmailはヘッダの二
行目以降には行頭にスペースを必要とするのではないかと推測し,拙作の
_encode_mimeheader()ではそのようにしてみたところ,その問題は起こらなくなって
おります.

 以上,次の環境での話題です.

RedHat 7.3
RPM版 Apache 1.3.23
RPM版 PHP 4.1.2
RPM版 sendmail 8.11.6

 どうかご検討よろしくお願いいたします.

--
田中 秀治 @ ロングプロダクツ
stanaka @ longpro.ne.jp





PHP-users メーリングリストの案内