Здравствуйте, уважаемые! И снова вопрос про почту, Indy и кодировку. Ситуация следующая: использую компоненты Indy для отправки \ получения почты. Вроде все работает, но при получении, виесто читаемого русского текста, как в теле пиьсма, так и в заголовке, вижу одни крокозябры. Я понимаю, что дело в кодировке и ее нужно как-то менять. Но как? Может кто поделится?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
31-01-2006 05:02 | Сообщение от автора вопроса
Промучившись с Indy, я, в конце-концов, отказался от нее и стал использовать библиотеку synapse. Там все довольно просто и понятно. Есть удобоваримый хелп и, самое главное, нет проблем с кодировкой. Если кому надо, библиотеку можно скачать с сайта http://www.ararat.cz/synapse/ Библиотека freeware.
31-01-2006 02:10 | Вопрос к автору: запрос дополнительной информации
Константин! Не было ли у Вас ситуации, когда необходимо было отправить письмо с телом в виде HTML и плюс вложение? Когда я отправляю просто тело, все прекрасно и красиво. Когда подключаю вложение, тело превращается в текст (HTML код). Похоже все дело в ContentType.
Я решил эту проблему так (Delphi 7, Indy 10.0 52, старые Indy 9 убрать):
1.
Надо написать обработчик события OnInitializeISO:
procedure SMTP_Thread.MyInitializeISO(var VTransferHeader: TTransfer;
var VHeaderEncoding: Char; var VCharSet: String);
begin
VCharSet:='windows-1251';
VTransferHeader := bit8;
VHeaderEncoding := 'B';
end;
И подправить файлик IdMessageClient.
Чтобы не мучится и не перекомпилировать инсталляцию, просто скопировать его в папку с программой, вот он и будет использоваться.
Правим внутр. процедуру
procedure WriteTextPart(ATextPart: TIdText);
var
LData: string;
LDestStream: TIdStream;
LStrStream: TIdStreamVCL;
LBodyLine: String;
i: Integer;
begin
if ATextPart.ContentType = '' then begin
ATextPart.ContentType := 'text/plain'; {do not localize}
end;
if ATextPart.ContentTransfer = '' then begin
ATextPart.ContentTransfer := 'quoted-printable'; {do not localize}
end; /////////////////////// А ЭТО ДОБАВИЛИ start
if ATextPart.CharSet = '' then begin
ATextPart.CharSet := ISOCharSet; {do not localize}
end;
/////////////////////// А ЭТО ДОБАВИЛИ end
Константин, этот код правильно сформирует кодировку при отправке. Если же, к примеру, приходит письмо в кодировке KOI8-R, то, боюсь, будет видна абра-кодабра. Вот здесь и возникает вопрос: как конвертнуть KOI8-R (или другую кодировку) в windows-1251.
Лично у меня была проблема с кодировкой при отправке multipart сообщения с вложением через TIdSMTP, TIdMessage. Есть следующее решение.
Блок собственно заполениия сообщения:
IdMessage := TIdMessage.Create( nil );
with IDMessage do begin
...
OnInitializeISO := MailSetCharset;
with TIdText.Create( MessageParts ) do
begin
Body.Text := 'Текст сообщения';
ContentType := 'text/plain; charset=windows-1251';
end;
with TIdText.Create( MessageParts ) do
begin
Body.Text := '<h1>Текст сообщения html</h1>';
ContentType := 'text/html; charset=windows-1251';
end;
...
end;
Ну и дальше
IdSMTP.SendMessage( IdMessage );
Собственно установка Content-Type обеспечивает правильную кодировку частей сообщения.
А вот обработчик MailSetCharset нужен для правильной кодировки заголовков сообщения.
Вот его код:
procedure TFormMain.MailSetCharset(var VTransferHeader: TTransfer;
var VHeaderEncoding: Char; var VCharSet: string);
begin
// это нужно для корректного кодирования заголовков
VHeaderEncoding := 'B';
VCharSet := 'windows-1251';
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.