Synapse + SMTP, кодировка

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 14:31:32

В общем уже какой день сижу разбираюсь. Удалось просто отправлять письма + самому добавлять нужные данные для почтовика (rfc-822) через модуль smtpsend. Но потом понял что это не подходит. Мне нужно еще кодировку имень нормальную. Копнул глуюже и пришел к mimemess. И вот почти все готово, но не получается никак задать кодировку. Вот что имею:

Код: Выделить всё
var
  MIME: TMimemess;
  AddTextMess: TMimepart;
  Priority: TMessPriority;

begin
    Priority := MP_high;
    MIME := TMimemess.Create;
    AddTextMess := MIME.AddPartMultipart('mixed', nil);
    MIME.AddPartText(TextMess.Lines, AddTextMess);
    MIME.Header.Priority := Priority;
    MIME.Header.From := From.Text;
    MIME.Header.ToList.Add(SendTo.Text);
    MIME.Header.Subject := Subject.Text;
    MIME.Header.Organization := 'TEST';
    MIME.Header.CharsetCode := synachar.CP1251;
    MIME.EncodeMessage;
    SendToRaw(From.Text, SendTo.Text, IP.Text, MIME.Lines, Login.Text, Password.Text);
    MIME.Destroy;
end;


1. Кодировка не соответствует действительности. Приходит вот с этим Subject: =?ISO-8859-5?Q?=C0=A6=C1=5F=C0=A6=C1=5F=C1=5F_=C0=A6?=.

В сети встречал вопросы на тему кодировок. Ну без исходников. Тут даже вроде делать нечего, а не работает.

зы
И еще один вопрос: чем сейчас пользоваться для разработки приложений для сети? Есть indy, synapse, lnet. Но все они как я понял уже давно не обновлялись.
Последний раз редактировалось modjo 15.01.2010 14:44:13, всего редактировалось 2 раз(а).
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение Alexx2000 » 15.01.2010 14:40:46

modjo писал(а):И еще один вопрос: чем сейчас пользоваться для разработки приложений для сети? Есть indy, synapse, lnet. Но все они как я понял уже давно не обновлялись.

Вообще-то Synapse последний раз обновлялся совсем недавно, а именно 09.10.2009
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 14:41:33

Все, с текстом разобрался как добавлять. Поправил пост. А вот кодировку пока не знаю.

Про то что сенапс давно не обновлялся погорячился - 2009-10-09 - release no. 39 synapse.zip (694.05 KiB, 6660 downloads)...

Добавлено спустя 44 секунды:
Alexx2000
Пока писал текст ты уже ответил ... :oops:
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение Mr.Smart » 15.01.2010 15:50:53

modjo
=?ISO-8859-5?Q?=C0=A6=C1=5F=C0=A6=C1=5F=C1=5F_=C0=A6?= - это строка с указанием кодировки текста (ISO-8859-5) типом кодирования в 7 -ми битное представление (Q) и непосредственно закодированный текст (=C0=A6=C1=5F=C0=A6=C1=5F=C1=5F_=C0=A6)
разберём эту строку
  • ISO-8859-5 - кодировка (это я думаю понятно :wink: )
  • Q - метод кодирования исходной строки в данном случае Quoted-Printable (почитать можно здесь)
    так же может встречаться тип B - это кодировка Base64.
  • =C0=A6=C1=5F=C0=A6=C1=5F=C1=5F_=C0=A6 - соответственно строка, которую необходимо сначала преобразовать по выше указанному алгоритму.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 16:01:29

Mr.Smart
Но я сам ничего не декодирую. Я только формирую письмо. А клиент его в таком виде получает. Мне вот интересно как добится чтоб письмо приходило с Subject: =?windows-1251?B?z/Du8fzh4A==?=, например. Т.е. получается что почтовик не понимает ISO-8859-5.
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение Mr.Smart » 15.01.2010 16:05:57

Про это сказать не могу т.к. сам не использовал обёртку для MIME из Synaspse. Когда была задача программно отправлять письма - все заголовки и команды я реализовывал через чистый TBlockSocket. Вообще не люблю пользоваться чужими обёртками и привык всё делать руками :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 16:09:24

Ну я еще не дорос до этого... :)
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение Mr.Smart » 15.01.2010 16:14:23

Если вы посмотрите функцию InlineEncode из модуля mimeinln, то увидите что она поддерживает только Quoted-Printable кодирование.

Добавлено спустя 4 минуты 20 секунд:
modjo
И ещё на заметку.
Код: Выделить всё
MIME.Destroy;

Не вызывайте данный метод на прямую из кода! Пользуйтесь методом Free для уничтожения объектов!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 16:23:59

С чем это связано (MIME.Destroy;)?
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение Mr.Smart » 15.01.2010 16:30:56

Метод Free перед вызовом деструктора проверят значение самого объекта (self) на придмет не равности nil и если он равен nil то ни чего не происходит.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Synapse + SMTP, кодировка

Сообщение modjo » 15.01.2010 16:59:34

Спасибо, учту.

Осталось разобраться с кодировкой....

Добавлено спустя 1 час 36 минут 14 секунд:
В общем пришел вот к этому:

Код: Выделить всё
var
  MIME: TMimemess;
  Priority: TMessPriority;

begin
  Priority := MP_high;
  MIME := TMimemess.Create;
  MIME.Header.CharsetCode := synachar.UTF_8;                         // Кодировка. НЕ РАБОТАЕТ.
  MIME.AddPartText(TextMess.Lines,nil);
  MIME.Header.Priority := Priority;
  MIME.Header.From := From.Text;
  MIME.Header.ToList.Add(SendTo.Text);
  MIME.Header.Subject := Subject.Text;
  MIME.Header.Organization := 'TEST;
  MIME.EncodeMessage;
  if SendToRaw(From.Text, SendTo.Text, IP.Text, MIME.Lines, Login.Text, Password.Text) then
    Info.Lines.Add('Письмо отправлено')
  else
    Info.Lines.Add('Письмо не отправлено');
  MIME.Free;
end;


В результате From: "=?ISO-8859-5?Q?=BA=E0= .... Читается в TheBat... Странно Получается кодировка одна,
а на самом деле другая. Ну и остальные поля нормально. А вот сам текст сообщения не читается...
modjo
новенький
 
Сообщения: 92
Зарегистрирован: 19.07.2009 15:52:10
Откуда: Москва

Re: Synapse + SMTP, кодировка

Сообщение serpan » 19.03.2010 09:56:35

Долго возился с кодировками, и вынужденно решил проблему в лоб.
В модуле mimeinln.pas в функции InlineCodeEx строчку
Код: Выделить всё
c := IdealCharsetCoding(Value, FromCP, IdealCharsets);

поменял на такую:
Код: Выделить всё
c := UTF_8;

В том же модуле, в функции NeedInline строчку
Код: Выделить всё
if Value[n] in (SpecialChar + NonAsciiChar - ['_']) then

поменял на такою:
Код: Выделить всё
if not (Value[n] in ['0'..'9', 'A'..'Z', 'a'..'z']) then

Все. Забыл о проблемах с кодировкой в заголовке.
serpan
незнакомец
 
Сообщения: 1
Зарегистрирован: 19.03.2010 09:45:22


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

Рейтинг@Mail.ru