В очередной раз бьюсь над кодировкой, только в этот раз отправленных писем. За основу взял статью
http://adm.rayfin.aksay.ru/otpravka-pisma-i-problemy-kodirovki.html и эту статью
http://www.webdelphi.ru/2010/03/synapse-v-delphi-otpravka-pisem-s-vlozheniyami/В итоге у себя получил следующий код:
- Код: Выделить всё
Procedure TForm3.SendMail (Host,Subject,mTo,From,TextBody,HTML,login,password:string);
var Msg:TMimeMess;
tmpStringList:TStringList;
MsgPart:TMimePart;
begin
Msg := TMimeMess.Create;
tmpStringList:=TStringList.Create;
IdealCharsets:=[CP1251];/////////////////////////////
try
// Headers
Msg.Header.Subject:=Subject;
Msg.Header.From:=From;
Msg.Header.ToList.Add(mTo);
// MIMe Parts
MsgPart:=Msg.AddPartMultipart('alternate',nil);
if length(TextBody)>0 then
begin
tmpStringList.Text:=AnsiToUtf8(TextBody);////////////////////
//Msg.AddPartText(tmpStringList,MsgPart);
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,false,ME_BASE64);/////////////////////////
end
else
begin
tmpStringList.Text:=AnsiToUtf8(HTML);
Msg.AddPartHTML(tmpStringList,MsgPart);
end;
if Form3.Edit9.Text<>'' then
Msg.AddPartBinaryFromFile(Form3.Edit9.Text,MsgPart);
// кодируем и отправляем
Msg.EncodeMessage;
if smtpsend.SendToRaw(From,mTo,Host,Msg.Lines,login,password) then
ShowMessage('Письмо отправлено')
else ShowMessage('Письмо не отправлено');
finally
Msg.Free;
tmpStringList.Free;
Form3.Close;
end;
end;
По английски все отлично, а кириллицу не понимает.
Добавлено спустя 1 час 58 минут 30 секунд:Re: Кодировка принятых и отправленных писем. Synapse.Появились подвижки: тема письма и отправитель стали читабельны после того как прописал Msg.Header.CharsetCode:=UTF_8; , а с текст сообщения походу отправляется все таки в UTF-8 но почтовый сервер думает почему то, что в CP1251.
Добавлено спустя 8 минут 29 секунд:Re: Кодировка принятых и отправленных писем. Synapse.tmpStringList.Text:=AnsiToUtf8(TextBody); AnsiToUtf8-точно лишнее
Добавлено спустя 5 минут 27 секунд:Re: Кодировка принятых и отправленных писем. Synapse.О вроде получилось: надо строчку поменять вот эту: Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);
Добавлено спустя 13 минут 8 секунд:Re: Кодировка принятых и отправленных писем. Synapse.Рабочий вариант:
- Код: Выделить всё
Procedure TForm3.SendMail (Host,Subject,mTo,From,TextBody,login,password:string);
var Msg:TMimeMess;
tmpStringList:TStringList;
MsgPart:TMimePart;
begin
Msg := TMimeMess.Create;
tmpStringList:=TStringList.Create;
IdealCharsets:=[UTF_8];
try
// Headers
Msg.Header.Subject:=Subject;
Msg.Header.From:=From;
Msg.Header.ToList.Add(mTo);
// MIMe Parts
MsgPart:=Msg.AddPartMultipart('alternate',nil);
if length(TextBody)>0 then
begin
tmpStringList.Text:=TextBody;
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);
end
else
begin
tmpStringList.Text:='--';
Msg.AddPartTextEx(tmpStringList,MsgPart,UTF_8,true,ME_BASE64);
end;
if Form3.Edit9.Text<>'' then
Msg.AddPartBinaryFromFile(Form3.Edit9.Text,MsgPart);
Msg.Header.CharsetCode:=UTF_8;
// кодируем и отправляем
Msg.EncodeMessage;
if smtpsend.SendToRaw(From,mTo,Host,Msg.Lines,login,password) then
ShowMessage('Письмо отправлено')
else ShowMessage('Письмо не отправлено');
finally
Msg.Free;
tmpStringList.Free;
Form3.Close;
end;
end;