System.Net.Mail создание недействительных писем и файлов EML? Вставка дополнительных точек в имена хостов
Похоже, что.NET SmtpClient создает электронные письма с дополнительной точкой в именах хостов, если точка должна была появиться в начале строки, закодированной в MIME (например, test.com иногда отображается как test..com). Пример кода:
[TestMethod]
public void TestEmailIssue()
{
var mail = new System.Net.Mail.MailMessage();
var smtpClient = new System.Net.Mail.SmtpClient();
mail.To.Add("Test@test.com");
mail.Subject = "Test";
mail.From = new System.Net.Mail.MailAddress("test@test.com");
mail.Body = "Hello this is a short test of the issue:"
+" <a href='https://test.com/'>https://test.com/</a>: ";
smtpClient.PickupDirectoryLocation = "C:\\temp\\";
smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
smtpClient.Send(mail);
}
Это создает файл.eml, который выглядит следующим образом:
X-Sender: test@test.com
X-Receiver: Test@test.com
MIME-версия: 1.0
От: test@test.com
Кому: Test@test.com
Дата: 6 июля 2011 15:55:28 -0400
Тема: Тест
Тип контента: текстовый / простой; Charset = US-ASCII
Content-Transfer-Encoding: цитируемый для печати
Здравствуйте, это краткий тест проблемы: https: // test =
..com / '> https://test.com/: = 20
При отправке файла или открытии в Outlook (или любой другой программе) отображаются двойные точки (т. Е. Test..com). Обратите внимание, что если я уберу лишний пробел (в "is a"), этот test.com будет отображаться правильно, поскольку точка больше не появляется в начале строки.
Это вызывает проблемы при попытке отправить адреса веб-сайтов, и мы получаем звонки от клиентов, которые говорят, что они не могут нажимать на наши ссылки.
Кто-нибудь еще испытывал это? Как мы можем решить эту проблему, кроме написания нашей собственной кодировки?
3 ответа
Фактически это соответствует RFC 2821 (4.5.2 Прозрачность).
Перед отправкой строки почтового текста SMTP-клиент проверяет первый символ строки. Если это период, один дополнительный период вставляется в начало строки.
.Net просто хранит файл в режиме "готовности к передаче", что означает, что ему не нужно перед отправкой перебирать письмо, вместо этого он может передать его как есть. К сожалению, этот формат не на 100% совпадает с форматом Outlook Express EML. Вы должны иметь возможность установить кодировку UTF-8 (или что-то подобное), и это добавит вам кодировку Base-64.
mail.BodyEncoding = System.Text.Encoding.UTF8;
В.Net 2.0
X-Sender: test@test.com
X-Receiver: Test@test.com
MIME-Version: 1.0
From: test@test.com
To: Test@test.com
Date: 6 Jul 2011 21:29:04 +0100
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
Hello this is a short test of the issue: <a href=3D'https://test.com/'>https://test.com/</a>:=
Похоже, что это оборачивает текст определенной длины символа в строке. Я смутно помню, что была проблема в.Net 2.0, где по умолчанию это не происходит, что может вызвать проблемы со спам-фильтрами.
Фактически увеличение размера сообщения дает в.Net 4.0 следующее:
X-Sender: test@test.com
X-Receiver: Test@test.com
MIME-Version: 1.0
From: test@test.com
To: Test@test.com
Date: 6 Jul 2011 21:34:21 +0100
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
Hello this is a short test of the sssssssssssssssssissue: <a hre=
f=3D'https://test.com/'>https://test.com/</a>:=20
Похоже, ошибка.
Обходной путь может состоять в том, чтобы изменить BodyEncoding на что-то отличное от ASCII.
Глядя на исходный код.NET 4, возможно, то, что вы испытываете, как-то связано с методом MailWriter.WriteAndFold. Также в классе MailWriter есть
static int writerDefaultLineLength = 76
переменная, означающая количество символов в строке. Возможно, потому что вы удалили один лишний пробел, он начал работать.