我使用SwiftMailer (v 4.2.2)
发送电子邮件,最近我发现,当SwiftMailer构建一封电子邮件时,如果它有一个很长的主题,它会在邮件的标题中插入换行符。
主题:
Lorem ipsum dolor sit amet =?iso-8859-1?Q?consect=E9tur?=
adipisicing elit
原始主题是:Lorem ipsum dolor sit amet consectétur adipisicing elit
当我发送邮件时(使用Mandrill,甚至是使用本地SMTP服务器的php邮件程序),我收到主题为Lorem ipsum dolor sit amet consectéturadipisicing elit
的邮件
缺少空格,只是在标题中插入换行符的位置。
我在thread上尝试了解决方案:删除了\r
中getTokenAsEncodedWord()
函数中的classes/Swift/Mime/Headers/AbstractHeader.php
,但它似乎无法正常工作。
有人有解决方案吗?
提前致谢。
答案 0 :(得分:2)
看起来Swiftmailer如何生成具有特殊字符的主题行,以及Mandrill的解析器如何处理这些问题。具体来说,Mandrill将删除特殊字符后任何换行符之前的空格。
原因是当主题行标题被分成两行时,第二行通常会被一个空格缩进,所以这可能是为什么你在Mandrill解析了你的空格后会看到这个空格被删除的原因message:swiftmailer只在一个特殊字符后面的第二行放置一个单独的空格。
改变语言并不总是对我有用。
此时,最简单(但难看)的修复方法是更改Swiftmailer将其标头发送到Mandrill的方式。
在 lib / classes / Swift / Mime / Headers / AbstractHeader.php ,第305行 替换
$header->setMaxLineLength(76)
通过
$header->setMaxLineLength(998)
为我修好了一切。
虽然推荐的最大标题大小为78个字符,但最多可达998个字符(参见RFC 2822 section 2.2.3)
答案 1 :(得分:0)
在他们的代码中他们使用lang
protected function getTokenAsEncodedWord($token, $firstLineOffset = 0)
{
// Adjust $firstLineOffset to account for space needed for syntax
$charsetDecl = $this->_charset;
if (isset($this->_lang)) {
$charsetDecl .= '*'.$this->_lang;
}
主题保存为没有lang的Swift_Mime_Headers_UnstructuredHeader,因此它的NULL就在那里。
所以我在Symfony 2中做了工作:
$message->getHeaders()->get('subject')->setLanguage($this->container->get('session')->get('_locale', 'en'));
对你来说,它像smt一样:
$message->getHeaders()->get('subject')->setLanguage($yourLanguage);
当主题有两种以上不同的语言时,就会出现此问题,其中最后一个单词是英语lang