|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Indy 10 прием почты (кодировка темы письма)
День добрый.
Программа принимает почту pop3. Раньше у меня стаяла старая версия Indy. При приеме тема была примерно такая Код:
Msg.Subject=A =?koi8-r?Ляляляля ==?= Далее у меня есть функция, которая декодирует текст по этим тэгам. Теперь я обновился до Indy 10 и тема выводится без тэгов " =?koi8-r?". То есть совершенно не понятно когда ее надо декодировать, когда нет. Вопрос как из IdMessage вытащить Subject c тэгами? Или может быть можно вытащить кодировку? |
#2
|
|||
|
|||
Код:
TIdMessage.NoDecode := True; Кстати, покажи функцию - что умеет (точнее, какие кодировки знает)? |
#3
|
|||
|
|||
Нашел на просторах глубокого интернета, правда немного изменил
строки 8-23 от меня, на случай длинного заголовка. http://www.sql.ru/forum/883437/pop3-...roblema-decode Код:
function DecodeStr(Text: String): String; Var P,P2,pz:Integer; Temp,Dec, temp2 : String; begin Result:=''; if pos('=?',text)=0 then result:=text; if pos('=?',text)>1 then result:=copy(text,1,pos('=?',text)-1); temp2:=StringReplace(text,' ','', [rfReplaceAll, rfIgnoreCase]); Temp2:=Copy(Temp2,Pos('=?',LowerCase(temp2)),Length(temp2)); repeat pz:=Pos('?=',LowerCase(temp2))+1; if pz=2 then pz:=Pos('?=',LowerCase(temp2))+1; if pz<15 then pz:=length(temp2); temp:=Copy(Temp2,Pos('=?',LowerCase(temp2)),pz); delete(temp2,1,pz); while pos('=?UTF-8?',UpperCase(Temp))>0 do begin P:=pos('=?UTF-8?',UpperCase(Temp)); P2:=length(temp)-1; Dec := Copy(Temp,p+10,P2-(P+10)); if UpperCase(Temp[P+8])='Q' then Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec) Else Dec:=IdDecoderMIME1.DecodeString(Dec); Dec:=Utf8ToAnsi(Dec); Result:=Result+Copy(Temp,1,P-1)+Dec; Temp:=Copy(Temp,P2+2,length(Temp)); End; while pos('=?KOI8-R?',UpperCase(Temp))>0 do begin P:=pos('=?KOI8-R?',UpperCase(Temp)); P2:=pos('?=',Temp); Dec := Copy(Temp,p+11,P2-(P+11)); if UpperCase(Temp[P+9])='Q' then Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec) Else Dec:=IdDecoderMIME1.DecodeString(Dec); Dec:=B_KOI8R2ANSI(Dec); Result:=Result+Copy(Temp,1,P-1)+Dec; Temp:=Copy(Temp,P2+2,length(Temp)); End; while pos('=?WINDOWS-1251?',UpperCase(Temp))>0 do begin P:=pos('=?WINDOWS-1251?',UpperCase(Temp)); P2:=pos('?=',Temp); Dec := Copy(Temp,p+17,P2-(P+17)); if UpperCase(Temp[P+15])='Q' then Dec := Form2.IdDecoderQuotedPrintable1.DecodeString(Dec) Else Dec:=IdDecoderMIME1.DecodeString(Dec); Result:=Result+Copy(Temp,1,P-1)+Dec; Temp:=Copy(Temp,P2+2,length(Temp)); End; until length(temp2)<5; end; function B_KOI8R2ANSI(S: string): string; Const KOI8_CODE = 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС—Ј'; ANSI_CODE = 'АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ё'; var i: integer; begin Result := S; for i := 1 to Length(Result) do if Pos(Result[i], KOI8_CODE) > 0 then Result[i] := ANSI_CODE [Pos(Result[i], KOI8_CODE)]; end; |
#4
|
|||
|
|||
NoDecode увы не прокатило ((((.
Пока решение такое: Код:
Tema:=msg.Headers.Values['Subject'] |
#5
|
|||
|
|||
Ага, тоже вариант.
Мда, по коду. Интересно, но это только для русских кодировок... хотя на вооружение стоит взять... |
#6
|
|||
|
|||
Кодировка имения файла
Вот вопрос, а как получить исходную кодировку имени файла?
|
#7
|
|||
|
|||
Эм-м-м... не понял вопрос?
Какого файла? |
#8
|
|||
|
|||
Имя файла, в аттачменте тоже кодируется.
Как достать кодировку, которой было закодировано имя файл |
#9
|
|||
|
|||
Ну так оно тоже тем же способом, видимо, кодируется.
Еще в заголовке должен быть параметр - charset. Это языковая кодировка... |