Как я могу отправить электронное письмо с прошлой датой from.NET?

Я попытался сделать это с помощью MailMessage.Заголовки.Установить вызов, in VB.net - ... См. ниже:

    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.Заголовки.Set call фактически работает - если я получу значение после этого, оно было успешно изменено. Моя проблема в том, что когда я получаю электронное письмо в Outlook TEST_EMAIL_ADDRESS, дата везде 2009, а не 1999. Прямо там, в интерфейсе Outlook, а также в заголовке, к которому я обращаюсь через пункт "Параметры" в контекстном меню за это письмо.

что я делаю не так? У меня такое чувство, что я пропустил что-то очевидное...

чтобы быть ясным: я не делаешь это со злым умыслом. Я работаю над компонентом интеграции электронной почты, который использует как uid, так и дату "последней обработки", чтобы найти первое новое электронное письмо для интеграции. Я хочу протестировать случаи, когда несколько электронных писем имеют одинаковую дату / время - поскольку модуль интеграции электронной почты должен обрабатывать эти ситуации безупречно. если я я мог бы просто подделать дату таким образом, я мог бы отправить столько электронных писем, сколько хотел, что соответствует определенной дате/времени, а не пытаться отправить их с автоматическим сценарием-надеясь, что все они будут получены в течение одной секунды. Но, похоже, мне придется применить другой подход.

3 ответов


добавляя к заметке @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; однако не к нескольким зарезервированным заголовкам, включая Date. В документации указано, что пользовательское значение для ограниченных заголовков будет отброшено или перезаписано подробнее здесь на MSDN