[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 メーリングリストの案内