Как я могу отправить электронное письмо с прошедшей датой из .NET? - PullRequest
6 голосов
/ 11 сентября 2009

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

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

Чтобы было ясно: я не делаю это со злым умыслом. Я работаю над компонентом интеграции электронной почты, который использует как UID, так и дату «последней обработки», чтобы найти первое новое электронное письмо для интеграции. Я хочу протестировать случаи, когда несколько писем имеют одинаковую дату / время - поскольку модуль интеграции электронной почты должен безупречно справляться с этими ситуациями. Если бы я мог просто подделать дату таким образом, я мог бы отправлять столько электронных писем, сколько я хотел, которые соответствуют определенной дате / времени, вместо того, чтобы пытаться отправить их с помощью автоматического сценария - надеясь, что все они будут получены в течение одной секунды , Кажется, мне нужно будет использовать другой подход.

Ответы [ 3 ]

2 голосов
/ 11 сентября 2009

Добавляя к заметке @Lasse V. Karlsen, я думаю, что, скорее всего, SMTP-сервер переопределяет то, что вы помещаете в сообщение в коде. Честно говоря, зачем вам нужно, чтобы электронное письмо выглядело так, как будто оно было отправлено в прошлом? Я не могу вспомнить ни одной причины, которая, по крайней мере, не является нечестной или, в худшем случае, злой.

Итак, для меня будет иметь смысл, что сервер перезапишет этот заголовок, если он будет выглядеть подозрительно. Я не знаю, так ли это на самом деле, но могу поспорить, что @Lasse V. Karlsen правильно.

Если это так, возможным решением было бы изменить дату на SMTP-сервере на какую-то дату в прошлом (если вы управляете сервером и можете это сделать).

Тем не менее, мне интересно, почему вы хотели бы даже сделать это. Вы можете уточнить?

Добавлена ​​

@ Лассе В. Карлсен - я думаю, что вы должны опубликовать свою заметку в качестве ответа, чтобы получить за это кредит.

1 голос
/ 25 февраля 2014

Вы можете добавить пользовательские заголовки в свойство Header; однако, не мало зарезервированных заголовков, включая дату. В документации говорится, что пользовательское значение для ограниченных заголовков будет отброшено или перезаписано. Подробнее здесь на MSDN

1 голос
/ 19 ноября 2010

Значение заголовка перезаписывается в классе Message при подготовке заголовков:

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

Причина, по которой я пытаюсь (безуспешно) установить это значение, заключается в том, что мне нужно знать его для другого вычисляемого заголовка. Я думаю, "достаточно близко" придется сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...