虽然这实际上是一个编程问题,但我的直觉是这个主题更适合这个网站。但是,如果您觉得它更适合 Stackoverflow,请告诉我,我会在那里提问。
SMTP 中继是否存在默认功能(或公认的标准)来处理具有多个地址的单个电子邮件,其中一个或多个地址无效?
在我的测试中,如果 SMTP 检测到无效地址(通常是因为我连接到的公司 SMTP 系统中没有相应的地址),则整个电子邮件都会失败 - 电子邮件中的任何人都不会收到它。
有人能确认这是否是标准功能吗?
或者它是可以在单独的 SMTP 级别配置的东西?
还是由各个 SMTP 供应商决定如何处理一个或多个地址无效的电子邮件?
“其他”收件人是否仍有可能收到该电子邮件?
笔记...
- 我是一名程序员,而不是网络管理员,所以我几乎没有设置或配置 SMTP 中继的经验。但是如果我连接的 SMTP 出现问题,我需要知道如何在代码中处理这些错误。
- 这并不特定于某个 SMTP 供应商,因为我的应用程序必须针对客户所需的任何 SMTP 中继运行。
答案1
当您有一封电子邮件有多个收件人,但其中一个收件人无效时,邮件服务器会尝试发送电子邮件,直到遇到有错误的电子邮件地址。然后它通常会向发件人发送未送达通知,并停止进一步处理该电子邮件。
这意味着您基本上无法知道谁收到了电子邮件,谁没有收到。它尝试发送电子邮件的电子邮件地址的顺序无法保证。它可能采用电子邮件中地址的顺序,或使用完全不同的顺序。
我知道这一点,因为我曾经负责调查我国最大的供应商的交付问题。
邮件服务器主要做以下工作:
- 列出所有接收者的名单(顺序不明)
- 尝试向每个收件人单独发送电子邮件
- 接收方遇到递送问题
- 它通常会向发件人发送未送达消息。
- 它通常会停止向剩余的接收者发送消息。
有些邮件服务器的配置可能不同,或者具有不同的默认行为。
这就是您必须使用新闻通讯软件发送新闻通讯的原因之一。它们会单独发送每封电子邮件以避免此问题。
送货问题可能有很多原因。其中一些是:
- 电子邮件语法无效
- 无效的用户名(名称在@符号之前)
- 无效的主机名
- 邮箱已满
- 无效的 MX 记录(如果不存在 MX,则为 A 记录)
- 阻止发件人的电子邮件
- 发件服务器已被阻止
- 电子邮件被识别为垃圾邮件
- 接收邮件服务器不可用
- 发件人邮件服务器上的灰名单配置错误
造成延误的原因包括
- 发件人邮件服务器队列中的电子邮件过多
- 接收邮件服务器暂时不可用(例如流量太大、中断)
- 使用灰名单,并且发送方服务器有一段时间没有向接收方服务器发送电子邮件
某些错误仅在邮件服务器尝试发送电子邮件后才会发生。因此,在尝试之前它无法知道电子邮件是否可以送达。这意味着邮件服务器基本上无法保证在到达无效收件人之前停止整个传送。
结论:发送电子邮件的正确方法是始终向每个电子邮件地址发送单独的电子邮件。(这就是新闻通讯软件的做法。)
答案2
电子邮件可以发送给任意数量的收件人。如果无法将邮件投递到单个地址,则所有其他地址仍将收到该邮件。发件人(通常)将收到一个或多个未送达通知,其中显示失败的地址并说明失败的原因。(第三方提供商(例如 Sendgrid)可能不会通过电子邮件发送 NDR 消息,而是在基于 Web 的仪表板中显示此消息或通过 API 提供。)
RFC 5321 规定您需要重复 RCPT 命令任意次。实际上,您将连接到给定域的邮件服务器,然后尝试通过发送一个 MAIL 命令、多个 RCPT 命令,然后发送 DATA 来向该域内的每个地址投递邮件。如果 RCPT 出现错误,则记录该错误并继续。然后,在尝试所有域中的所有地址后,您将向发件人发送 NDR,其中包含失败的地址和原因。请注意,您必须排队并在出现 4xx 错误时重试。作为程序员,最好的选择不是尝试自己实现 SMTP,而是将邮件发送到已设置为中继的现有 SMTP 服务器,该服务器已经可以为您处理所有事情。