Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2014, 01:30
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию delphi pop3

Добрый вечер!
У мене такая проблема:
подключаюсь к почте через idpop3 и idmessage и вывожу письма(от кого пришло, тема письма и так далее).
Знаю, что проблема с кодировкой, но незнаю как решить.
Вот скрин:
Ответить с цитированием
  #2  
Старый 05.01.2014, 06:53
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Есть такое дело. Indy не умеет расшифровывать такого вида кодировки автоматически. Вот я для себя писал такую штуку:
Код:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
unit EmlStrUtils;
 
interface
 
uses
  Windows, SysUtils, Classes, StrUtils;
 
function DecodeEmailString(S : String) : String;
 
implementation
 
uses
  IdCoder, IdCoder3to4, IdCoderMIME, IdCoderQuotedPrintable;
 
function Base64Decode(const EncodedText: string): String;
var
  Decoder: TIdDecoderMIME;
begin
  Result := EncodedText;
  Decoder := TIdDecoderMIME.Create(nil);
  try
    Result := Decoder.DecodeString(EncodedText);
  finally
    Decoder.Free;
  end;
end;
 
function QuotedPrintableDecode(const EncodedText: string): String;
var
  Decoder: TIdDecoderQuotedPrintable;
begin
  Result := EncodedText;
  Decoder := TIdDecoderQuotedPrintable.Create(nil);
  try
    Result := Decoder.DecodeString(EncodedText);
  finally
    Decoder.Free;
  end;
end;
 
function DecodeTocken(S : String) : String;
var
  SecondQuestIdx : Integer;
  ThirdQuestIdx : Integer;
  Txt : String;
begin
  // =?charset?encoding?encoded text?=
  // =?utf-8?B?<text>?=
  // =?utf-8?Q?=D0=A5=D0=B0=D0=B9=D0=B9_...=21=21=21=29_?=
 
  Result := S;
  If Pos('=?',S) = 1 Then
    Begin
      SecondQuestIdx := PosEx('?',S,3);
      ThirdQuestIdx := PosEx('?',S,SecondQuestIdx+1);
      Txt := Copy(S,ThirdQuestIdx+1,Length(S)-ThirdQuestIdx-2);
 
      Case S[SecondQuestIdx+1] Of
        'B', 'b' :
          Begin
            Result := Base64Decode(Txt);
            If CompareText('utf-8',Copy(S,3,SecondQuestIdx-1-2)) = 0
              Then Result := Utf8ToAnsi(Result);
          End;
        'Q', 'q' :
          Begin
            Result := QuotedPrintableDecode(Txt);
          End;
      End;
    End;
end;
 
procedure SplitTockens(S : String; var AList : TStringList);
var
  Idx1, Idx2, Idx3 : Integer;
begin
  While S <> '' Do
    Begin
      Idx1 := Pos('=?',S);
      If Idx1 = 0
        Then
          Begin
            AList.Add(S);
            S := '';
          End
        Else
          If Idx1 > 1
            Then
              Begin
                AList.Add(Copy(S,1,Idx1-1));
                S := Copy(S,Idx1,Length(S));
              End
            Else
              Begin
                Idx2 := PosEx('?',S,3);
                Idx3 := PosEx('?',S,Idx2+1);
                AList.Add(Copy(S,1,PosEx('?=',S,Idx3+1)+1));
                S := Copy(S,PosEx('?=',S,Idx3+1)+2,Length(S));
              End;
    End;
end;
 
function DecodeEmailString(S : String) : String;
var
  I : Integer;
  AList : TStringList;
begin
  // =?charset?encoding?encoded text?=
  // =?utf-8?B?<text>?=
  // =?utf-8?Q?=D0=A5=D0=B0=D0=B9=D0=B9_...=21=21=21=29_?=
 
  Result := S;
  If Pos('=?',S) <> 0 Then
    Begin
      Result := '';
      AList := TStringList.Create;
      Try
        // Split tockens
        SplitTockens(S,AList);
 
        // Decode
        For I := 0 To AList.Count-1 Do
          AList[i] := DecodeTocken(AList[i]);
 
        // Join result
        For I := 0 To AList.Count-1 Do
          Result := Result + AList[i];
      Finally
        AList.Free;
      End;
    End;
end;
 
end.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
JeReK5542 (05.01.2014)
  #3  
Старый 05.01.2014, 09:10
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

как использовать ваш код?

вообщем я создал файл EmlStrUtils.pas и закинул туда ваш код, после етого подключил его после
Цитата:
implementation

uses EmlStrUtils;
и использовал так
DecodeEmailString(idmessage1.subject)
и заработало)
спасибо за помощь)

помогите пожалуйста решить еще одну проблему с содержимым письма

и как распозновать html символы?

Последний раз редактировалось M.A.D.M.A.N., 05.01.2014 в 19:19.
Ответить с цитированием
  #4  
Старый 05.01.2014, 18:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это еще не делал (но собираюсь).
В принципе, можно попробовать прогнать через MSHTML и у него попросить вернуть "чистый" текст. Хотя тут надо дольше ковыряться.

Кстати, обведенное на картинке очень похоже либо на KOI8 или на нераскодированный Base64 (первая строчка, остальные 2 это скорее KOI8).
Ответить с цитированием
  #5  
Старый 05.01.2014, 18:48
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

первая обведенная строчка ето base64, а вот с остальным незнаю че делать(
Ответить с цитированием
  #6  
Старый 05.01.2014, 22:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,105
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я же говорю, что это похоже на KOI8R.
Скорее всего где-то в заголовках или еще где есть указание на то, в какой кодировке текст. Тебе надо найти это место и из указанной перекодировать в 1251. Это уже руками. Готового решения от Indy не жди, т.к. это специфичная задача. Но можно попробовать поискать по русским сайтам... например здесь: http://www.delphisources.ru/pages/fa...1251_koi8.html

Тебе осталось только найти имя этой кодировки в письме.

Кстати, если кто еще читает эту тему. Какие самые употребительные кодировки в мире? Не только русские...
Ответить с цитированием
  #7  
Старый 05.01.2014, 22:41
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

UTF-8. Почти везде.
Потом идёт 1251, 1252.
Встречаются ISO-8859-1 и ISO-8859-15.
Ну и реже можно встретить какие-нибудь семибитные.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #8  
Старый 06.01.2014, 02:41
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
Какие самые употребительные кодировки в мире?
Если брать по числу пользователей, популярными вполне могут оказаться Big5, GB18030 и Shift-JIS. Чтобы не быть голословным, вот тут -- GBK.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #9  
Старый 06.01.2014, 14:52
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

я попробую както решить проблему с кодировкой, но если ктото знает, как ето все решить напишите пожалуйста)
Ответить с цитированием
  #10  
Старый 06.01.2014, 18:20
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

вообщем проблема осталась нерешённой(
Ответить с цитированием
  #11  
Старый 07.01.2014, 00:47
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот ещё в довесок к теме - преобразование Win1251 <-> Koi8r
Код:
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
32
33
34
35
36
37
38
type TConvertChars = array[#128..#255] of char;
 
const Win_KoiChars: TConvertChars =
(#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#060,
 #139,#140,#141,#142,#143,#144,#145,#146,#147,#148,#169,
 #150,#151,#152,#153,#154,#062,#176,#157,#183,#159,#160,
 #246,#247,#074,#164,#231,#166,#167,#179,#169,#180,#060,
 #172,#173,#174,#183,#156,#177,#073,#105,#199,#181,#182,
 #158,#163,#191,#164,#062,#106,#189,#190,#167,#225,#226,
 #247,#231,#228,#229,#246,#250,#233,#234,#235,#236,#237,
 #238,#239,#240,#242,#243,#244,#245,#230,#232,#227,#254,
 #251,#253,#154,#249,#248,#252,#224,#241,#193,#194,#215,
 #199,#196,#197,#214,#218,#201,#202,#203,#204,#205,#206,
 #207,#208,#210,#211,#212,#213,#198,#200,#195,#222,#219,
 #221,#223,#217,#216,#220,#192,#209); 
 
Koi_WinChars: TConvertChars =
(#128,#129,#130,#131,#132,#133,#134,#135,#136,#137,#138,
 #139,#140,#141,#142,#143,#144,#145,#146,#147,#148,#149,
 #150,#151,#152,#153,#218,#155,#176,#157,#183,#159,#160,
 #161,#162,#184,#186,#165,#166,#191,#168,#169,#170,#171,
 #172,#173,#174,#175,#156,#177,#178,#168,#170,#181,#182,
 #175,#184,#185,#186,#187,#188,#189,#190,#185,#254,#224,
 #225,#246,#228,#229,#244,#227,#245,#232,#233,#234,#235,
 #236,#237,#238,#239,#255,#240,#241,#242,#243,#230,#226,
 #252,#251,#231,#248,#253,#249,#247,#250,#222,#192,#193,
 #214,#196,#197,#212,#195,#213,#200,#201,#202,#203,#204,
 #205,#206,#207,#223,#208,#209,#210,#211,#198,#194,#220,
 #219,#199,#216,#221,#217,#215,#218);
 
function Win_KoiConvert(const St: string): string;
var
 i: integer;
begin
 Result:=St; 
 for i:=1 to Length(St) do
  if St[i]>#127 then Result[i]:=Win_KoiChars[St[i]];
end;
©Drkb::04287
Ответить с цитированием
  #12  
Старый 07.01.2014, 20:07
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

если ктонибуть решит ету проблему, напишите пожалуйста сюда решение
Ответить с цитированием
  #13  
Старый 13.01.2014, 15:48
JeReK5542 JeReK5542 вне форума
Новичок
 
Регистрация: 18.11.2013
Сообщения: 61
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

ну что некто так и незнает как решить?(
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:27.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025