System.Net.Mail создание недействительных писем и файлов EML?Вставка дополнительных точек в имена хостов - PullRequest
29 голосов
/ 07 июля 2011

Похоже, что .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: quoted-printable

Здравствуйте, это краткий тест проблемы: https://test=

.. com / '> https://test.com/:=20

При отправке файла или открытии в Outlook (или любой другой программе) отображаются двойные точки (т. Е. Test..com).Обратите внимание, что если я удаляю лишний пробел (в "is a"), этот test.com отображается правильно, так как точка больше не появляется в начале строки.

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

Кто-нибудь еще испытывал это?Как мы можем решить эту проблему, кроме написания нашей собственной кодировки?

Ответы [ 3 ]

48 голосов
/ 07 июля 2011

На самом деле это RFC 2821 (4.5.2 Прозрачность)

Перед отправкой строки почтового текста SMTP-клиент проверяет первый символ строки.Если это период, один дополнительный период вставляется в начало строки.

.Net просто хранит файл в режиме «готовности к передаче», что означает, что ему не нужноОбезьяна с электронной почтой перед отправкой, вместо этого она может передать его как есть.К сожалению, этот формат не на 100% совпадает с форматом Outlook Express EML.Вы должны иметь возможность установить кодировку UTF-8 (или что-то подобное), и это добавит вам кодировку Base-64.

mail.BodyEncoding = System.Text.Encoding.UTF8;
4 голосов
/ 07 июля 2011

В .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.

1 голос
/ 07 июля 2011

Глядя на исходный код .NET 4, может быть, то, что вы испытываете, связано с методом MailWriter.WriteAndFold. Также в классе MailWriter есть

static int writerDefaultLineLength = 76

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...