Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 41

Кодировка електронных писем

31.05.2015, 16:22. Показов 1245. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Делаю программу, где через POP3 принимает електронные сообщение. Прием сообщений работает, но когда открываю сообщение пишет вот такие кракозябры :
=D0=94=D0=BE=D0=B1=D1=80=D0=B8=D0=B9 =D0=B4=D0=B5=D0=BD=D1=8C, taras-123@gmail.com! =D0=94=D0=BB=D1=8F =D0=BF=D1=96=D0=B4=D1=82=D0=B2=D0=B5=D1= =80=D0=B4=D0=B6=D0=B5=D0=BD=D0=BD=D1=8F =D0=BF=D1=96=D0=B4=D0=BF=D0=B8=D1= =81=D0=BA=D0=B8 =D1=82=D1=80=D0=B5=D0=B1=D0=B0 =D0=BF=D0=B5=D1=80=D0=B5=D0= =B9=D1=82=D0=B8 =D0=B7=D0=BF =D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=BE=D1= 8E=20 http://www.vegatele.com/ukr/for_subscriber/ve= gazeta/email_sign_gazeta/success_activate1?id=3D1917333
Для приема сообщений использую следующие классы (ниже прикрепленны файлы).
Пробовал менять кодировку в методах Write() и Response() - некоторые сообщения читались (например от Webmoney), но большыство писем с кракозябрами и как не пробовал не работает.
Вот так вывожу текст письма:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void InputMessage_Shown(object sender, EventArgs e)
        {
            string html;
            if (msg.ContentType == "text/plain")
                html = msg.BodyText;
            else
                html = msg.BodyHtml;
            textInputFrom.Text = Crypt.DecodeEncodedWordValue(msg.From);
            textInputSubject.Text = Crypt.DecodeEncodedWordValue(msg.Subject);
            textInputSendTo.Text = Crypt.DecodeEncodedWordValue(msg.To);
            labDateText.Text = msg.Date.ToString();
            webBrowser1.Navigate("about:blank");
            webBrowser1.Document.Write(html);
 
 
        }
Crypt.DecodeEncodedWordValue(string source) - метод для перевода темы и отправителя письма из кодировки quoted printable, он работает(хотя в одиночных случаях выдает "вопросики" - скриншот ниже). Для тела сообщение не работает.
Помогите, пожалуйста! Мне только с этой кодировкой осталось разобраться...
Миниатюры
Кодировка електронных писем  
Вложения
Тип файла: rar POP3.rar (4.3 Кб, 6 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2015, 16:22
Ответы с готовыми решениями:

Кодировка писем
Возникла необходимость получить содержимое моих e-mail. Все они в разных кодировках, кто в Windows-1251, кто в UTF-8. Как я понимаю,...

Кодировка писем
Здравствуйте, рассылая почту модулем Net::SMTP или Сендмейлом письма в разных почтовых клиентах требуется перекодировать. Так, для MS...

Кодировка писем mail.ru
Добрый день всем.Мне нужна Ваша помощь ( я сама не программист).суть вопроса и помощи в след.У меня почта mail.ru агент-с недавних пор...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18261 / 14186 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
31.05.2015, 17:08
CyberMaks, в приложенном архиве нет класса Crypt. Там даже нет проекта на котором можно что-то проверить. Просто набор *.cs файлов. Выложи проект в котором можно воспроизвести неправильное поведение. Или хотя бы покажи код класса Crypt.
0
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 41
01.06.2015, 02:23  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
CyberMaks, в приложенном архиве нет класса Crypt. Там даже нет проекта на котором можно что-то проверить. Просто набор *.cs файлов. Выложи проект в котором можно воспроизвести неправильное поведение. Или хотя бы покажи код класса Crypt.
вот рабочий проект. Проблема всего лиш в том что некоторые сообщения с кракозябрами...
Вложения
Тип файла: rar email.rar (97.9 Кб, 7 просмотров)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18261 / 14186 / 5366
Регистрация: 17.03.2014
Сообщений: 28,871
Записей в блоге: 1
01.06.2015, 14:55
CyberMaks, я не смог вопроизвести проблему на своей гугло-почте. Все руссские заголовки выводятся нормально. По ходу дела наткнулся на баг в методе Pop3Client.Response. Твоя реализция исходит из того чтобы длина ответа не более 1024 байтов и соответственно падает если это не так. Вот исправленная версия:
Pop3Client.Response()
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
internal string Response()
{
    UTF8Encoding utf8Encoding = new UTF8Encoding();
    byte[] array = new byte[1024];
    const int step = 1024;
    int num = 0;
    byte[] array2 = new byte[2];
    do
    {
        int num2 = m_stream.Read(array2, 0, 1);
        if (num2 != 1)
        {
            break;
        }
        if (num == array.Length)
        {
            byte[] tempArray = new byte[array.Length+step];
            Array.Copy(array, 0, tempArray, 0, num);
            array = tempArray;
        }
        array[num] = array2[0];
        num++;
    }
    while (array2[0] != 10);
    return utf8Encoding.GetString(array, 0, num);
}

Что касается кодировки, то возможно проблема возникает с многобайтовыми кодировками. Попробуй вот такую реализацию Crypt.DecodeEncodedWordValue:
Crypt.DecodeEncodedWordValue
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public static string DecodeEncodedWordValue(string mimeString) // перевод темы и отправителя письма из кодировки  quoted printable
{
    bool q = false;
 
    var regex = new Regex(@"=\?(?<charset>.*?)\?(?<encoding>[qQbB])\?(?<value>.*?)\?=");
    var encodedString = mimeString;
    var decodedString = string.Empty;
    while (encodedString.Length > 0)
    {
        var match = regex.Match(encodedString);
        if (match.Success)
        {
            decodedString += encodedString.Substring(0, match.Index);
            var charset = match.Groups["charset"].Value;
            var encoding = match.Groups["encoding"].Value.ToUpper();
            var value = match.Groups["value"].Value;
            if (encoding.Equals("B"))
            {
                // Encoded value is Base-64
                var bytes = Convert.FromBase64String(value);
                decodedString += Encoding.GetEncoding(charset).GetString(bytes);
            }
            else if (encoding.Equals("Q"))
            {
                // Encoded value is Quoted-Printable
                // Parse looking for =XX where XX is hexadecimal
                var regx = new Regex("(\\=([0-9A-F][0-9A-F]))+", RegexOptions.IgnoreCase);
                decodedString += regx.Replace(value, new MatchEvaluator(delegate(Match m)
                {
                    byte[] buf = m.Value.TrimStart('=').Split('=').Select(_ => Convert.ToByte(_, 16)).ToArray();
                    return Encoding.GetEncoding(charset).GetString(buf);
                }));
                decodedString = decodedString.Replace('_', ' ');
            }
            else
            {
                // Encoded value not known, return original string
                // (Match should not be successful in this case, so this code may never get hit)
                decodedString += encodedString;
                break;
            }
            // Trim off up to and including the match, then we'll loop and try matching again.
            encodedString = encodedString.Substring(match.Index + match.Length);
        }
        else
        {
            // No match, not encoded, return original string
            decodedString += encodedString;
            break;
        }
    }
 
    return decodedString;
}

Здесь два отличия от твоей реализации:
  • Строка №27. В регулярном выражении добавлен плюс чтобы выражение возвращало последовательность байтов;
  • Строка №30-31. MatchEvaluator декодирует байты целой группой что является правильным подходом для многобайтовых кодировок.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.06.2015, 14:55
Помогаю со студенческими работами здесь

Кодировка писем со вложением
Здраствуйте! Ниже представлен код для отправки письма со вложением. Как поменять кодировку для того, что бы вместо кракозяб были руские...

Кодировка заголовков E-mail писем
Здравствуйте. Читаю заголовки (тему) email письма через TextView и получаю такой эффект: Какой-нибудь русский...

Кодировка при отправке писем через Outlook
Доброго времени суток!!! Суть проблемы в том, что при отправке писем из Excel через Outlook происходит следующее. Если Outlook открыт, то...

Кодировка при отправке писем с использованием функции mail()
Уважаемые форумчане, подскажите что мне сделать с этой непутевой функцией. $headers = 'Content-type: text/html; charset=utf-8' ....

Кодировка программы и кодировка базы данных
В общем в архиве стандартный пример и одна из программ по редактированию sqlite. Проблема заклчается в следующем: при редактировании...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru