Delphi XE2 проблемы с кодировкой Indy

User_

Турист
Регистрация
10 Авг 2012
Сообщения
4
Реакции
0
Credits
6
Помогите решить задачку!

Перепробовал уже несколько релизов XE2 и Indy свежую ставил, перечитал тучу инфы по теме а толку нет..

Пробую отправить мыло IdSMTP в теле приходят ??????? вместо "Пиривет"
После долгих танцев с бубном делаю простой тест - две кнопки два мемо, по первой кодирую Memo2.Text:= IdEncoderЛюбой.EncodeString(Memo1.Text) по второй раскодирую Memo1.Text:= IdDecoderЛюбой.DecodeString(Memo2.Text) и вижу снова ??? вместо кириллицы.....

Помогите ктонить ткните носом в чём проблема...
 

vovag3074

Местный
Регистрация
16 Янв 2010
Сообщения
54
Реакции
84
Credits
528
Помогите решить задачку!

Перепробовал уже несколько релизов XE2 и Indy свежую ставил, перечитал тучу инфы по теме а толку нет..

Пробую отправить мыло IdSMTP в теле приходят ??????? вместо "Пиривет"
После долгих танцев с бубном делаю простой тест - две кнопки два мемо, по первой кодирую Memo2.Text:= IdEncoderЛюбой.EncodeString(Memo1.Text) по второй раскодирую Memo1.Text:= IdDecoderЛюбой.DecodeString(Memo2.Text) и вижу снова ??? вместо кириллицы.....

Помогите ктонить ткните носом в чём проблема...

Попробуй посмотреть в этом направлении
var
MSG:TIdMessage;
begin
MSG.Charset:='UTF-8';
MSG.Body.Text:=UTF8Encode('текст');
......
end;
 

User_

Турист
Регистрация
10 Авг 2012
Сообщения
4
Реакции
0
Credits
6
Попробуй посмотреть в этом направлении
var
MSG:TIdMessage;
begin
MSG.Charset:='UTF-8';
MSG.Body.Text:=UTF8Encode('текст');
......
end;

Пробовал, без результата.. После недели боя с курением мануалов, плюнул.
Вынес в переносимом проекте функцию сендмайл(как и все остальные с Инди) в библиотеку и скомпилил в Д7... Но это костыли.. Я ведь говорю, даже кодер-декодер с примитивным вызовом косячат в ХЕ2.
Тема актуальна, может у кого есть решение?
 

olegzua

Местный
Регистрация
6 Сен 2007
Сообщения
10
Реакции
3
Credits
20
А так не подойдет?

var
fBody: TIdText;

begin

IdMessage.MessageParts.Clear;
...

fBody:=TIdText.Create(IdMessage.MessageParts);
fBody.Body.Add('Привет, это текст сообщения');
fBody.ContentType:='text/plain';
fBody.ContentTransfer:='base64';
fBody.CharSet:='utf-8';
...
 

zby

Турист
Регистрация
13 Окт 2011
Сообщения
1
Реакции
0
Credits
2
есть такой вариант:

Код:
function UrlEncode(const s: AnsiString): string;
var
  I: integer;
begin
  Result := '';
  for i := 1 to Length(S) do
    case S[i] of
      '%', ' ', '&', '=', '@', '.', #13, #10, #128..#255: Result := Result + '%'
        + IntToHex(Ord(S[i]), 2);
    else
      Result := Result + S[i];
    end;
end;
Использовать: URLEncode(ansitoutf8('текст'))
 

My3blKAHT

Турист
Регистрация
16 Мар 2014
Сообщения
3
Реакции
0
Credits
4
Извиняюсь за некропостинг, но, может, кому-то поможет:

В модуле IdGlobalProtocols.pas находим функцию IdGetDefaultCharSet и меняем строку
LANG_RUSSIAN: Result := idcsKOI8_R;
на
LANG_RUSSIAN: Result := idcsWINDOWS_1251;
Ну и разумеется перекомпилируем.
 

levon.d

Турист
Регистрация
3 Апр 2009
Сообщения
3
Реакции
0
Credits
4
Вот функция которая работает на XE5, на других версия не знаю... может тоже будет работать! с кодировкой всё нормально!!!

function send_mail(Hosts, Username, Password, FromAddress, FromName, RecipientsEMailAddresses, Subject, BodyMess:string;
File_List:TStringList; Ports:integer):Boolean;
var
IdSMTP1:TIdSMTP;
IdMessage1:TIdMessage;
i:integer;
begin
try
IdSMTP1:=TIdSMTP.Create(nil);
IdMessage1:=TIdMessage.Create(nil);
IdSMTP1.Host:=Hosts;
IdSMTP1.Port:=Ports;
IdSMTP1.Username:=Username;
IdSMTP1.Password:=Password;
IdSMTP1.DisConnect;
IdMessage1.Clear;
IdMessage1.From.Name := '';
SysLocale.PriLangID := LANG_RUSSIAN;
IdMessage1.CharSet := 'windows-1251';
IdMessage1.ContentType := 'multipart/related; type="multipart/alternative"';
IdMessage1.ContentTransferEncoding := '8bit';
IdSMTP1.ConnectTimeout := 60*100;
IdMessage1.Date :=now;
IdMessage1.From.Address :=FromAddress;
IdMessage1.From.Name := FromName;
IdMessage1.Recipients.EMailAddresses:=RecipientsEMailAddresses;
IdMessage1.Subject:=Subject;
with TIdText.Create(IdMessage1.MessageParts, nil) do begin
body.Add('<html><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"><b>');
body.Add('<font face="Times New Roman" size=5 color="black">'+BodyMess+'</font><br>');
body.Add('</b></html>');
ContentType := 'text/html; charset=windows-1251';
CharSet:='windows-1251';
end;
IdMessage1.IsEncoded := true;
if Trim(File_List.Text) <> '' then
begin
for i := 0 to File_List.Count - 1 do
with TIdAttachmentFile.Create(IdMessage1.MessageParts, File_List) do begin
case AnsiIndexText(ExtractFileExt(AnsiUpperCase(File_List)), ['.XLS', '.XLSX', '.RAR', '.ZIP', '.DOC', '.DOCX', '.HTML', '.TXT']) of
0: ContentType := 'application/vnd.ms-excel';
1: ContentType := 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
2: ContentType := 'application/x-rar-compres';
3: ContentType := 'application/zip';
4: ContentType := 'application/msword';
5: ContentType := 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
6: begin ContentType := 'text/html; charset=WINDOWS-1251'; {ContentDisposition := 'inline'} end;
7: begin ContentType := 'text/plain; charset=WINDOWS-1251'; {ContentDisposition := 'inline'} end;
else
ContentType := 'application/octet-stream';
end;
FileName := File_List;
end;
end;
IdSMTP1.Connect();
if IdSMTP1.Connected then begin IdSMTP1.Send(IdMessage1); result:=true; end else result:=false;
IdSMTP1.Disconnect;
finally
IdMessage1.Free;
IdSMTP1.Free;
end;
end;
 
Последнее редактирование модератором:

nim2009

Турист
Регистрация
8 Фев 2013
Сообщения
5
Реакции
2
Credits
8
Может кому то поможет
Для Indy 10

Uses ....,idCharSets....;
type
Tindystub = class(Tobject)
public
procedure OnInitISO(var VHeaderEncoding: Char; var VCharSet: string);
end;

procedure SendMail(........);
begin
......
Mess:=TIdMessage.Create(nil);
indystub:=Tindystub.Create;
......

Mess.OnInitializeISO := indystub.OnInitISO;

......


end;

{ Tindystub }

procedure Tindystub.OnInitISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
VCharSet := IdCharsetNames[ idcs_windows_1251{idcs_UTF_8} ];
{Если использовать idcs_UTF_8 то в всплывающем окошке Outlook отображаются кракозябры}
end;