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

переменная, означающая количество символов в строке. Возможно, потому что вы удалили один лишний пробел, он начал работать.

Другие вопросы по тегам