![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
получить письмо в 'windows1251' [D7, WinXP]
XAOC © (2008-03-26 15:46:00)как получить читабельное письмо отправленное из Outlook'a (KOI8-R) ?
компонентами indy 10
(2009-07-04 22:44:00) [1]Удалено модератором
Сергей М. (2008-11-28 14:53:00) [2]
> В 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{|}~\x7F';
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;
{ TIdHeaderCoderKOI8 }
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.
yarik1980 (2008-11-28 14:41:00) [3]В 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;
Сергей М. (2008-07-31 11:40:00) [4]
> M.CharSet := 'windows-1251';
windows-1251 - это ни разу ни KOI8-R
Anatoly Podgoretsky (2008-07-31 10:26:00) [5]Получить это никак не send
a.a.j. (2008-07-31 09:50:00) [6]
var
M: TIdMessage;
...
M := TIdMessage.Create(Form1);
M.CharSet := 'windows-1251';
...
if IdSMTP1.Connected then
begin
IdSMTP1.Send(M);
end;
?
Сергей М. (2008-07-29 20:11:00) [7]
> XAOC
У 10-х индейцев есть изящный интерфейс подключения любогокодека)
MedEx (2008-07-29 16:45:00) [8]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 (2008-03-26 16:56:00) [9]ммм...
в общем так. стояла у меня 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'овое письо не могу прочесть
Reindeer Moss Eater (2008-03-26 16:43:00) [10]Для начала откуси старший бит у каждого символа в теле письма.
Если после этого увидишь транслит - ищи функцию перекодировки кои8r в вин-1251.
Reindeer Moss Eater (2008-03-26 16:38:00) [11]И при чем здесь майм?
Ты еще монитор попробуй протереть. Вдруг проканает.
Ответ уже есть в [1]
XAOC (2008-03-26 16:24:00) [12]пробовал
Memo2.Lines:= (IdMessage1.MessageParts.Items[0] as TIdText).Body
пишет что не знает TIdText
пробовал IdMessageDecoderMIME и IdDecoderMIME использовать. обругался на потоки. и мануала на него нет.
XAOC (2008-03-26 16:19:00) [13]кстати, то что я отсылаю - в аутлуке тоже не читается
Reindeer Moss Eater (2008-03-26 16:19:00) [14]ну все верно. кодировка-то у него koi8-r
XAOC (2008-03-26 16:17:00) [15]письмо я получаю, а вот по-русски не читается
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;
Reindeer Moss Eater (2008-03-26 16:07:00) [16]получить ?
или
получив кои8р перекодировать в читабельный 1251?