Как я могу отправить электронное письмо с прошлой датой 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