如何从.NET发送过去日期的电子邮件?

我试图通过在VB.net中的MailMessage.Headers.Set调用来完成此操作。 见下文:

Dim objMail As MailMessage Dim objSMTPClient As SmtpClient objMail = New MailMessage() objSMTPClient = New SmtpClient() objMail.From = New MailAddress(MY_EMAIL_ADDRESS) objMail.To.Add(New MailAddress(TEST_EMAIL_ADDRESS)) objMail.Headers.Set("Date", "09 Jan 1999 17:23:42 -0400")'date in the past' objMail.Subject = "The Subject" objMail.Body = "The Body" objSMTPClient.Port = 25 objSMTPClient.Host = HOST_IP objSMTPClient.Credentials = New System.Net.NetworkCredential(MY_EMAIL_ADDRESS, txtPassword.Text) objSMTPClient.Send(objMail) 

我确认objMail.Headers.Set调用实际上正在工作 – 如果我之后得到了值,它已成功更改。 我的问题是,当我在TEST_EMAIL_ADDRESS的Outlook中收到电子邮件时,日期是2009年的所有地方,而不是1999年。就在Outlook界面中,也在标题中,我通过上下文中的“选项”项访问该电子邮件的菜单。

我究竟做错了什么? 我有一种感觉我错过了一些明显的东西……

要明确:我不是故意这样做的。 我正在开发一个电子邮件集成组件,它利用UID和“上次处理”日期来定位要集成的第一个新电子邮件。 我想测试多个电子邮件具有完全相同的日期/时间的情况 – 因为电子邮件集成模块应该完美地处理这些情况。 如果我可以简单地用这种方式伪造日期,我可以发送尽可能多的与特定日期/时间相匹配的电子邮件,而不是尝试使用自动脚本发送它们 – 希望它们都能在同一秒内收到。 不过,我似乎需要采取另一种方法。

再加上@Lasse V. Karlsen的说明,我认为很可能SMTP服务器会覆盖你在代码中放入邮件的内容。 老实说,为什么你甚至需要制作一个过去发送的电子邮件? 我想不出一个至少不是不诚实或最坏的恶意的原因。

所以,如果它看起来很可疑,那么服务器会覆盖这个标题是有意义的。 我不知道这是不是真的发生了,但我敢打赌@Lasse V. Karlsen是正确的。

如果是这样,可能的解决方案是将SMTP服务器上的日期更改为过去的某个日期(如果您控制服务器并且能够这样做)。

不过,我想知道为什么你甚至想要这样做。 你能详细说说吗?

添加

@Lasse V. Karlsen – 我想你应该把你的笔记作为答案发布,这样你才能获得它的荣誉。

准备标头时,Message类中将覆盖标头值:

 this.Headers.InternalAdd(MailHeaderInfo.GetString(MailHeaderID.Date), MailBnfHelper.GetDateTimeString(DateTime.Now, null)); 

我尝试(未成功)设置此值的原因是因为我需要知道它用于不同的计算头。 我想“足够接近”将不得不做。

您可以将自定义标头添加到Header属性中; 但是,不包括很少的保留标题,包括日期。 该文档指出,受限标题的自定义值将被丢弃或覆盖,请在MSDN上阅读更多内容