-
как получить читабельное письмо отправленное из Outlook'a (KOI8-R) ? компонентами indy 10
-
получить ? или получив кои8р перекодировать в читабельный 1251?
-
письмо я получаю, а вот по-русски не читается
IdPOP31.Password:=EditPassword.Text;
IdMessage1.Clear;
try
IdPOP31.Connect;
Memo1.Clear; Memo2.Clear;
IdPOP31.Retrieve(1,IdMessage1);
Label14.Caption := 'From: ' + IdMessage1.From.Text;
Label15.Caption := 'Recepients: ' + IdMessage1.Recipients.EmailAddresses;
Label17.Caption := 'Subject: ' + IdMessage1.Subject;
Memo1.Lines.AddStrings(IdMessage1.Body);
finally
IdPOP31.Disconnect;
end;
-
кстати, то что я отсылаю - в аутлуке тоже не читается
-
ну все верно. кодировка-то у него koi8-r
-
пробовал Memo2.Lines:= (IdMessage1.MessageParts.Items[0] as TIdText).Body пишет что не знает TIdText пробовал IdMessageDecoderMIME и IdDecoderMIME использовать. обругался на потоки. и мануала на него нет.
-
И при чем здесь майм? Ты еще монитор попробуй протереть. Вдруг проканает. Ответ уже есть в [1]
-
Для начала откуси старший бит у каждого символа в теле письма. Если после этого увидишь транслит - ищи функцию перекодировки кои8r в вин-1251.
-
ммм... в общем так. стояла у меня indy 9 стандартная. с кодом
Memo1.Lines.AddStrings(IdMessage1.Body);
Memo2.Lines:= (IdMessage1.MessageParts.Items[0] as TIdText).Body
Memo3.Lines:= (IdMessage1.MessageParts.Items[1] as TIdText).Body
получаю в memo1 - This is a multi-part message in MIME format. memo2 - йОПЧИЧОПЧИ (что-то типа этого ))) memo3 - KOI8-Rно при этом в Outlook'e писмо высланное из моей проги читалось. теперь поставил indy 10 ругается на TIdText. в Uses 'IdMessage' прописано. ХЗ думаю. лезу смотреть, а там и нету TIdText. вот. теперь в outlook'e своего письма прочитать не могу и из своей проги Outlook'овое письо не могу прочесть
-
AnsiString s,SKoi,SWin,N,C; SKoi="__ёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя"; SWin="ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ"; int k=0;
for(int j=1;j<=s.Length();j++) { C=s[j]; k=AnsiPos(C,SKoi); if(k==0) { N+=s[j]; } else N+=SWin[k]; }
Memo1->Lines->Add(N);
в мемо строка (s) переданная в формате koi8r,записывается (N) в win1251
-
> XAOC
У 10-х индейцев есть изящный интерфейс подключения любого кодека)
-
var
M: TIdMessage;
...
M := TIdMessage.Create(Form1);
M.CharSet := 'windows-1251';
...
if IdSMTP1.Connected then
begin
IdSMTP1.Send(M);
end; ?
-
Получить это никак не send
-
> M.CharSet := 'windows-1251';
windows-1251 - это ни разу ни KOI8-R
-
В 10 indy пришлось пойти таким путем (это для текста который в теле письма): function trans(str:string):string; var qwe:TOracleQuery; begin qwe:= TOracleQuery.Create(self); qwe.SQL.Text:= 'SELECT translate(:str, ''ёЁTюабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ'', ''__ёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'') res FROM dual'; qwe.DeclareVariable('str', otString); qwe.Session:=fmMainForm.OraSession; qwe.SetVariable('str', str); try qwe.Execute; result:=qwe.FieldAsString('res'); except result:=str; end; qwe.Free; end;
-
> В 10 indy пришлось пойти таким путем
Кулибин)
unit MsgHdrCoders;
interface
uses
IdHeaderCoderPlain;
type
TCodeMatrix = array[1..255] of char;
const
FirstCodes =
#1#2#3#4#5#6#7#8#9#10#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#27#28+
#29#30#31' !\"#$%&''()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^' +
'_`abcdefghijklmnopqrstuvwxyz~';
cmAnsiToKoi8R: TCodeMatrix = FirstCodes
+ 'ЂЃ‚ѓ„…†‡?‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
+ 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
cmAnsiToKoi8U: TCodeMatrix = FirstCodes
+ 'ЂЃ‚ѓ„…†‡?‰Љ‹ЊЌЋЏђ‘’“”•–—?™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬®Ї°±Ііґµ¶·Ј—є»јЅѕїбвчздецъй'
+ 'клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС';
cmKoi8RToAnsi: TCodeMatrix = FirstCodes
+ '-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёг㬬¬LLL---¦¦¦¦Ё¦¦TTT¦¦¦+++©юабцдефгх'
+ 'ийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
cmKoi8UToAnsi: TCodeMatrix = FirstCodes
+ '-¦-¬L-++T++---¦¦---?¦•v??? ?°?·?=¦-ёєгії¬LLL-ґў¦¦¦¦ЁЄ¦ІЇT¦¦¦+ҐЎ©юабцдефгх'
+ 'ийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ';
cmOemDosToAnsi: TCodeMatrix = FirstCodes
+ 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп---¦+¦¦¬¬¦¦¬---¬L+T+-+¦¦L'
+ 'г¦T¦=+¦¦TTLL-г++----¦¦-рстуфхцчшщъыьэюяЁёЄєЇїЎў°•·v№¤¦ ';
cmIsoToAnsi: TCodeMatrix = FirstCodes
+ '???????????????????????????????? ЁЂЃЄЅІЇЈЉЊЋЌЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШ'
+ 'ЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ';
type
TIdHeaderCoderKOI8 = class(TIdHeaderCoderPlain)
public
class function Decode(const ACharSet, AData: String): String; override;
class function Encode(const ACharSet, AData: String): String; override;
class function CanHandle(const ACharSet: String): Boolean; override;
end;
function ConvertCharset(AString: String; AMatrix: TCodeMatrix): String;
implementation
uses IdGlobal, IdHeaderCoderBase;
function ConvertCharset(AString: String; AMatrix: TCodeMatrix): String;
var
i: Integer;
begin
Result := '';
for i:= 1 to Length(AString) do
Result := Result + AMatrix[Ord(AString[i])];
end;
class function TIdHeaderCoderKOI8.CanHandle(const ACharSet: String): Boolean;
begin
Result := TextIsSame(ACharSet, 'KOI8-R') or TextIsSame(ACharSet, 'KOI8-U');
end;
class function TIdHeaderCoderKOI8.Decode(const ACharSet, AData: String): String;
begin
if TextIsSame(ACharSet, 'KOI8-R') then
Result := ConvertCharset(AData, cmKoi8RToAnsi)
else if TextIsSame(ACharSet, 'KOI8-U') then
Result := ConvertCharset(AData, cmKoi8UToAnsi);
end;
class function TIdHeaderCoderKOI8.Encode(const ACharSet, AData: String): String;
begin
if TextIsSame(ACharSet, 'KOI8-R') then
Result := ConvertCharset(AData, cmAnsiToKoi8R)
else if TextIsSame(ACharSet, 'KOI8-U') then
Result := ConvertCharset(AData, cmAnsiToKoi8U);
end;
initialization
RegisterHeaderCoder(TIdHeaderCoderKOI8);
finalization
UnregisterHeaderCoder(TIdHeaderCoderKOI8);
end.
-
Удалено модератором
|