Обработка электронной почты из 7-битной кодировки outlook приводит к смешным символам
Я работаю над проектом, где я создаю свой собственный SMTP-сервер. (пожалуйста, никто не спрашивает почему или не предоставляет мне такие вещи, как Postfix, у меня есть свои причины).
Это в основном работает нормально, за исключением Outlook, кажется, есть некоторая проблема с кодированием данных, которые я кодирую из Outlook.
Я продолжаю получать контент следующим образом:
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
Вместо:
<html xmlns:v="urn:schemas-microsoft-com:vml" =
xmlns:o="urn:schemas-microsoft-com:office:office" =
xmlns:w="urn:schemas-microsoft-com:office:word" =
Обратите внимание, что 3D не присутствует в допустимом контенте.
У меня есть функция, которая слушает сокет для данных SMTP, который выглядит следующим образом:
if (stream.CanRead)
{
byte[] serverData = new byte[1024];
StringBuilder stringBuilder = new StringBuilder();
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = stream.Read(serverData, 0, serverData.Length);
Encoding encoding = Encoding.GetEncoding("UTF-7", new FallbackEncoding(), new FallbackDecoding());
stringBuilder.AppendFormat("{0}", encoding.GetString(serverData, 0, numberOfBytesRead));
} while (stream.DataAvailable);
return stringBuilder.ToString();
В моей функции FallbackDecoding у меня есть следующий код
class FallbackDecoding : DecoderFallback
{
public override int MaxCharCount
{
get
{
return 1;
}
}
public override DecoderFallbackBuffer CreateFallbackBuffer()
{
return new Buffer();
}
private class Buffer : DecoderFallbackBuffer
{
private int _fallbackIndex;
private string _fallbackString;
public override int Remaining
{
get
{
return _fallbackString.Length - _fallbackIndex;
}
}
public override bool Fallback(byte[] bytesUnknown, int index)
{
byte unknownChar = bytesUnknown[index];
_fallbackString = Encoding.ASCII.GetString(new[] { (byte)(unknownChar & 127) });
_fallbackIndex = 0;
return true;
}
public override char GetNextChar()
{
if (Remaining > 0)
{
return _fallbackString[_fallbackIndex++];
}
else
{
return '\0';
}
}
public override bool MovePrevious()
{
if (_fallbackIndex > 0)
{
_fallbackIndex--;
return true;
}
return false;
}
}
По какой-то причине резервный класс декодера вызывает исключение в функции public override bool Fallback
, Это исключение, потому что bytesunknown
имеет только 1 элемент в массиве, но index
Параметр равен 128, поэтому он выбрасывает индекс вне диапазона исключений, но я понятия не имею, почему.
Я попытался изменить ASCII на UTF-7, так как Outlook отправляет данные в 7 бит, но, похоже, это не имеет никакого значения.
Из-за HTML в электронном письме, которое я получаю, когда я передаю письмо, форматирование неверно, и иногда я просто получаю мусор в электронном письме.
Спасибо за любую помощь, которую вы можете предоставить.
ОБНОВИТЬ
Полные заголовки писем по запросу
Message-ID: <000d01d0dc52$0c0d4690$2427d3b0$@chrisboard.co.uk>
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_000E_01D0DC5A.6DD24AD0"
X-Mailer: Microsoft Outlook 15.0
Thread-Index: AdDcUeHbbPyOUTipQ462DEYroR+DWg==
Content-Language: en-gb
This is a multipart message in MIME format.
------=_NextPart_000_000E_01D0DC5A.6DD24AD0
Content-Type: text/plain;
charset="us-ascii"
Content-Transfer-Encoding: 7bit
This is the content of the message
------=_NextPart_000_000E_01D0DC5A.6DD24AD0
Content-Type: text/html;
charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
<html xmlns:v=3D"urn:schemas-microsoft-com:vml" =
xmlns:o=3D"urn:schemas-microsoft-com:office:office" =
xmlns:w=3D"urn:schemas-microsoft-com:office:word" =
xmlns:m=3D"http://schemas.microsoft.com/office/2004/12/omml" =
xmlns=3D"http://www.w3.o
1 ответ
Цитируемый и ASCII текст с длинными строками и =
Вложение html кодируется с использованием цитируемой для печати кодировки. Quoted-printable использует специальные 3-байтовые последовательности, начинающиеся с =
, Цитируемые печатные коды =
как =3D
, Это единственный печатный символ ascii (33-126), который должен быть закодирован.
КСТАТИ =
в конце строки также является продуктом quoted-printable
кодирование. Это "ломает" длинные очереди.