Я наткнулся на этот пост, когда отлаживал идентичную проблему, и на основании моих дальнейших исследований я могу дать альтернативное объяснение Андреасу:
Проблема может заключаться в том, что программное обеспечение вашего почтового клиента (в моем случае Outlook 2003) неправильно декодирует строку темы. Другими словами, это ошибка в Outlook, а не в .NET или вашей программе.
Если вы используете значение темы, подобное этому (буква «с» повторяется 256 раз), в Outlook оно отображается нормально:
subject = New String("c"c, 256)
Аналогичным образом, если вы используете тему, подобную этой (буква «с» повторяется 178 раз, с добавленным символом неразрывного пробела в Юникоде), она также отображается, как и ожидалось в Outlook:
subject = New String("c"c, 178) + System.Text.Encoding.UTF8.GetChars(New Byte() {194, 160})
Однако следующая тема отображается в Outlook как «=? Utf-8? B»:
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, щелкнув правой кнопкой мыши сообщение в списке сообщений и выбрав «Параметры ...» в контекстном меню, а затем прокручивая вниз в поле «Заголовки Интернета» до Вы видите строку, начинающуюся с "Subject:".
Вопреки ситуации, которую предлагает Андреас, проблема проявляется не только тогда, когда имеется много символов не-ASCII, но когда есть один или несколько символов не-ASCII и строка темы длинная. Обходной путь может заключаться в том, чтобы использовать более короткую строку темы или удалить все символы, не входящие в ASCII, в вашей теме.
(Эта ошибка была особенно сложной для меня, чтобы отследить, потому что, как и выше, проблемные данные не содержали очевидных не-ASCII-символов - только несколько неразрывных пробелов. Они отображают то же, что и обычные ASCII-пробелы при печати их вывод на консоль. Более того, если вы измените значение строковой переменной в отладчике Visual Studio, он автоматически заменит их обычными пробелами.)