【问题标题】:Send email to multiple recipients using individual SMTP transactions with MailKit使用 MailKit 的单个 SMTP 事务向多个收件人发送电子邮件
【发布时间】:2020-11-16 20:38:39
【问题描述】:

在我的环境中,我们使用 MailKit 通过 Office 365 SMTP 以编程方式发送电子邮件。我最近意识到,如果我发送一封包含多个收件人的电子邮件,并且其中一个地址在我们的组织中不再存在,O365 服务器将拒绝整个电子邮件(不将其发送给其余收件人),如果单个收件人是无效的。产生的错误是

5.4.1 Recipient address rejected: Access denied. 

当我发送电子邮件时,我更喜欢在电子邮件中显示所有收件人,以便每个人都知道谁参与其中并可以回复组。所有收件人都在我的组织内,因此他们已经拥有彼此的电子邮件地址。

基于 SMTP 的工作方式(使用单独的 RCPT 和标头),我似乎应该能够与标头中的每个人一起发送电子邮件,但使用 SMTP 服务器的单独事务,以便我可以捕获为每个生成的异常地址。

这可能与MailKit有关吗?

【问题讨论】:

  • 失败的电子邮件地址没有显示在您的收件箱中吗? SMTP 只有一个 TO ADDRESS,您可以在其中放置所有收件人。
  • 电子邮件都是自动生成的,因此它们来自我无权访问的 DoNotReply@example.com 类型的地址。我的理解是,当您通过 SMTP 发送时,您首先指定通过 RCPT TO 命令发送电子邮件的实际收件人,然后您还将这些地址放在标头中。如果您将某人放在 RCPT 中而不在标题中显示他们,我认为这就是 BCC 选项的工作方式。
  • RCPT TO 是收据在人们响应后到达的地方。密件抄送是盲人,接收电子邮件的人看不到其他收到电子邮件的人。

标签: c# email office365 mailkit


【解决方案1】:

查看采用 MailboxAddress 参数的 Send() 和 SendAsync() 方法:

http://www.mimekit.net/docs/html/M_MailKit_MailTransport_Send_2.htm

这使您可以控制将消息准确发送给谁,而不是让 MailKit 的 SmtpClient 通过收集来自 To、Cc 和 Bcc 标头的地址来决定将消息发送给谁。

【讨论】:

  • 这正是我正在寻找的答案。通过在 send 函数中分别传入 to 和 from 参数,它将这些参数用于 MAIL FROM 和 RCPT TO 命令,然后将邮件消息本身中的参数用于标题。这意味着我可以在 foreach 循环中发送电子邮件(捕获任何异常),而收件人仍然可以看到收到电子邮件的其他所有人。
  • 对于寻求类似解决方案的任何人的另一个注意事项,发送功能的文档指出:“如果存在 Resent-Sender 或 Resent-From 地址,则从 Resent- To、Resent-Cc 和 Resent-Bcc 标头,否则使用 To、Cc 和 Bcc 标头。"
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 2012-05-18
  • 2014-06-22
  • 2022-01-02
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多