Автор Тема: [Сеть, интернет] Дополнение к UDF _pop3.au3  (Прочитано 1501 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн erlik [?]

  • Продвинутый
  • ***
  • Сообщений: 317
  • Репутация: 83
    • Награды
  • Версия AutoIt: 3.3.8.1
    Недавно ковырялся с UDF _pop3.au3 и так как в ней есть только функционал получения сырых данных, с которыми дальше нужно что-то делать, решил это что-то воплотить в несколько более-менее удобных функций.

_Pop3GetContentHeaderByName - получает содержимое служебного заголовка после двоеточия
_Pop3HeaderDecode - декодирует (в случае необходимости)  текст заголовка
_Pop3GetTextMessage - получает (и пытается декодировать) содержимое письма

    На данный момент контент заголовков декодируется правильно почти во всех случаях (с исключениями нужно еще поразбираться - у меня на 70 писем два таких случая - неправильная кирилица получается). Что касается содержимого письма - то здесь все гораздо сложнее. Декодирование из base64 требует, чтобы строка состояла исключительно из валидного набора символов, чего весьма трудно добиться. Среди доп. функций есть те, которые стараются максимально очистить контент от html и прочего кода, но это не всегда помогает. Нормально декодируются небольшие письма состоящие из одной части и простого текста.
Состоящие же из несколько частей (у каждой свой набор заголовков) могут иметь разные варианты кодировки , много лишнего кода и поэтому трудно поддаются очистке и перекодированию. Над этим нужно еще поработать.

Функции, дополняющие UDF _pop3.au3:
(нажмите для показа/скрытия)

Примеры использования:
Код: AutoIt [Выделить]
; Examples
;_Pop3Example_All('pop3.server', 'email', 'password')
;_Pop3Example_MessageText('pop3.server', 'email', 'password', номер сообщения)
;ConsoleWrite(_Pop3Example_GetLastMessage('pop3.server', 'email', 'password'))

; Examples
;===================================================================================
; Пример считывает все письма с основными заголовками.
; На письмах с тяжелым контентом - фото, много html и т.д, считывание может зависнуть
; PS: Правильнее было бы считывать текст письма по байтам до завершающей точки, вместо полного возврата контента
; через _Pop3Retr(msg_number), но не знаю как это сделать
;===================================================================================
Func _Pop3Example_All($MyPopServer, $MyLogin, $MyPasswd)

    _pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
    If @error Then
        MsgBox(0, "Error", "Unable to connect to " & $MyPopServer & @CR & @error)
        Exit
    Else
        ConsoleWrite("Connected to server pop3 " & $MyPopServer & @CR)
    EndIf

    Local $aPop3Stat = _Pop3Stat()
    If @error Then
        MsgBox(0, "Error", "Unable get statistics " & $MyPopServer & @CR & @error)
        ConsoleWrite(_Pop3Quit() & @CR)
        _pop3Disconnect()
        Exit
    Else
        ;_ArrayDisplay($aPop3Stat)
        ; возвращает массив, где
        ; a[0]= 2  - число ячеек с данными
        ; a[1]= общее число писем
        ; a[2]= общий размер писем
        ; выводим общее число сообщений и общий размер
        ConsoleWrite('TOTAL MSG:' & $aPop3Stat[1] & @CRLF)
        ConsoleWrite('SIZE MSG:'  & $aPop3Stat[2] & @CRLF)
    EndIf

    ; выводим некоторые заголовки и текст письма
    For $iMsg = 1 To $aPop3Stat[1]

        ; выводим текст некоторых заголовков
        ;----------------------------------
        _Pop3Example_HeadersText($iMsg)
        ;----------------------------------
        ; выводим текст письма
        $sTextMessage = __CleanMessage(_Pop3GetTextMessage($iMsg))
        ConsoleWrite('====================================' & @CRLF)
        ConsoleWrite('MESSAGE:' & $iMsg & @CRLF)
        ConsoleWrite('====================================' & @CRLF)
        ConsoleWrite($sTextMessage)

    Next

    ;----------------------------------
    ; разъединяемся с сервером
    ConsoleWrite(_Pop3Quit() & @CR)
    _pop3Disconnect()

EndFunc   ;==>_Pop3Example

;===================================================================================
; выводит некоторые из заголовков письма
;===================================================================================
Func _Pop3Example_HeadersText($iMsg)
    Local $aPop3List, $sRawData, $aSize
    ; возвращает массив, где
    ; a[0]= 1 - номер ячейки с данными - всегда равно 1
    ; a[1]= номер письма и размер письма, разделенные пробелом
    $aPop3List = _Pop3List($iMsg)
    If IsArray($aPop3List) Then
        ;_ArrayDisplay($aPop3List)
        $aSize = StringSplit($aPop3List[1], ' ', 2)
    EndIf

    $sRawData = _Pop3Top($iMsg, 0) ; вернем заголовки

    Local $sContentType, $sContentEncoding, $sFrom, $sEmail, $sSubject, $sDate
    $sContentEncoding = _Pop3GetContentHeaderByName($sRawData, 'Content-Transfer-Encoding')
    $sContentType     = _Pop3GetContentHeaderByName($sRawData, 'Content-Type')
    $sDate            = _Pop3GetContentHeaderByName($sRawData, 'Date')
    $sFrom            = _Pop3GetContentHeaderByName($sRawData, 'From')
    $sFrom            = _Pop3HeaderDecode($sFrom) ; попытка перекодировать данные заголовков
    $sEmail           = _Pop3GetContentHeaderByName($sFrom, 'email') ; получим только email из заголовка from
    $sSubject         = _Pop3GetContentHeaderByName($sRawData, 'Subject')
    $sSubject         = _Pop3HeaderDecode($sSubject) ; попытка перекодировать данные заголовков

    ConsoleWrite( _
            '====================================' & @CRLF & _
            '№ MSG: '        & $iMsg & @CRLF & _
            'SIZE: '         & $aSize[1] & @CRLF & _
            'Content-Type: ' & $sContentType & @CRLF & _
            'Encoding: '     & $sContentEncoding & @CRLF & _
            'DATE: '         & $sDate & @CRLF & _
            'FROM (RAW): '   & $sFrom & @CRLF & _
            'EMAIL: '        & $sEmail & @CRLF & _
            'SUBJECT: '      & $sSubject & @CRLF _
            )

EndFunc   ;==>_Pop3Example_HeadersText

;===================================================================================
; выводим текст тела письма по его номеру - нумерация начинается с самого старого письма
; т.о чтобы узнать номер последнего пришедшего письма нужно обратиться к массиву, возвращаемому _Pop3Stat()
;===================================================================================
Func _Pop3Example_MessageText($MyPopServer, $MyLogin, $MyPasswd, $iMsg)
    _pop3Connect($MyPopServer, $MyLogin, $MyPasswd)

    ;----------------------------------------------------------------------
    Local $sRawData = _Pop3Top($iMsg, 0) ; вернем заголовки
    ConsoleWrite(_Pop3GetContentHeaderByName($sRawData, 'Date') & @CRLF)
    ConsoleWrite(_Pop3HeaderDecode(_Pop3GetContentHeaderByName($sRawData, 'From')) & @CRLF)
    ConsoleWrite(_Pop3HeaderDecode(_Pop3GetContentHeaderByName($sRawData, 'Subject')) & @CRLF)
    ;----------------------------------------------------------------------

    Local $sTextMessage = __CleanMessage(_Pop3GetTextMessage($iMsg))
    ConsoleWrite('====================================' & @CRLF)
    ConsoleWrite('MESSAGE:' & $iMsg & @CRLF)
    ConsoleWrite('====================================' & @CRLF)
    ConsoleWrite($sTextMessage)
    ; разъединяемся с сервером
    ConsoleWrite(_Pop3Quit() & @CR)
    _pop3Disconnect()
EndFunc   ;==>_Pop3Example_MessageText

;===================================================================================
; Получает текст самого последнего(нового) сообщения.
;===================================================================================
Func _Pop3Example_GetLastMessage($MyPopServer, $MyLogin, $MyPasswd)
    Local $aPop3Stat, $iMsg, $sTextMessage
    _pop3Connect($MyPopServer, $MyLogin, $MyPasswd)
    $aPop3Stat = _Pop3Stat()
    $iMsg = $aPop3Stat[1]
    Local $sTextMessage = __CleanMessage(_Pop3GetTextMessage($iMsg))
    _Pop3Quit()
    _pop3Disconnect()
    Return $sTextMessage
EndFunc   ;==>_Pop3Example_GetLastMessage

--------------------------------------------------------------------------

В примерах используется версия _pop3.au3  0.99 (March 2006, 9th)
С новой (не знал, что есть) версией 1.03 (2011) они несовместимы. 
----------------------------------------------------------------------------------------------
Вариант примеров для последней версии UDF _pop3.au3 1.03

(нажмите для показа/скрытия)
« Последнее редактирование: Май 08, 2014, 17:18:54 от erlik »

Русское сообщество AutoIt

[Сеть, интернет] Дополнение к UDF _pop3.au3
« Отправлен: Май 08, 2014, 00:47:26 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
15 Ответов
19326 Просмотров
Последний ответ Февраль 14, 2017, 01:34:07
от Alofa
2 Ответов
3844 Просмотров
Последний ответ Июль 18, 2010, 15:15:55
от ynbIpb
15 Ответов
7782 Просмотров
Последний ответ Декабрь 25, 2011, 06:11:13
от Yashied
1 Ответов
2057 Просмотров
Последний ответ Май 27, 2012, 12:24:28
от Garrett
0 Ответов
1410 Просмотров
Последний ответ Май 28, 2012, 22:36:03
от CreatoR
0 Ответов
2145 Просмотров
Последний ответ Март 01, 2013, 14:22:21
от Zalman1980
1 Ответов
3384 Просмотров
Последний ответ Июнь 08, 2013, 21:40:00
от madmasles
2 Ответов
2292 Просмотров
Последний ответ Октябрь 20, 2015, 00:12:08
от Pavel
7 Ответов
2123 Просмотров
Последний ответ Ноябрь 26, 2015, 01:12:07
от Yura
2 Ответов
1215 Просмотров
Последний ответ Март 16, 2016, 08:55:17
от pvnn