Конференция "Сети" » получить письмо в 'windows1251' [D7, WinXP]
 
  • XAOC © (26.03.08 15:46) [0]
    как получить читабельное письмо отправленное из Outlook'a (KOI8-R)  ?
    компонентами indy 10
  • Reindeer Moss Eater © (26.03.08 16:07) [1]
    получить ?
    или
    получив кои8р перекодировать в читабельный 1251?
  • XAOC © (26.03.08 16:17) [2]
    письмо я получаю, а вот по-русски не читается


    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;

  • XAOC © (26.03.08 16:19) [3]
    кстати, то что я отсылаю - в аутлуке тоже не читается
  • Reindeer Moss Eater © (26.03.08 16:19) [4]
    ну все верно. кодировка-то у него koi8-r
  • XAOC © (26.03.08 16:24) [5]
    пробовал
    Memo2.Lines:= (IdMessage1.MessageParts.Items[0] as TIdText).Body


    пишет что не знает TIdText

    пробовал IdMessageDecoderMIME и IdDecoderMIME использовать. обругался на потоки. и мануала на него нет.
  • Reindeer Moss Eater © (26.03.08 16:38) [6]
    И при чем здесь майм?
    Ты еще монитор попробуй протереть. Вдруг проканает.
    Ответ уже есть в [1]
  • Reindeer Moss Eater © (26.03.08 16:43) [7]
    Для начала откуси старший бит у каждого символа в теле письма.
    Если после этого увидишь транслит - ищи функцию перекодировки кои8r в вин-1251.
  • XAOC © (26.03.08 16:56) [8]
    ммм...
    в общем так. стояла у меня 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'овое письо не могу прочесть
  • MedEx (29.07.08 16:45) [9]
    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
  • Сергей М. © (29.07.08 20:11) [10]

    > XAOC


    У 10-х индейцев есть изящный интерфейс подключения любого кодека)
  • a.a.j. © (31.07.08 09:50) [11]
    var
     M: TIdMessage;
    ...
     M := TIdMessage.Create(Form1);
     M.CharSet := 'windows-1251';
    ...
     if IdSMTP1.Connected then
     begin
       IdSMTP1.Send(M);
     end;



    ?
  • Anatoly Podgoretsky © (31.07.08 10:26) [12]
    Получить это никак не send
  • Сергей М. © (31.07.08 11:40) [13]

    >  M.CharSet := 'windows-1251';


    windows-1251 - это ни разу ни KOI8-R
  • yarik1980 © (28.11.08 14:41) [14]
    В 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;
  • Сергей М. © (28.11.08 14:53) [15]

    > В 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;

    { 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.

  • имя (04.07.09 22:44) [16]
    Удалено модератором
 
Конференция "Сети" » получить письмо в 'windows1251' [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.003]