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

C# 如何从.NET发送包含过去日期的电子邮件?,c#,vb.net,email,header,C#,Vb.net,Email,Header,我试图通过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) objMa

我试图通过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_地址的Outlook中收到电子邮件时,所有地方的日期都是2009年,而不是1999年。就在Outlook界面中,也在标题中,我通过该电子邮件上下文菜单中的“选项”项访问该标题

我做错了什么?我觉得我错过了一些明显的东西


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

再加上@Lasse V.Karlsen的注释,我认为SMTP服务器很可能覆盖了您在代码中输入的消息。老实说,为什么你甚至需要让一封电子邮件看起来像是过去发送的?我想不出一个理由至少是不诚实的,或者最坏是恶意的

因此,如果这个头看起来可疑,服务器会覆盖它,这对我来说是有意义的。我不知道这是否真的发生了,但我敢打赌@Lasse V.Karlsen是正确的

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

不过,我想知道你为什么要这么做。你能详细说明一下吗

已添加


@Lasse V.Karlsen-我认为您应该将您的便条作为答案发布,这样您就可以获得积分。

在准备标题时,消息类中的标题值被覆盖:

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

我尝试(未成功)设置此值的原因是,我需要知道不同计算头的值。我想“足够近”就可以了。

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

这可能会被相关服务器否决,服务器会记录他们收到消息的时间,而不是消息何时发送。我认为嗅探网络会有所帮助。或者至少在SMTP中添加其他日志记录server@LasseV.卡尔森正如大卫·斯特拉顿所说,你应该添加这一评论作为回答。这是有道理的。我必须想一个更好的方法。+1现在我明白了你的理由,我认为这是一个更好的问题。我正在开发一个电子邮件集成组件,它利用UID和“最后处理”日期来定位要集成的第一封新电子邮件。我想测试多封电子邮件的日期/时间完全相同的情况,因为电子邮件集成模块应该完美地处理这些情况。如果我可以简单地像那样伪造日期,我可以发送与特定日期/时间匹配的任意数量的电子邮件,而不是试图用自动脚本发送它们-希望它们都能在同一秒钟内收到。看来,我必须想出更好的方法来做到这一点。+1请评论人进行测试!可能有一种方法可以为集成组件生成或模拟邮件消息,这样您就不必通过邮件服务器实际发送它们来测试该部分。您仍然可以使用邮件服务器进行集成测试,但这些特定测试作为独立的单元测试可能会更好。如果有人感兴趣,SmtpClient(而不是smtp服务器)似乎正在执行.Send()期间更改邮件的“日期”头方法。这样做没有恶意原因。举个例子:一个客户想把我们系统过去发送的电子邮件放入他们的电子邮件档案中。我们将信息存储在数据库中。我们可以从数据库中重建电子邮件。如果能够将电子邮件的日期与实际发送的历史日期联系起来,那就太好了。