Zend_Mailの日本語(のみならず)対応がいまいちです

Zend_Mailを使って色々試していたのですが、長めの件名等をうまく扱えず、実用には厳しそうです。

まず、普通のやり方はこんな感じだと思います。

$transPort = null; // set if smtp
$encoding = 'ISO-2022-JP';
$mail = new Zend_Mail($encoding);
$mail->setFrom($fromMail, $fromName);
$mail->addTo($toMail, $toName);
$mail->setSubject($subject);
$mail->setBodyText($body, $encoding, Zend_Mime::ENCODING_7BIT);
return $mail->send($transPort);

そうすると、本文は良いと思うのですが、問題はto, subjectを含むヘッダー系です。
ヘッダーのソースを良く見ると、Qエンコーディングになっていると思います。
日本語の世界だと普通はBエンコーディングだと思うのですが、現在のZend_Mailの仕様で、
isQuotedPrintableでない時には強制でQエンコーディングにされてしまいます。

と言うことで、自分でBエンコーディングしてから足す方法もあるのですが、
件名が長いと、途中が?に変換されてしまいます。これは、いしなお!さんのところで指摘

> mb_encode_mimeheader()してから、setSubject()とかしただけだと、"\r"とか"\n"とかが"?"に変換されてしまう

されている問題と思います。本来は\r\nをはさむのがメールの正しい書式だと思いますが、大丈夫なんでしょうか。

そもそもはZend_Mailクラスがエンコーディングしているところを自分で無理やりエンコーディングしてるのはきっと意図しない使い方で、
だからこんな問題が起きるのも仕方ないとは思うのですけどね。バージョンアップしたら動かなくなりそうだし。

さて、大体わかったところで、Zend Frameworkの不具合データベースを見てみると、それっぽい問題がありました。Voteできる人はしてくださいませ。

本来ヘッダーが長い場合は\r\nで区切ってエンコードし直さなくてはいけないのですが、長すぎても分けてくれない、
デフォルトのエンコーディングであるQエンコーディングでもうまく行かない、と言うものです。

ヘッダー系の格納をする際に途中のZend_Mail#setSubject等のみならず、最終の処理が行われるMail#_storeHeaderでも、\rや\nを?に置換してしまうため、
どうやってもうまく行きません。

やるとしたら、Zend_Mailのさまざまな関数をオーバーライドして処理する感じだと思いますが、そんなのやってられないし、
せっかく使おうとしたのにちょっと参ってます。もうしばらくmb_send_mailか、いしなお!さんの方法か。
ま、関数wrapしておけば色々対応できるとは思いますが。


$fromName = self::_encodeMailHeader($fromName);
$toName   = self::_encodeMailHeader($toName);
$subject  = self::_encodeMailHeader($subject);
$mail->setFrom($fromMail, $fromName);
$mail->addTo($toMail, $toName);
$mail->setSubject($subject);

private static function _encodeMailHeader($value)
{
	// Zend_Mime::encode で ENCODING_7BIT が実装されていないため、古い関数を使う
	$value = mb_encode_mimeheader($value, self::_getMailEncoding(), 'B');

	// 改行はなかったものにする。
	// @see http://tdiary.ishinao.net/20071225.html
	$value = strtr($value, array("\r" => '', "\n" => '', "\t" => ''));

	return $value;
}

Trackback URL for this post:

http://nonn-et-twk.net/twk/trackback/155
from twk @ ふらっと on 火, 2009-01-13 02:35

Zend_Mailでは直感的に使うとヘッダーのエンコーディングに関して不具合があります。
しかし、次のリリースで直るかも知れません!
ここで改めて問題と解決方法についてまとめてみようと

from MOVION.net on 火, 2008-03-04 17:40

Zend_MailとSmartyを組み合わせた、メール送信のクラスを作ってみたのですが、
どうも長いタイトルのメールを送ると、タイトルの途中に「?」が入るからソースを見てみたら。

   p...

0

半分忘れているけど

MIME ならば、途中で切らなくともヘッダは 1024 バイトまで1行中で送れた気がする。