2010-03-15 3 views
5

Я использую .NET SmtpClient для отправки электронной почты, где объект может содержать символы вне диапазона ASCII. RFC 2047 определяет, как текст электронной почты должен быть закодирован, когда он содержит специальные символы. Ниже приведен пример субъекту в заголовке электронной почты:SmtpClient (.NET) не кодирует почтовый заголовок в соответствии с RFC 2047

Subject: Votre enregistrement numéro 123

Это должно стать, после кодирования в ISO-8859-1:

Subject: =?iso-8859-1?Q?Votre=20enregistrement=20num=E9ro=20123?=

где все специальные символы, включая ?, = (и другие) и wh ite space, кодируются с помощью escape-последовательности =xx.

Однако, когда я смотрю на то, что SmtpClient производит, я обнаружил, что он не избежать пробелов, что означает, что почтовый клиент получает этот заголовок:

Subject: =?iso-8859-1?Q?Votre enregistrement num=E9ro 123?=

значение, кодировка нарушена в отношении (моего чтения) RFC 2047. Некоторые клиенты электронной почты совершенно довольны этой неправильной кодировкой (большинство из них, в том числе Outlook и gmail), но один (wanadoo.fr) отображает заголовка в необработанном формате. Это не то, что пользователь должен получить, чтобы увидеть :-(

Есть ли известный способ решения этой проблемы

Примечание: реализация .NET 4.0 SmtpClient кодирует объект, как ожидается, что дает этот выход , который является правильным:

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=

+0

у меня нет для вас решение, но я подтвердит вашу интерпретацию RFC 2047, в частности раздел 4.2 (3): «В частности, SPACE и TAB НЕ ДОЛЖНЫ быть представлены как сами в закодированных словах». (Обратите внимание, что вместо = 20 вы также можете использовать символ подчеркивания) – Joe

+0

+1 для большой проблемы/поднятой проблемы, и что вы на самом деле ссылаетесь на соответствующий RFC, вы сделали домашнее задание и все еще имеете проблему для разрешения – curtisk

+0

. или вы разрешаете SmtpClient работать по умолчанию? – Timores

ответ

3

проблема заключается в том, что SMTP отправитель использует общие экранированные кавычки прили кто ничего не знает о специальном режиме для заголовков, поэтому я подозреваю, что не будет простого обходного пути.

Что бы я сделал, это проверить, нет ли каких-либо символов, отличных от ASCII, чтобы объект был закодирован, и, если это так, замените пробелы символами подчеркивания (ASCII 95). Это должно работать, потому что символ подчеркивания должен интерпретироваться как пространство почтовым читателем, но не должен кодироваться наивным кодировщиком. Может быть, этот код будет работать:

string FixSubject(string subject) 
{ 
    foreach (char ch in subject) 
     if (ch > '\x007f') 
      return subject.Replace(" ", "_"); 
    return subject; 
} 

Другая возможность состоит в том, чтобы установить кодировку вашей электронной почты в Unicode или UTF-8, потому что, кажется, чтобы вызвать Base64 кодирование заголовков вместо кавычко печати. Использование другого кодировщика должно вообще избегать ошибки.

+0

Действительно, при замене пространства подчеркиванием в объекте создается правильный заголовок. –

+1

Этот хак больше не нужен с .NET 4.0. –

1

Это было исправлено в реализации NET 4.0 SmtpClient.Он кодирует объект, как ожидается, что дает этот выход, который является правильным:

Subject: =?Windows-1252?Q?Votre_enregistrement_num=E9ro_123?=

 Смежные вопросы

  • Нет связанных вопросов^_^