Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Проблема с темой письма в TIdSMTP   Найти похожие ветки 

 
Антон80   (2010-01-04 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 ©   (2010-01-04 22:49) [1]

> Антон80  (04.01.2010 22:02:00)  [0]

Кто пустую строку вставил в заголовки?


 
Антон80   (2010-01-04 23:13) [2]

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

т.е. я делаю перед  NMSMTP.Send(AMsg):
AMsg.SaveToFile("1.txt") и в файле уже имеем два переноса


 
Антон80   (2010-01-04 23:27) [3]

Нашел место в сорцах Инди, где в тему добавляется перенос:
Модуль: idMessage.pas,
функция: GenerateHeader
Строка: Values["Subject"] := EncodeHeader(Subject, [], HeaderEncoding, TransferHeader, ISOCharSet); {do not localize}

Зачем еще раз кодировать хедер? Не совсем понятно. Тем более другой кодировкой (дефолтовой)


 
Антон80   (2010-01-05 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   (2010-01-05 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);



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
15-1335990605
Юрий
2012-05-03 00:30
2013.03.22
С днем рождения ! 3 мая 2012 четверг


15-1344846779
AV
2012-08-13 12:32
2013.03.22
C каких пор стали писать "от" в заявляниях?


3-1277464409
12
2010-06-25 15:13
2013.03.22
Запрос на получение всех конечных узлов дерева


2-1345815783
Разведка
2012-08-24 17:43
2013.03.22
немогу найти причину ошибки


15-1347627388
Roman_man
2012-09-14 16:56
2013.03.22
Could not create output file