Swiftmailer:主题电子邮件中缺少空格

时间:2015-04-23 06:11:34

标签: php email swiftmailer

我使用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上尝试了解决方案:删除了\rgetTokenAsEncodedWord()函数中的classes/Swift/Mime/Headers/AbstractHeader.php,但它似乎无法正常工作。

有人有解决方案吗?

提前致谢。

2 个答案:

答案 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