-
Антон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);