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

StackOverflow https://stackoverflow.com/questions/1407962

  •  05-07-2019
  •  | 
  •  

Вопрос

Я попытался выполнить это с помощью 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top