Как я могу отправить электронное письмо с прошедшей датой из .NET?
Вопрос
Я попытался выполнить это с помощью MailMessage.Заголовки.Установить вызов, в 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, а также в заголовке, доступ к которому я получаю через пункт "Параметры" в контекстном меню для этого электронного письма.
Что я делаю не так?У меня такое чувство, что я упустил что-то очевидное...
Чтобы было ясно:Я такой и есть нет делаю это со злым умыслом.Я работаю над компонентом интеграции электронной почты, который использует как пользовательские идентификаторы, так и дату "Последней обработки", чтобы найти первое новое электронное письмо для интеграции.Я хочу протестировать случаи, когда несколько электронных писем имеют точно такую же дату / время, поскольку модуль интеграции электронной почты должен безупречно справляться с этими ситуациями.Если бы я мог просто подделать дату таким образом, я мог бы отправлять столько электронных писем, сколько хотел, которые соответствуют определенной дате / времени, вместо того, чтобы пытаться отправить их с помощью автоматического скрипта, надеясь, что все они будут получены в течение одной секунды.Однако, похоже, мне нужно будет применить другой подход.
Решение
Добавление к @Lasse V.Примечание Карлсена: я думаю, что, скорее всего, SMTP-сервер переопределяет то, что вы вложили в сообщение в коде.Честно говоря, зачем вам вообще понадобилось делать так, чтобы электронное письмо выглядело так, как будто оно было отправлено в прошлом?Я не могу придумать ни одной причины, которая не была бы, по крайней мере, нечестной или, в худшем случае, злонамеренной.
Таким образом, для меня было бы разумно, если бы сервер перезаписал этот заголовок, если бы он выглядел подозрительно.Я не знаю, происходит ли это на самом деле, но я бы поспорил, что @Lasse V.Карлсен прав.
Если это так, возможным решением было бы изменить дату на SMTP-сервере на некоторую дату в прошлом (если вы управляете сервером и можете это сделать).
Тем не менее, мне интересно, зачем вам вообще понадобилось это делать.Не могли бы вы поподробнее?
Добавлено
@Lasse V.Карлсен: Я думаю, вам следует опубликовать свою заметку в качестве ответа, чтобы получить за это оценку.
Другие советы
Значение заголовка перезаписывается в классе Message при подготовке заголовков:
this.Headers.InternalAdd(MailHeaderInfo.GetString(MailHeaderID.Date), MailBnfHelper.GetDateTimeString(DateTime.Now, null));
Причина, по которой я пытаюсь (безуспешно) установить это значение, заключается в том, что мне нужно знать его для другого вычисляемого заголовка. Я думаю, "достаточно близко" придется сделать.
Вы можете добавить пользовательские заголовки в свойство Header; однако, не мало зарезервированных заголовков, включая дату. В документации говорится, что пользовательское значение для ограниченных заголовков будет отброшено или перезаписано. Подробнее здесь в MSDN