Система. Сеть. Почта и =? utf-8? B? XXXXX … заголовков

22
задан shA.t 1 October 2018 в 08:20
поделиться

3 ответа

Когда Ваш предмет содержит символы вне диапазона ASCII, тогда почтовое программное обеспечение должно закодировать их (почта RFC2822 не разрешает символы неASCII в заголовках). Существует два способа сделать это:

  • Заключенный в кавычки Печатаемый (предмет запускается с "=?utf-8?Q")
  • Base64 (предмет запускается с "=?utf-8?B")

кажется, что платформа полагала, что кодирование Base64 более эффективно (=shorter), чем заключенный в кавычки - печатаемое кодирование. Это имеет смысл, когда Ваш предмет содержит относительно много символов вне диапазона ASCII.

Для ответа на вопрос: Вы ничего не делаете неправильно. Это - то, как интернет-почта с символами неASCII, как предполагается, похожа. Конечно, программное обеспечение, которое читает такую почту, должно обнаружить и декодировать такие поля темы.

35
ответ дан shA.t 29 November 2019 в 04:12
поделиться

Ответ мог бы быть в остальной части обрезанного предмета - раздел, который Вы обеспечили, декодирует как" [p13n] Файл", но, у Вас есть любые символы неASCII там, тогда я ожидал бы, что он закодирует, как это имеет

2
ответ дан Rowland Shaw 29 November 2019 в 04:12
поделиться

Я наткнулся на это сообщение, когда отлаживал идентичную проблему, и, основываясь на моих дальнейших исследованиях, могу дать альтернативное объяснение Андреасу:

Проблема может заключаться в том, что ваш адрес электронной почты клиентское программное обеспечение (в моем случае Outlook 2003) неправильно расшифровывает тему письма. Другими словами, это ошибка в Outlook, а не в .NET или вашей программе.

Если вы используете такое значение темы (буква «c» повторяется 256 раз), это нормально отображается в Outlook:

subject = New String("c"c, 256)

Аналогично , если вы используете такую ​​тему (буква «c» повторяется 178 раз с добавленным неразрывным пробелом Unicode), она также отображается в Outlook, как и ожидалось:

subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160})

Однако следующая тема отображается как «=? utf-8? B "мусор в Outlook:

subject = New String("c"c, 179) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160})

Разница в том, что эта третья строка темы имеет размер 256 байт при кодировке UTF-8. Я предполагаю, что Outlook должен обрезать строку темы до 255 символов перед ее отображением ... что было бы хорошо, за исключением того, что он делает это, усекая закодированную строку до 255 байтов, что отсекает терминатор кодировки ("? =") , что делает его не декодируемым.

Это ошибка Outlook, а не вашего почтового провайдера или .NET; вы можете увидеть полную строку темы в кодировке UTF-8 в Outlook, щелкнув правой кнопкой мыши сообщение в списке сообщений и выбрав «Параметры ...» в контекстном меню, а затем прокрутив вниз поле «Заголовки Интернета» до вы видите строку, начинающуюся с «Тема:».

В отличие от ситуации, предложенной Андреасом, проблема проявляется не только при наличии большого количества символов, отличных от ASCII, но и при наличии одного или нескольких символов, отличных от ASCII, и при длинной строке темы. Обходной путь может заключаться в использовании более короткой строки темы или удалении всех не-ASCII символов в вашей теме.

(Эту ошибку мне было особенно сложно отследить, потому что, как и выше, данные о проблеме не содержали очевидных не -ASCII-символы - всего несколько неразрывных пробелов. Они отображаются так же, как обычные пробелы ASCII, когда вы выводите их на консоль. Более того, если вы измените значение строковой переменной в отладчике Visual Studio, она автоматически заменит их с регулярными пространствами.)

14
ответ дан 29 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: