Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

получить письмо в '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?


Наверх

Титульная страница Поиск, карта сайта Написать письмо