是否可以捕获使用 SmtpClient 发送的电子邮件的“消息 ID”?

Posted

技术标签:

【中文标题】是否可以捕获使用 SmtpClient 发送的电子邮件的“消息 ID”?【英文标题】:Is it possible to capture the "Message-ID" of an email message sent with SmtpClient? 【发布时间】:2012-06-02 08:17:38 【问题描述】:

在 .NET 中使用 SmtpClientMailMessage classes 通过本地邮件服务器 (hMailServer) 发送电子邮件,我目前找不到获取已发送邮件的 Message-ID 标头值的方法。

背后的理念

我正在尝试以编程方式跟踪无法投递的邮件,因此我必须找到一种方法来识别来自目标 SMTP 服务器的拒绝特定邮件的回复。

现在我想简单地记住 Message-ID SMTP 标头值并解析此 ID 的传入邮件。

我在发送消息后尝试检查Headers collection,但没有找到任何Message-ID

我的问题

是否可以获得我的 SMTP 服务器在发送 MailMessage 实例期间添加的 Message-ID 标头值?

2012-05-27 更新

根据this example,我已成功尝试在发送之前自行手动生成Message-ID

到目前为止,我的所有示例都有效,因此似乎这是我问题的解决方案。

【问题讨论】:

我很确定 id 是由 SMTP 服务器分配的,并且 SMTP 协议没有指定将该值返回给客户端。解决此问题的一种方法是将相同的邮件密件抄送给您控制的帐户,并从该邮件中提取邮件 ID...假设邮件 ID 在初始 SMTP 服务器上生成一次。另一种可能性是在电子邮件中添加自定义“X-tag”。 不幸的是,***.com/questions/7095104/… 对此没有防弹方法。 Jeremy Holovacs:这不是问题所在。对于退回跟踪,您知道邮件未送达,并且您想了解退回邮件是针对哪个地址生成的。这很难,但可行。另外作为记录,实践中的大多数 MSA 都允许您指定自己的 Message-Id;但是,正如我在回答中指出的那样,这并没有真正的帮助,因为一些反弹愚蠢地忽略了原始的 Message-Id。 @tripleee,我不确定在所有情况下都是如此,也就是说,我不相信真正的邮件中继是 RFC 定义的协议有义务中继失败通知的。我承认我可能错了。 没有反弹超出了我理解的讨论范围。 【参考方案1】:

您可以在发送电子邮件之前添加自己的消息 ID。我使用下一个代码:

Guid id = Guid.NewGuid(); //Save the id in your database 
mensajeEmail.Headers.Add("Message-Id", String.Format("<0@1>",id.ToString(),"mail.example.com"));

注意:对于我使用OpenPop.Net 的下载消息,我检查了message.Headers.InReplyTo 属性,并且发送了消息ID。

【讨论】:

OpenPop.Net 现在有效吗?【参考方案2】:

您的问题的标准解决方案是 VERP。阅读 Bernstein 的原始文章,了解 Message-Id 等人的原因。不可靠。 http://cr.yp.to/proto/verp.txt

【讨论】:

试图弄清楚如何使用 GMail 进行 VERP... 无法使用加号地址发送,因为 GMail 会覆盖已验证帐户上的电子邮件(即使您的加号地址基于已验证的电子邮件)地址)。 @MikeJansen:如果您有问题,请发布问题。 抱歉,不知道为什么我发表了这条评论。从我发现的内容来看,真的不能用 gmail 做 VERP。这篇文章总结了我的发现:***.com/questions/9925392/…。我需要使用另一个 SMTP 服务器,我自己的或其他提供商。【参考方案3】:

我正在为 .Net 和 SMTP 客户端使用 MailKit 库。

我尝试了另一种解决方案来获取使用 SMTP 客户端发送的消息的 ID,以跟踪任何回复的消息。

在您发送消息之前,将隐藏的 ID 属性添加到消息标题中,

现在继续发送您的信息, 等待大约 10 秒,然后您将使用 IMAP 客户端获取您的已发送文件夹以及文件夹中的每条消息, 遍历消息头并检查其中是否有人是 ==messageIdentity,现在你抓住了你的 成功发送消息并获取有关它的任何信息,例如 ID 等...

【讨论】:

以上是关于是否可以捕获使用 SmtpClient 发送的电子邮件的“消息 ID”?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SmtpClient 时如何保存电子邮件而不是发送?

使用 SmtpClient 通过 C# 发送 HTML 电子邮件

SmtpClient - 发送到不同的域

c# SmtpClient 类无法使用 gmail 发送电子邮件

使用 SmtpClient 和 MailMessage 时如何禁止电子邮件验证

使用第三方与投递文件夹时 SMTPClient 发送限制为 50 封电子邮件