Como posso enviar um e-mail com uma data passada do .NET?
Pergunta
Eu tentei alcançar este objetivo através de uma chamada MailMessage.Headers.Set, em VB.net. Veja abaixo:
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)
I confirmou que a chamada objMail.Headers.Set está realmente trabalhando - se eu conseguir o valor mais tarde, foi alterada com sucesso. Meu problema é que quando eu receber o e-mail no Outlook do TEST_EMAIL_ADDRESS, a data é 2009 em todos os lugares, e não 1999. Bem ali, na interface do Outlook, e também no cabeçalho, que eu acesso através do "Opções" item no contexto menu para que o e-mail.
O que estou fazendo de errado? Eu tenho um sentimento que eu perdi algo óbvio ...
Para ser claro: eu sou não fazer isso com intenção maliciosa. Eu estou trabalhando em um componente de integração de e-mail que utiliza ambos os UIDs e uma "Última processados" data para localizar o primeiro novo e-mail para integrar. Quero casos de teste, onde vários e-mails têm exatamente a mesma data / hora - como o módulo de integração de e-mail deve lidar com essas situações perfeitamente. Se eu pudesse simplesmente falso a data desta forma, eu poderia enviar como muitos e-mails como eu queria que corresponde a uma determinada data / hora, ao invés de tentar enviá-los com um script automatizado - esperando que todos eles vão ser recebidos dentro do mesmo segundo . Parece que vou precisar para tomar uma outra abordagem, no entanto.
Solução
Adicionando sobre a nota de @Lasse V. Karlsen, eu acho que provavelmente o servidor SMTP está substituindo o que você colocar a mensagem em código. Em toda a honestidade, por que você ainda precisa fazer um olhar de e-mail como ela foi enviada no passado? Eu não posso pensar de uma única razão que não é desonesto, pelo menos, ou maliciosa, na pior.
Assim, não faria sentido para mim que o servidor iria substituir este cabeçalho se ele parecia suspeito. Eu não sei se é o que está realmente acontecendo, mas eu apostaria que @Lasse V. Karlsen está correto.
Se assim for, uma possível solução seria a de alterar a data no servidor SMTP para alguma data no passado (se você controlar o servidor e são capazes de fazê-lo).
Ainda assim, eu estou querendo saber por que você iria querer mesmo fazer isso. Você pode elaborar?
Adicionado
@Lasse V. Karlsen - Eu acho que você deve postar sua nota como a resposta de modo a obter o crédito para ele
.Outras dicas
O valor de cabeçalho está sendo substituído na classe mensagem ao preparar cabeçalhos:
this.Headers.InternalAdd(MailHeaderInfo.GetString(MailHeaderID.Date), MailBnfHelper.GetDateTimeString(DateTime.Now, null));
A razão que eu estou tentando (sem sucesso) definir esse valor é porque eu preciso saber que para um cabeçalho calculado diferente. Eu acho que "perto o suficiente" terá que fazer.
Você pode adicionar cabeçalhos personalizados para a propriedade de cabeçalho; no entanto, não para alguns cabeçalhos reservados, incluindo Data. Os estados de documentação que o valor personalizado para cabeçalhos restritas serão descartados ou substituído leia mais aqui no MSDN