Конференция "Сети" » Проблема с темой письма в TIdSMTP [D7]
 
  • Антон80 (04.01.10 22:02) [0]
    Прошу помощи у Мастеров. Всю голову уже сломал за 2 дня поиска и проб. Проблема в следующем:
    Отправляю письмо из своей программы (не спамогенератор!), используя TIdSMTP (Indy 9.00.10). В теме письма должен быть определенный текст (не короткий, символов 50-60) на русском языке. Проблему кодировки победил функцией EncodeHeader. Но вот теперь при отправке письма почтовик вставляет в тему письма свои служебные хедэры, ломая тем самым структуру письма. Оно приходит, но не в читабельном виде. Привожу текст письма до отправки (сохранил через AMsg.SaveToFile):


    From: "user@mail.ru" <user@mail.ru>
    Subject:
    =?Windows-1252?B?ItLl7OAg7O7l4+4g7+jx/OzgIiAoyuDq7ukt8u4g8evz5uXh7fvpIPLl?=

    =?Windows-1252?B?6vHyIO/l8OXs5e3t7ukg5Ovo7fsp?=
    To: user@mail.ru
    Content-Type: text/plain;charset=Windows-1252;
    charset="Windows-1252"
    Date: Mon, 4 Jan 2010 21:43:22 +0300
    X-Priority: 3
    X-Library: Indy 9.00.10

    Это тестовое сообщение.



    И после получения:


    Return-path: <user@mail.ru>
    Received: from [89.239.163.241] (port=48687 helo=HOME)
    by mx71.mail.ru with asmtp
    id 1NRrtZ-0002aG-00
    for user@mail.ru; Mon, 04 Jan 2010 21:43:13 +0300
    From: "user@mail.ru" <user@mail.ru>
    Subject:
    =?Windows-1252?B?ItLl7OAg7O7l4+4g7+jx/OzgIiAoyuDq7ukt8u4g8evz5uXh7fvpIPLl?=
    Message-Id: <E1NRrtZ-0002aG-00.user-mail-ru@mx71.mail.ru>
    Date: Mon, 04 Jan 2010 21:43:13 +0300
    X-Spam: Probable Spam
    X-Mras: Ok

    =?Windows-1252?B?6vHyIO/l8OXs5e3t7ukg5Ovo7fsp?=
    To: user@mail.ru
    Content-Type: text/plain;charset=Windows-1252;
    charset="Windows-1252";

    charset="Windows-1252"
    Date: Mon, 4 Jan 2010 21:43:22 +0300
    X-Priority: 3
    X-Library: Indy 9.00.10

    Это тестовое сообщение.



    Как можно видеть, почтовик вставил свои заголовки в тему письма:


    Message-Id: <E1NRrtZ-0002aG-00.user-mail-ru@mx71.mail.ru>
    Date: Mon, 04 Jan 2010 21:43:13 +0300
    X-Spam: Probable Spam
    X-Mras: Ok



    Ни один почтовый клиент такое письмо прочитать уже не может, отображая служебную информацию вместо простого текста.
    Пробовал убирать переносы строки в кодированной теме - в yandex письмо нормально уходит и приходит, в mail - пишет ошибку отправки "spam discarded..." и не отправляет.

    Наставьте на путь истинный, поясните что я не так делаю. Почему mail считает мое письмо спамом, если я убираю переносы строк из кодированной темы и ломает письмо иначе?

    Привожу фрагмент процедуры отправки:


    ....
         AMsg.Body.Add(body);
         AMsg.CharSet := 'windows-1252';
         Amsg.ContentType := 'text/plain;charset=' + AMsg.CharSet;
         subj := '\"Тема моего письма\" (Какой-то служебный текст переменной длины)';

         subj := EncodeHeader(subj, C, 'B', bit7, AMsg.CharSet);
         AMsg.Subject := subj;
         NMSMTP.Send(AMsg);
    .....



    Если этого не достаточно, предоставлю другие фрагменты.
    Благодарю за внимание!
  • Anatoly Podgoretsky © (04.01.10 22:49) [1]
    > Антон80  (04.01.2010 22:02:00)  [0]

    Кто пустую строку вставил в заголовки?
  • Антон80 (04.01.10 23:13) [2]
    В том-то и дело, что такая строка сама появилась. Дебагером смотрел перед сохранением в файл проекта письма там было между строками: #13#10#9. Что собственно в исходниках Indy и значится (idCodeHeader.pas вроде). Потом все это "благополучно" преобразовывается в #13#10#13#10 непонятным мне образом

    т.е. я делаю перед  NMSMTP.Send(AMsg):
    AMsg.SaveToFile('1.txt') и в файле уже имеем два переноса
  • Антон80 (04.01.10 23:27) [3]
    Нашел место в сорцах Инди, где в тему добавляется перенос:
    Модуль: idMessage.pas,
    функция: GenerateHeader
    Строка: Values['Subject'] := EncodeHeader(Subject, [], HeaderEncoding, TransferHeader, ISOCharSet); {do not localize}

    Зачем еще раз кодировать хедер? Не совсем понятно. Тем более другой кодировкой (дефолтовой)
  • Антон80 (05.01.10 00:30) [4]
    Ура :) Добился-таки нормальной работы. Было замечено, что использование строки
    AMsg.CharSet := 'windows-1252';
    приводило так же к образованию разрывов в заголовке, куда почтовик писал свои хедеры.
    Убраны переносы строк, вставляемые функцией EncodeHeader из IdCoderHeader.pas.
    Письма отлично отправляются от аккаунта yandex и mail.ru. Спамом больше их никто не считает.

    Понимания функционирования TIdSMTP в этом плане не прибавилось :(

    Итоговый код:

    AMsg.Body.Add(body);
      // AMsg.CharSet := 'windows-1252'; //убрана установка charset
    Amsg.ContentType := 'text/plain;charset=' + 'windows-1252';
    subj := '\"Тема моего письма\" (Какой-то служебный текст переменной длины)';
    subj := EncodeHeader(subj, C, 'B', bit7, AMsg.CharSet);
    subj := StringReplace(subj, #13#10#9, '', [rfReplaceAll]); //убраны переносы строк
    AMsg.Subject := subj;
    NMSMTP.Send(AMsg);

  • Антон80 (05.01.10 17:59) [5]
    :) Думаю, стоит еще добавить, может кто искать будет. Причина появления переносов в теме письма в несброшенном C: CSET. Поэтому рабочий код будет уже таким:


    uses ...idCoderHeader...;
    ...
    var C : CSET;
    ...
    AMsg.Body.Add(body);
    AMsg.CharSet := 'windows-1252';
    Amsg.ContentType := 'text/plain;charset=' + 'windows-1252';
    subj := '\"Тема моего письма\" (Какой-то служебный текст переменной длины)';

    С := [];
    {по каким-то причинам в одной из моих программ это множество оказалось лихо заполнено. Поэтому кодировалось даже то, что не должно было.}

    subj := EncodeHeader(subj, C, 'B', bit7, '');
    {последний параметр должен быть кодировкой, но некоторые почтовики из-за этого параметра почему-то считают письмо спамом и не отправляют. Если кодировку не указать - письмо нормально читается и отправляется.}

    AMsg.Subject := subj;
    NMSMTP.Send(AMsg);

 
Конференция "Сети" » Проблема с темой письма в TIdSMTP [D7]
Есть новые Нет новых   [134438   +31][b:0][p:0.003]