[PHP-users 17036]Re: mb_send_mail()と mb_encode_mimeheader()
Youichi Iwakiri
yiwakiri @ st.rim.or.jp
2003年 7月 29日 (火) 16:38:35 JST
いわきりです
Shuji TANAKA wrote in <003501c354fc$e4ce8f60$0a01a8c0 @ longpro> :
> 少しよく分からなかったのですが,
>> ヘッダフィールドは、US-ASCIIで記述されることと言うのと、
>> From:ヘッダに関しては、
>> From: [displayname] "<" addr-spec ">"
>> といったような規定があるので "<" addr-spec ">"の部分をUS-ASCIIで無い
>> 他文字コードとしてエンコードするのは拙いと思います。
> この部分は,私の不満に賛同していただけたと思っていいのでしょうか?.それと
>も逆でしょうか?.
基本的に賛成です。
>> で、そのコードはいつ見せてもらえますかね :)
> あれ?,なんか怒ってます?.
いえ怒ってませんよ。
他の人の書かれたコードは参考になるので楽しみに待ってたんですが
「次のメール」が来ないんで催促しちゃいました。
> とりあえず了解を頂いたものとして,以下にPHPコードを出させていただきます.
誰の了解も必要なく流せばいいんじゃないでしょうか。
#誰も了承する権利なんかもってない場なので
>なんか,76バイトに収まるまで何度もmime_encode()を呼び出したり,mb_strwidth()
>とか一字ごとに呼び出したりしてもうちょっとスマートな方法はないのか,と自分で
>も思うのですが・・・・.
添削するより、新たにコーディングした方がはやそうなので、私ならこうコー
ディングします。
コード内の日本語はEUC-JPであることを前提にしています。
<?php
define ('CRLF', "\r\n");
define ('MLDM', " "); // Multi Line DeliMiter
function parse_euc_ascii($string) {
$retval = array();
while (strlen($string)) {
if (substr($string, 0 , 1) < "\x7f") {
list($ret, $string, $c) = preg_split("/([\x80-\xff])/", $string, 2, PREG_SPLIT_DELIM_CAPTURE);
$ret = split(' ', $ret);
$retval[] = array(0, array_shift($ret));
while (count($ret)) {
$retval[] = array(1, array_shift($ret));
}
} else {
list($ret, $string, $c) = preg_split("/([\x01-\x7f])/", $string, 2, PREG_SPLIT_DELIM_CAPTURE);
$retval[] = array(2, $ret);
}
$string .= $c;
}
return $retval;
}
function to_mime($str) {
$parts = parse_euc_ascii($str);
$encode_header = '=?ISO-2022-JP?B?';
$encode_footer = '?=';
$headfoot_len = strlen($encode_header . $encode_footer);
$header_length = 0;
$header = '';
foreach ($parts as $p) {
while ($p[1] !== NULL) {
$len = strlen($p[1]);
if ($p[0] < 2) {
if ($header_length + $len + $p[0] < 74 {
if ($p[0] == 1) {
$header .= ' ';
}
$header .= $p[1];
$p[1] = NULL;
$header_length += $len + $p[0];
} else {
$header .= CRLF;
$header .= MLDM;
$header_length = strlen(MLDM);
}
} else {
$new_length = $header_length + $headfoot_len + (int)ceil(($len+6)/3.0) * 4;
if ($new_length < 74) {
$header .= $encode_header . base64_encode(mb_convert_encoding($p[1], 'jis', 'euc-jp')) . $encode_footer;
$p[1] = NULL;
$header_length += $new_length;
} else {
$remainig_length = floor((74 - ($header_len + $headfoot_len)) / 4.0) * 3 - 6;
$mb_remaining_length = (int)floor($remaining_length/2.0);
$header .= $encode_header . base64_encode(mb_convert_encoding(mb_substr($p[1], 0, $mb_remainig_length),'jis', 'euc-jp')) . $encode_footer;
$p[1] = mb_substr($p[1], $mb_remainig_length);
$header .= CRLF;
$header .= MLDM;
$header_length = strlen(MLDM);
}
}
}
}
return $header;
}
$str = 'From: Japanese Name 日本語名 <youaddress @ your.domain>';
echo to_mime($str) . "\n";
echo mb_decode_mimeheader(to_mime($str)) . "\n";
?>
--
Youichi Iwakiri
PHP-users メーリングリストの案内