Обработка электронной почты из 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 кодирование. Это "ломает" длинные очереди.

Другие вопросы по тегам