[PHP-users 17056]Re: mb_send_mail()と mb_encode_mimeheader()

Youichi Iwakiri yiwakiri @ st.rim.or.jp
2003年 7月 30日 (水) 16:04:29 JST


いわきりです

Shuji TANAKA wrote in <003e01c3564e$fe9d10d0$0a01a8c0 @ longpro> :
> いわきりさん,見るからに速そうなコード(笑)をどうもありがとうございました.
        3.19 real         3.18 user         0.00 sys * _encode_mimeheader()
        0.03 real         0.01 user         0.01 sys * to_mime()
うちの非力なマシンだと各々は上記の時間が掛かってます

> ただ,一箇所気になった点がありました.parse_euc_ascii()の中,
> それぞれのpreg_split()で,ASCIIの連続とEUCの連続を切り出しているものと思われ
>ます,経験上,Bエンコードされた文字列の間にあるスペー
>スと行セパレータの連続は,無視されるのではないかと思うのですが,これだとEUC文字
>列の連続の後に来るスペースがASCIIとして検出されてしま
>い(当然といえば当然ですが),スペース(またはスペースの連続)部分がエンコード
>されずに残ってしまいます.その後に続く文字列がASCIIで
>あれば問題ないのですが,もう一度EUC文字列が続いたりすると,スペース部分がデコー
>ド時に消えてしまうように思います.

判ってはいるんですが、端折りました。
問題点は、rfc2822(rfc822)における2.2.3. Long Header Fieldsと
rfc1522 6.2. Display of encoded-wordsに書かれた内容によるものです。

encoded-words間に挟まれた連続する空白(LWS)は無視される点と、us-asciiの
folding処理では、空白文字の前で改行する記述されていますが、

Subject: aaa bbb ccc
をfoldingする場合
Subject: aaa bbb
 ccc      <- 継続行の行頭に必ず空白が入ることにより連続行となります。

unfoldingする場合に各行間に" "が補完される為、空白が再現されます
その部分の処理の手抜きが一点目。
※前行の最後の空白を取り除いていない。

Subject: {encoded-words} {encoded-words}
をfoldingする場合
Subject: {encoded-words}
 {encoded-words}      
unfoldingする場合に各行間は連続する空白として無視されます。

ですので
Subject: 日本語 英語
といった場合は、空白が消えないようにする為に、空白ごとencodeする
必要がありますがそれをやってないのが二点目。

> parse_euc_ascii()という関数名からして,この関数の中で対処するべきことではなく
>,呼び出し側で対処するべきことかもしれませんが,とり

Subject: 日本語 英語
の'日本語'と'英語'の間の’'は、us-ascii?、JISX0201 Roman?ってのが
私の中にあったのと前述の様に空白が付いたり消えたりするのはしょうがない
という意識があったのでほっときました。

>あえずEUC文字列の連続の切り出しのところで,以下のような形はどうでしょうか?.
>    list( $ret, $string, $c ) = preg_split( "/([\x01-\x1f\21-\x7f])/", 
>$string, 2, PREG_SPLIT_DELIM_CAPTURE );
> ・・・単純にスペースを避けただけで,恥ずかしい限りの方法ですが・・・.しかし

これだとマルチバイト文字間の' 'もencode対象になるので一見良さそうに
思えますが、
$str = 'From: Japanese Name 日本語名 <youaddress @ your.domain>';
を対象にencode/decodeをすると
From: Japanese Name 日本語名  <youaddress @ your.domain>
                            ^^
              余計な空白が入ってしまいます。
                    
もう少し真面目に走査しないと駄目ですね。
#頑張って直してみて下さい。:)

-- 
Youichi Iwakiri



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