【问题标题】:How can I send an e-mail with a past date from .NET?如何从 .NET 发送带有过去日期的电子邮件?
【发布时间】:2014-02-25 22:46:51
【问题描述】:

我试图通过 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 和“最后处理”日期来定位要集成的第一封新电子邮件。我想测试多封电子邮件具有完全相同的日期/时间的情况——因为电子邮件集成模块应该完美地处理这些情况。如果我可以简单地以这种方式伪造日期,我可以发送尽可能多的与特定日期/时间匹配的电子邮件,而不是尝试使用自动脚本发送它们——希望它们都能在同一秒内收到.不过,看来我需要采取另一种方法。

【问题讨论】:

  • 它可能被有问题的服务器否决了,它记录了他们收到消息的时间,而不是消息说它被发送的时间。
  • 我认为嗅探网络会有所帮助。或者至少在您的 SMTP 服务器中进行额外的日志记录
  • @Lasse V. Karlsen 正如大卫斯特拉顿所说,您应该添加该评论作为答案。这说得通。我得想个更好的办法。
  • +1 既然我明白了你的理由,我认为这是一个更好的问题。

标签: c# vb.net email header


【解决方案1】:

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

所以,如果它看起来可疑,服务器将覆盖此标头对我来说是有意义的。我不知道这是否是实际发生的事情,但我敢打赌@Lasse V. Karlsen 是正确的。

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

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

已添加

@Lasse V. Karlsen - 我认为你应该张贴你的笔记作为答案,这样你才能得到它的功劳。

【讨论】:

  • 我正在开发一个电子邮件集成组件,该组件利用 UID 和“最后处理”日期来定位要集成的第一封新电子邮件。我想测试多个电子邮件具有完全相同的日期/时间的情况 - 因为电子邮件集成模块应该完美地处理这些情况。如果我可以像那样简单地伪造日期,我可以发送尽可能多的与特定日期/时间匹配的电子邮件,而不是尝试使用自动脚本发送它们——希望它们都能在同一秒内收到.
  • 看来我必须想出一个更好的方法来做到这一点。
  • +1 给评论者进行测试!可能有一种方法可以为集成组件生成或模拟邮件消息,这样您就不必通过邮件服务器实际发送它们来测试该部分。您仍然可以在适当的邮件服务器上进行集成测试,但这些特定测试作为独立的单元测试可能会更好。
  • 以防万一有人感兴趣,似乎 SmtpClient(不是 smtp 服务器)在执行 .Send() 方法期间更改了消息的“Date”标头。
  • 这样做有非恶意的理由。一个例子:客户希望我们系统过去发送的电子邮件放入他们的电子邮件档案中。我们将信息存储在我们的数据库中。我们可以从我们的数据库中重建电子邮件。如果能够将电子邮件的日期与它们实际发送的历史日期相匹配,那就太好了。
【解决方案2】:

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

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

我尝试(未成功)设置此值的原因是因为我需要知道它以获取不同的计算标题。我想“足够接近”将不得不这样做。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多