我可以在 SwiftMailer 中使用传统的电子邮件“收件人”行吗?

Posted

技术标签:

【中文标题】我可以在 SwiftMailer 中使用传统的电子邮件“收件人”行吗?【英文标题】:Can I use a traditional Email "To" line in SwiftMailer? 【发布时间】:2019-12-22 14:52:43 【问题描述】:

SwiftMailer 需要一个电子邮件地址数组,可能包括名称作为数组的值:

$message->setTo([
  'person1@example.org',
  'person2@example.net' => 'Person 2 Name',
  'person3@example.org',
  'person4@example.org',
  'person5@example.org' => 'Person 5 Name'
]);

但我只有一行文本,形成一个标准的To 标头:

person1@example.org, 'Person 2 Name' <person2@example.net>, person3@example.org, person4@example.org, 'Person 5 Name' <person5@example.org>

我可能可以一起破解一些东西以将To 标头转换为数组,但这感觉像是标准解决方案的问题,理想情况下来自吸收了 RFC 并接受奇怪但有效的电子邮件地址的人,包括那些包含逗号和分号的。 SwiftMailer 本身有这个功能吗?如果是这样,我找不到它。

【问题讨论】:

有趣的问题。我很长一段时间没有检查 Swift Mailer 代码,但我认为在提交消息之前它不会构成实际的标题。并且您自己创建自定义标头将不起作用,因为邮件服务器不会在那里搜索实际的收件人(他们必须提前使用特殊的 SMTP 命令提供)。让我们拭目以待,但我怀疑你运气不好。 我曾尝试自己与imap_rfc822_parse_adrlist() 一起破解一些东西,但这很棘手。 【参考方案1】:

使用 SwiftMailer 典型的-&gt;setTo() API 的好处是地址验证。验证后,SwiftMailer 会构建相应的 header 并添加它。

/**
 * @var $message Swift_Message
 */
$message = $mailer->createMessage();

$message->setTo([
    'person1@example.org',
    'person2@example.net' => 'Person 2 Name',
    'person3@example.org',
    'person4@example.org',
    'person5@example.org' => 'Person 5 Name'
]);

// String representation of corresponding To header
print_r((string)$message->getHeaders()->get('To'));

产量:

To: person1@example.org, Person 2 Name <person2@example.net>, person3@example.org, person4@example.org, Person 5 Name <person5@example.org>

可以使用$message-&gt;getHeaders()-&gt;addTextHeader()手动设置标题。

// Set To text-header manually
$message
    ->getHeaders()
    ->addTextHeader(
        'To', 
        "person1@example.org, 'Person 2 Name' <person2@example.net>, person3@example.org, person4@example.org, 'Person 5 Name' <person5@example.org>"
    );

// String representation of manually set header
print_r((string)$message->getHeaders()->get('To'));

这会产生相同的标题。然而,我个人会尝试从 Swift 的验证中受益。

【讨论】:

我得到的输入已经是这种格式了,就是这样。我也许能够改变我接受输入的方式,使其看起来更适合 SwiftMailer,但保留现有值会很棘手。

以上是关于我可以在 SwiftMailer 中使用传统的电子邮件“收件人”行吗?的主要内容,如果未能解决你的问题,请参考以下文章

Swiftmailer 的多个附件

有没有一种正确的方法可以在 symfony 中使用 SwiftMailer 包将 NTLM 身份验证类型添加到 SwiftMailer 中?

Swiftmailer不立即发送

使用 swiftmailer 密件抄送多个地址

如何在 SwiftMailer 中关闭 SMTP 连接

如何在 symfony 4 和 Swiftmailer 中测试发送电子邮件