Что нового

POP3 доступ к почтовому ящику

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
AutoIt: 3.
Версия: 1.0

Категория: Вспомогательные функции, Данные, Интернет

Описание: Чтение, удаление писем с почтовых серверов.

Код/Пример:
Код:
#include <pop3.au3>

If pop3_Open('pop3.mail.ru', 110, '[email protected]', 'password') Then
	If pop3_Info() Then
		ConsoleWrite('Количество писем: ' & pop3_Count() & @CR)
		ConsoleWrite('Общий размер писем: ' & pop3_TitalSize() & @CR)
		While pop3_Next()
			ConsoleWrite('Размер ' & pop3_Number() & '-го письма: ' & pop3_Size() & @CR)
			MsgBox(0, '', pop3_Read())
			;If (pop3_Number() = 1) Then
			;	If pop3_Delete() Then
			;		ConsoleWrite('Удалили 1 письмо.' & @CR)
			;	EndIf
			;EndIf
		Wend
	EndIf
	pop3_Close()
EndIf

pop3.au3 UDF:
Код:
Global $a_pop3_info[5] = [5000, 0, 0, 0, 0]

Func pop3_Timeout($i_time)
	$a_pop3_info[0] = $i_time
EndFunc

Func pop3_Open($s_server, $i_port, $s_login, $s_passw)
	Local $i_socket, $i_timer, $s_recv
	If TCPStartup() Then
		If ($a_pop3_info[1] == 0) Then
		    $a_pop3_info[1] = TCPConnect(TCPNameToIP($s_server), $i_port)
		    If ($a_pop3_info[1] <> -1) Then
			    $i_timer = TimerInit()
			    While (TimerDiff($i_timer) <= $a_pop3_info[0])
				    $s_recv = TCPRecv($a_pop3_info[1], 65535)
				    If $s_recv Then
					    $i_timer = TimerInit()
					    If StringInStr($s_recv, '+OK') Then
						    TCPSend($a_pop3_info[1], 'USER ' & $s_login & @CRLF)
	                        While (TimerDiff($i_timer) <= $a_pop3_info[0])
			                    $s_recv = TCPRecv($a_pop3_info[1], 65535)
							    If $s_recv Then
			                        $i_timer = TimerInit()
								    If StringInStr($s_recv, '+OK') Then
				                        TCPSend($a_pop3_info[1], 'PASS ' & $s_passw & @CRLF)
					                    While (TimerDiff($i_timer) <= $a_pop3_info[0])
						                    $s_recv = TCPRecv($a_pop3_info[1], 65535)
						                    If $s_recv Then
							                    $i_timer = TimerInit()
							                    If StringInStr($s_recv, '+OK') Then
								                    Return SetError(0, 0, 1)
											    EndIf
						                    EndIf
								        Wend
									    Return SetError(3, 0, 0)
				                    EndIf
			                    EndIf
		                    Wend
						    Return SetError(2, 0, 0)
					    EndIf
				    EndIf
			    Wend
			    Return SetError(1, 0, 0)
		    EndIf
		EndIf
	EndIf
    Return 0
EndFunc

Func pop3_Info()
	Local $i_timer, $s_recv, $a_split
	If $a_pop3_info[1] Then
		TCPSend($a_pop3_info[1], 'STAT' & @CRLF)
		$i_timer = TimerInit()
		While (TimerDiff($i_timer) <= $a_pop3_info[0])
			$s_recv = TCPRecv($a_pop3_info[1], 65535)
			If $s_recv Then
				$i_timer = TimerInit()
				If StringInStr($s_recv, '+OK') Then
					$a_split = StringSplit($s_recv, ' ')
					If (IsArray($a_split) And ($a_split[0] == 3)) Then
						$a_pop3_info[2] = $a_split[2]
						$a_pop3_info[3] = $a_split[3]
						Return 1
					EndIf
				EndIf
			EndIf
		Wend
	EndIf
	Return 0
EndFunc

Func pop3_Count()
	Return $a_pop3_info[2]
EndFunc

Func pop3_TitalSize()
	Return $a_pop3_info[3]
EndFunc

Func pop3_Next()
	If ($a_pop3_info[4] >= $a_pop3_info[2]) Then
		$a_pop3_info[4] = 0
		Return False
	EndIf
	$a_pop3_info[4] += 1
	Return True
EndFunc

Func pop3_Number()
	Return $a_pop3_info[4]
EndFunc

Func pop3_Size()
	Local $i_timer, $s_recv, $a_split
	If $a_pop3_info[1] Then
		While TCPSend($a_pop3_info[1], 'LIST ' & $a_pop3_info[4] & @CRLF & @CRLF) <> 0
		    $i_timer = TimerInit()
		    While (TimerDiff($i_timer) <= $a_pop3_info[0])
			    $s_recv = TCPRecv($a_pop3_info[1], 65535)
			    If $s_recv Then
				    $i_timer = TimerInit()
				    If StringInStr($s_recv, '+OK') Then
					    $a_split = StringSplit($s_recv, ' ')
					    If (IsArray($a_split) And ($a_split[0] == 3)) Then
						    Return $a_split[3]
					    EndIf
				    EndIf
			    EndIf
		    Wend
		Wend
	EndIf
    Return 0
EndFunc

Func pop3_Read()
	Local $i_timer, $s_recv, $a_split, $s_data
	If $a_pop3_info[1] Then
		While TCPSend($a_pop3_info[1], 'RETR ' & $a_pop3_info[4] & @CRLF & @CRLF) <> 0
		    $i_timer = TimerInit()
		    While (TimerDiff($i_timer) <= $a_pop3_info[0])
			    $s_recv = TCPRecv($a_pop3_info[1], 65535)
			    If $s_recv Then
				    $i_timer = TimerInit()
				    If StringInStr($s_recv, '+OK') Then
					    $a_split = StringSplit($s_recv, ' ')
					    If (IsArray($a_split) And ($a_split[0] == 3)) Then
						    Do
							    $s_data &= TCPRecv($a_pop3_info[1], 65535)
						    Until (StringLen($s_data) >= $a_split[2])
						    Return $s_data
					    EndIf
				    EndIf
			    EndIf
		    Wend
		Wend
	EndIf
    Return ''
EndFunc

Func pop3_Delete()
	Local $i_timer, $s_recv, $a_split
	If $a_pop3_info[1] Then
		While TCPSend($a_pop3_info[1], 'DELE ' & $a_pop3_info[4] & @CRLF & @CRLF) <> 0
		    $i_timer = TimerInit()
		    While (TimerDiff($i_timer) <= $a_pop3_info[0])
			    $s_recv = TCPRecv($a_pop3_info[1], 65535)
			    If $s_recv Then
				    $i_timer = TimerInit()
				    If StringInStr($s_recv, '+OK') Then
					    Return 1
				    EndIf
			    EndIf
		    Wend
		Wend
	EndIf
    Return 0
EndFunc

Func pop3_Close()
	Local $i_result, $i_timer, $s_recv
	If $a_pop3_info[1] Then
		TCPSend($a_pop3_info[1], 'QUIT' & @CRLF)
		$i_timer = TimerInit()
		While (TimerDiff($i_timer) <= $a_pop3_info[0])
			$s_recv = TCPRecv($a_pop3_info[1], 65535)
			If $s_recv Then
				$i_timer = TimerInit()
				If StringInStr($s_recv, '+OK') Then
				    $i_result = 1
				EndIf
			EndIf
		Wend
		TCPCloseSocket($a_pop3_info[1])
		TCPShutdown()
		$a_pop3_info[0] = 5000
		$a_pop3_info[1] = 0
		$a_pop3_info[2] = 0
		$a_pop3_info[3] = 0
		$a_pop3_info[4] = 0
	EndIf
	Return $i_result
EndFunc

Снимок:

История версий:
v1.0

Примечание:
Данная UDF читает письма с сервера в таком виде, каком они есть, если кто нибудь поможет регулярными выражениями для выбора из письма (от кого, тема, тело письма), то буду дорабатывать

Источник: autoit-script.ru
Автор(ы): Viktor1703
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
Нельзя использовать несколько подключений из -за ограниченного одного массива... гораздо лучше хранить весь в массив в переменной после подключения...
Что-то типо этого:

Код:
#include <pop3.au3>

Global $ArrayPop = pop3_CreateArray();

If pop3_Open($ArrayPop,'pop3.mail.ru', 110, '[email protected]', 'password') Then
    If pop3_Info($ArrayPop) Then
        ConsoleWrite('Количество писем: ' & pop3_Count($ArrayPop) & @CR)
        ConsoleWrite('Общий размер писем: ' & pop3_TitalSize($ArrayPop) & @CR)
        While pop3_Next($ArrayPop)
            ConsoleWrite('Размер ' & pop3_Number($ArrayPop) & '-го письма: ' & pop3_Size($ArrayPop) & @CR)
            MsgBox(0, '', pop3_Read($ArrayPop))
            ;If (pop3_Number($ArrayPop) = 1) Then
            ;   If pop3_Delete($ArrayPop) Then
            ;       ConsoleWrite('Удалили 1 письмо.' & @CR)
            ;   EndIf
            ;EndIf
        Wend
    EndIf
    pop3_Close($ArrayPop)
EndIf


Ну лично мне было-бы так удобнее... :smile:
 
Верх