一 。 今天试了一下,用Zend framework 提供的Zend _mail发邮件,发送成功,可是标题中文乱码...
google了一下,发现有人说长度太长就会乱码...
zf的issue tracker上已经有report...我还没有尝试上面有人提供的方法...等一下尝试一下...但是我先记录一下:
In Zend _Mail::_encodeHeader() and Zend _Mail::setSubject().
Now, it is:
=?utf-8?Q?mikespook=20=E9=82=80=E8=AB=8B=E6=82=A8=E9=80=B2=E5=85=A5=20ecbattle.net=20=E7=?=9A=84=E4=B8=96=E7=95=8C=E5=85=A7?=
But should be:
=?utf-8?Q?mikespook=20=E9=82=80=E8=AB=8B=E6=82=A8=E9=80=B2=E5=85=A5=20ecbattle.net=20=E7=?=
=?utf-8?Q?9A=84=E4=B8=96=E7=95=8C=E5=85=A7?=
And if I modify the code in Zend /Mail.php line: 392.
protected function _encodeHeader($value)
{
if (Zend _Mime::isPrintable($value)) { return $value; } else { $quotedValue = Zend _Mime::encodeQuotedPrintable($value); $quotedValue = str_replace(array('?', ' '), array('=3F', '=20'), $quotedValue); return '=?' . $this->_charset . '?Q?' . $quotedValue . '?='; }
}
to:
protected function _encodeHeader($value)
{
if (Zend _Mime::isPrintable($value)) { return $value; } } else { $quotedValue = Zend _Mime::encodeQuotedPrintable($value, 200); $quotedValue = str_replace(array('?', ' '), array('=3F', '=20'), $quotedValue); return '=?' . $this->_charset . '?Q?' . $quotedValue . '?='; }
}
there will be no problem. but if it is longer than 200, the subject will be showed hash.
此外,对于text文本的邮件,可能也需要设置charset/encoding,否则邮件body部分也有可能是乱码...如:
$mail->setBodyText('测试邮件。','utf-8',Zend _Mime::ENCODING_BASE64);
二。
//从数据库中得到邮件服务器信息
$mailInfo = $this->_getmail->getMail();
//配置邮件服务设置信息
$config = array (
'auth' => 'login',
'username' => $mailInfo['emailUsername'],
'password' => $mailInfo['emailPassword'],
'port' => $mailInfo['smtpPort']
);
$transport = new Zend_Mail_Transport_Smtp($mailInfo['smtpAddress'], $config);
//初始编码设置
$mail = new Zend_Mail('UTF-8');
//处理body乱码,过滤html
$mail->setBodyHtml($data['content'],'utf-8',Zend_Mime::ENCODING_BASE64);
$mail->setFrom($mailInfo['emailUsername'], $data['addressor']);
foreach ($data['mail'] as $key => $value) {
$mail->addTo($data['mail'][$key], 'Some Recipient');
}
$mail->setSubject($data['mailTitle']);
$mail->send($transport);