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

7

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

背后的想法

我正在尝试以编程方式跟踪无法传递的消息,因此必须找到一种识别目标 SMTP 服务器拒绝某个消息的回复的方法。

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

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

我的问题

在发送MailMessage实例时,是否可以获取我的SMTP服务器添加的Message-ID头值?

更新 2012-05-27

根据this example,我已经成功尝试手动生成自己的Message-ID,就在发送之前。

到目前为止,我的所有示例都可以正常工作,因此这似乎是我问题的解决方案。


2
我非常确定id是由SMTP服务器分配的,而SMTP协议并没有规定将该值返回给客户端。解决这个问题的方法是将相同的邮件密送到您控制的帐户,并从该邮件中提取消息ID……假设消息ID仅在初始SMTP服务器上生成一次。另一个可能性是向电子邮件添加自定义“X标记”。 - Jeremy Holovacs
谢谢,@JeremyHolovacs - 我已经尝试添加了一个自定义标签(没有“X-”前缀),但似乎在转发或回复消息时该标签会丢失。 - Uwe Keim
1
很遗憾,根据https://dev59.com/A2w05IYBdhLWcg3wrDtS,目前还没有一种百分百可靠的方法来确认邮件是否已经被送达。 - Jeremy Holovacs
1
Jeremy Holovacs:这不是问题所在。对于反弹跟踪,您知道消息未被传递,并且希望找出反弹是为哪个地址生成的。这很困难,但可行。此外,值得一提的是,实际上大多数MSA允许您指定自己的Message-Id;但是,正如我在答案中所指出的那样,这并没有什么帮助,因为有些反弹愚蠢地省略了原始的Message-Id。 - tripleee
1
@tripleee,我不确定在所有情况下都是这样的,即我不相信真正的邮件中继有义务按照RFC定义的协议中继失败通知。虽然我承认我可能对此有所错误。 - Jeremy Holovacs
1
我理解这种情况下,缺乏弹跳的讨论已经超出了范围。 - tripleee
3个回答

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

您可以在发送电子邮件之前添加自己的消息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现在有效吗? - Kiquenet

2
我正在使用MailKit库和SMTP客户端来发送邮件。我尝试了另一种方法来获取使用SMTP客户端发送的消息的ID,以便跟踪任何回复的消息。在发送消息之前,请将隐藏的ID属性添加到消息头中,然后继续发送消息。等待大约10秒钟,然后您将使用IMAP客户端获取已发送文件夹,并循环遍历文件夹中的每个消息头,检查它们中是否有任何一个等于“messageIdentity”。现在您已成功捕获已发送的消息并获取有关其ID等信息的任何信息。请参考以下示例图片:Check this sample

2

1
正在尝试使用GMail实现VERP,但由于GMail会覆盖已验证账户上的电子邮件地址(即使您的加号地址基于已验证的电子邮件地址),因此无法使用加号地址发送。 - MikeJansen
1
@MikeJansen:如果你有问题,请发一个问题。 - tripleee
1
不好意思,我不确定为什么发布了那个评论。根据我所找到的,无法使用VERP邮件协议来处理Gmail邮件。这篇文章总结了我所发现的信息:https://dev59.com/bWLVa4cB1Zd3GeqPtBl3。我需要使用另一个SMTP服务器,自己的或者其他提供商的。 - MikeJansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接