Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Проблема с темой письма в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.082 c
4-1258536064
mambo
2009-11-18 12:21
2013.03.22
Градиентный прогрес в отдельном потоке


2-1341842887
Den
2012-07-09 18:08
2013.03.22
remote desktop sreenshot?


2-1332313764
Erwik1900
2012-03-21 11:09
2013.03.22
Объединение SQL запросов


15-1352233802
Юрий
2012-11-07 00:30
2013.03.22
С днем рождения ! 7 ноября 2012 среда


2-1332757380
leklerk
2012-03-26 14:23
2013.03.22
Аналог ExecSQL для ADODataSet





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский