#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7
#Region _POP3_Ex.au3 - INDEX
;===============================================================================
;===============================================================================
; Name ..........: _POP3_Ex.au3
; Author: .......: Apzo - Luc HENNINOT <lhenninot@nordnet.fr>
; Author: .......: Tipulatoid, MrCreatoR - _POP3_EML_Parser()
; Modified ......: Thorsten Willert (thorsten [dot] willert [at] gmx [dot] de)
; Modified ......: Oscar
; Modified ......: mLipok
; Date ..........: 2015/02/09
; Version .......: based on 1.03
; AutoIt ........: v3.3.10.2++
;===============================================================================
#cs
Original UDF:
http://www.autoitscript.com/forum/index.php?showtopic=22838
Basic functions for AU3 Scripts, based on the 1939 RFC ( http://www.ietf.org/rfc/rfc1939.txt ).
Standard for the Format of ARPA-Internet Text Messages ( https://tools.ietf.org/html/rfc822 )
; 4. MESSAGE SPECIFICATION
; 4.1. SYNTAX
; 5. DATE AND TIME SPECIFICATION
; 5.1. SYNTAX
POP3 AUTHentication command ( https://www.ietf.org/rfc/rfc1734.txt )
Include version : 0.99 (March 2006, 9th).
Author : Apzo - Luc HENNINOT <lhenninot@nordnet.fr>
Modified : Thorsten Willert (thorsten [dot] willert [at] gmx [dot] de)
Modified : mLipok http://www.autoitscript.com/forum/user/10673-mlipok/
(Function names Changed, Variables names Changed, added new functions, added Quoted-printable.au3, Script CleanUp, $g__bPOP3_TRACE and $g__vPOP3_ISCONNECTED Removed)
Requires AU3 v3.3.10.2+ and UDF: Quoted-printable.au3
#ce
#EndRegion _POP3_Ex.au3 - INDEX
#Region _POP3_Ex.au3 - Include
#include-once
#include <StringConstants.au3>
#include <FileConstants.au3>
#include <array.au3>
#include "Quoted-printable.au3"
#EndRegion _POP3_Ex.au3 - Include
#Region _POP3_Ex.au3 - Global Constants and Enums
; -- _POP3 error codes, sent by SetError. Use @error to display it. --
Global Enum _
$POP3_ERROR_OK = 0, _
$POP3_ERROR, _
$POP3_ERROR_TCPCONNECT_FAILED, _
$POP3_ERROR_SERVER_RESPONSE_TIMEOUT, _
$POP3_ERROR_ALREADY_CONNECTED, _
$POP3_ERROR_NOT_CONNECTED, _
$POP3_ERROR_NO_AUTH, _
$POP3_ERROR_TCPRECV_TIMEOUT, _
$POP3_ERROR_USER_REFUSED, _
$POP3_ERROR_PASSWD_REFUSED, _
$POP3_ERROR_ERR_RESPONSE, _
$POP3_ERROR_NO_OK_RESPONSE, _
$POP3_ERROR_STAT_BADRESPONSE, _
$POP3_ERROR_NO_TCP_RESPONSE, _
$POP3_ERROR_STAT_REFUSED, _
$POP3_ERROR_LIST_REFUSED, _
$POP3_ERROR_RSET_REFUSED, _
$POP3_ERROR_RETR_REFUSED, _
$POP3_ERROR_QUIT_REFUSED, _
$POP3_ERROR_DELE_REFUSED, _
$POP3_ERROR_TOP_REFUSED, _
$POP3_ERROR_UIDL_REFUSED, _
$POP3_ERROR_NOOP_REFUSED
;-- _POP3 vars --
Global Const _
$POP3_OK = '^\+OK'; Regexp syntax
#EndRegion _POP3_Ex.au3 - Global Constants and Enums
#Region _POP3_Ex.au3 - Global variables
Global $g__iPOP3_SOCKET
#EndRegion _POP3_Ex.au3 - Global variables
#Region _POP3_Ex.au3 - Example
;~ _POP3_Example()
Func _POP3_Example()
If _POP3_ServerConnect('POP3.server.url') Then
If _POP3_ServerLogIn("UserName", "Password") Then
Local $aInfo = _POP3_Info()
_POP3_RFC_QUIT()
_POP3_ServerDisconnect()
_ArrayDisplay($aInfo)
EndIf
EndIf
EndFunc ;==>_POP3_Example
#EndRegion _POP3_Ex.au3 - Example
#Region _POP3_Ex.au3 - rfc1939 Functions ; http://www.ietf.org/rfc/rfc1939.txt
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_DELE
; Description ...: Delete msg n-msg_number.
; Syntax ........: _POP3_RFC_DELE($iMsg)
; Parameter(s): .: $iMsg - msg-number
; Return Value ..: Success - server response
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 15:24:41 CET 2010
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_DELE($iMsg)
If _POP3_ServerIsAuth() Then
__POP3_Cmd("DELE " & $iMsg)
If @error Then Return SetError(@error, 0, 0)
Local $sRet = __POP3_WaitTcpResponse()
If @error Then
Return SetError($POP3_ERROR_NO_TCP_RESPONSE, 0, 0)
Else
Return $sRet
EndIf
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_DELE
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_LIST
; Description ...: Returns an array with the msg number and its size (octets)
; Syntax ........: _POP3_RFC_LIST([$iMsg = -1])
; Parameter(s): .: $iMsg - Optional: (Default = -1) :
; | -1 = all
; Return Value ..: Success - array[n][2]
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert, Oscar
; Date ..........: Thu Feb 24 23:00:26 CET 2010
; Link ..........:
; Related .......: _POP3_RFC_UIDL
; Example .......: No
; ==============================================================================
Func _POP3_RFC_LIST($iMsg = -1)
If _POP3_ServerIsAuth() Then
Local $aRet[1][2], $aTMP2
Local $sAddMsg = ""
If $iMsg <> -1 Then
$sAddMsg = " " & $iMsg
EndIf
; Send List
Local $sRet = __POP3_Cmd("LIST" & $sAddMsg)
If @error Then Return SetError(@error, 0, 0)
While $iMsg = -1 And Not StringRegExp($sRet, "\r\n\.\r\n")
$sRet = $sRet & __POP3_WaitTcpResponse()
If @error Then Return SetError($POP3_ERROR_NO_TCP_RESPONSE, 0, 0)
WEnd
$sRet = StringRegExpReplace($sRet, '.+?message.+\(.+\)\r\n', @LF) ; Yahoo-Support, by Oscar
; Stripping useless infos for complete listing
If $iMsg = -1 Then
$sRet = StringMid($sRet, 2, StringLen($sRet) - 6)
Else
$sRet = StringMid($sRet, 1, StringLen($sRet) - 2)
EndIf
Local $aTMP = StringSplit(StringStripCR($sRet), @LF)
Local $iE = UBound($aTMP)
ReDim $aRet[$iE][2]
$aRet[0][0] = $iE - 1
For $i = 1 To $iE - 1
$aTMP2 = StringSplit($aTMP[$i], " ", 2)
$aRet[$i][0] = $aTMP2[0]
$aRet[$i][1] = $aTMP2[1]
Next
Return $aRet
EndIf
EndFunc ;==>_POP3_RFC_LIST
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_NOOP
; Description ...: Actually, does nothing.
; Syntax ........: _POP3_RFC_NOOP()
; Parameter(s): .: -
; Return Value ..: Success - 1
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 11:22:36 CET 2010
; Remark(s) .....: The most interesting command from RFC 1939 ;)
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_NOOP()
If _POP3_ServerIsAuth() Then
; Send NOOP
__POP3_Cmd("NOOP")
If @error Then Return SetError($POP3_ERROR_USER_REFUSED, 0, 0)
Return 1
EndIf
EndFunc ;==>_POP3_RFC_NOOP
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_QUIT
; Description ...: Validates your actions (dele for example) and stops the connection as it should.
; Syntax ........: _POP3_RFC_QUIT()
; Parameter(s): .: -
; Return Value ..: Success - 1
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 11:25:00 CET 2010
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_QUIT()
If _POP3_ServerIsAuth() Then
__POP3_Cmd("QUIT")
If @error Then Return SetError(@error, 0, 0)
Return 1
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_QUIT
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_RETR
; Description ...: Downloads the according message
; Syntax ........: _POP3_RFC_RETR([$iMsg = -1])
; Parameter(s): .: $iMsg - Optional: (Default = -1) :
; | -1 = newest
; Return Value ..: Success - string
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 17:23:03 CET 2010
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_RETR($iMsg = -1)
If _POP3_ServerIsAuth() Then
If $iMsg = -1 Then
Local $aStat = _POP3_RFC_STAT()
If Not @error Then $iMsg = $aStat[0]
EndIf
; Send Retr
Local $sRet = __POP3_Cmd("RETR " & $iMsg)
If @error Then Return SetError(@error, 0, 0)
; Downloading until final dot and cariage return.
While Not StringRegExp($sRet, "\r\n\.\r\n")
$sRet = $sRet & __POP3_WaitTcpResponse()
If @error Then Return SetError($POP3_ERROR_NO_TCP_RESPONSE, 0, 0)
WEnd
Return $sRet
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_RETR
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_RSET
; Description ...: Withdraw changes, such as dele orders
; Syntax ........: _POP3_RFC_RSET()
; Parameter(s): .: -
; Return Value ..: Success - 1
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 11:34:52 CET 2010
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_RSET()
If _POP3_ServerIsAuth() Then
; Send RSET
__POP3_Cmd("RSET")
If @error Then Return SetError(@error, 0, 0)
Return 1
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_RSET
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_STAT
; Description ...: Gets the number of messages in the pop3 account (array[1]) and the size(array[2]) in octets
; Syntax ........: _POP3_RFC_STAT()
; Parameter(s): .: -
; Return Value ..: Success - array
; Failure - array[-1,-1]
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Fri Jan 15 09:54:17 CET 2010
; Link ..........:
; Related .......: _POP3_MsgCnt
; Example .......: No
; ==============================================================================
Func _POP3_RFC_STAT()
Local $aRet[2] = [-1, -1]
If _POP3_ServerIsAuth() Then
; Send STAT
Local $sRet = __POP3_Cmd("STAT")
If @error Then Return SetError(@error, 0, 0)
$sRet = StringStripWS($sRet, 3)
$aRet = StringSplit($sRet, " ", 2)
If IsArray($aRet) Then
Return $aRet
Else
Return SetError($POP3_ERROR_STAT_BADRESPONSE, 0, $aRet)
EndIf
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, $aRet)
EndIf
EndFunc ;==>_POP3_RFC_STAT
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_TOP
; Description ...: Retreives the mail headers, and the X first lines of the message
; Syntax ........: _POP3_RFC_TOP([$iMsg = -1[, $iLines = 0]])
; Parameter(s): .: $iMsg - Optional: (Default = -1) :
; | -1 : newest
; $iLines - Optional: (Default = 0) :
; Return Value ..: Success - string
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 17:26:42 CET 2010
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_RFC_TOP($iMsg = -1, $iLines = 0)
If _POP3_ServerIsAuth() Then
If $iMsg = -1 Then
Local $aStat = _POP3_RFC_STAT()
If Not @error Then $iMsg = $aStat[0]
EndIf
; Send Top
Local $sRet = __POP3_Cmd("TOP " & $iMsg & " " & $iLines)
If @error Then Return SetError(@error, 0, 0)
; Downloading until final dot and cariage return.
While Not StringRegExp($sRet, "\r\n\.\r\n")
$sRet = $sRet & __POP3_WaitTcpResponse()
If @error Then Return SetError($POP3_ERROR_NO_TCP_RESPONSE, 0, 0)
WEnd
Return $sRet
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_TOP
; #FUNCTION# ===================================================================
; Name ..........: _POP3_RFC_UIDL
; Description ...: Same as _POP3_RFC_LIST(), but with UIDL identifiers instead of message size.
; Syntax ........: _POP3_RFC_UIDL([$iMsg = -1])
; Parameter(s): .: $iMsg - Optional: (Default = -1) :
; Return Value ..: Success - array[n][2]
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 16:51:30 CET 2010
; Link ..........:
; Related .......: _POP3_RFC_LIST
; Example .......: No
; ==============================================================================
Func _POP3_RFC_UIDL($iMsg = -1)
If _POP3_ServerIsAuth() Then
Local $aRet[1][2], $aTMP2
Local $sAddMsg = ""
If $iMsg <> -1 Then $sAddMsg = " " & $iMsg
; Send List
Local $sRet = __POP3_Cmd("UIDL " & $sAddMsg)
If @error Then Return SetError(@error, 0, 0)
While $iMsg = -1 And Not StringRegExp($sRet, "\r\n\.\r\n")
$sRet = $sRet & __POP3_WaitTcpResponse()
If @error Then Return SetError($POP3_ERROR_NO_TCP_RESPONSE, 0, 0)
WEnd
; Stripping useless infos for complete listing
If $iMsg = -1 Then
$sRet = StringMid($sRet, 2, StringLen($sRet) - 6)
Else
$sRet = StringMid($sRet, 1, StringLen($sRet) - 2)
EndIf
Local $aTMP = StringSplit(StringStripCR($sRet), @LF)
Local $iE = UBound($aTMP)
ReDim $aRet[$iE][2]
$aRet[0][0] = $iE - 1
For $i = 1 To $iE - 1
$aTMP2 = StringSplit($aTMP[$i], " ", 2)
$aRet[$i][0] = $aTMP2[0]
$aRet[$i][1] = $aTMP2[1]
Next
Return $aRet
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_RFC_UIDL
#EndRegion _POP3_Ex.au3 - rfc1939 Functions ; http://www.ietf.org/rfc/rfc1939.txt
#Region _POP3_Ex.au3 - UDF Function
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_Info
; Description ...: Returns an array with the specified informations about all mails
; Syntax ........: _POP3_Info([$v_Info = Default[, $iNumberOfMessages = Default]])
; Parameters ....: $v_Info - [optional] A variant value. Default is Default. String or array
; $iNumberOfMessages - [optional] An integer value. Default is Default.
; Return values .:
; Success - array (Default: array[date,from,to,subject])
; Failure - 0
; Author ........: Thorsten Willert
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: Yes
; ===============================================================================================================================
Func _POP3_Info($v_Info = Default, $iNumberOfMessages = Default)
If _POP3_ServerIsAuth() Then
If $v_Info = Default Then
Local $aFiledNames[4] = ["Date", "From", "To", "Subject"]
ElseIf IsArray($v_Info) Then
$aFiledNames = $v_Info
Else
$aFiledNames = StringSplit($v_Info, ',', $STR_NOCOUNT)
EndIf
Local $iMsgCnt = _POP3_MsgCnt()
If @error Then Return SetError(@error, 0, 0)
If $iNumberOfMessages <> Default Then
; TODO
EndIf
Local $sTMP_EML, $aTMP_EML_Fields
Local $iFieldsCnt = UBound($aFiledNames)
If $iMsgCnt > 0 Then
Local $aRet[$iMsgCnt + 1][$iFieldsCnt]
$aRet[0][0] = $iMsgCnt
For $iMsg = 1 To $iMsgCnt
$sTMP_EML = _POP3_RFC_TOP($iMsg)
If @error Then Return SetError(@error, 0, 0)
For $iField = 0 To $iFieldsCnt - 1
$aTMP_EML_Fields = StringRegExp($sTMP_EML, '(?i)\n' & $aFiledNames[$iField] & ':\s*(.*?)\R', 3)
If Not @error Then $aRet[$iMsg][$iField] = $aTMP_EML_Fields[0]
Next
Next
Return $aRet
EndIf
Return SetError($POP3_ERROR, 0, 0)
Else
Return SetError($POP3_ERROR_NO_AUTH, 0, 0)
EndIf
EndFunc ;==>_POP3_Info
; #FUNCTION# ===================================================================
; Name ..........: _POP3_ServerConnect
; Description ...: Connect to the POP3 server.
; Syntax ........: _POP3_ServerConnect($sServer [, $iPort = 110]])
; Parameter(s): .: $sServer - pop3 server
; $iPort - Optional: (Default = 110) :
; Return Value ..: Success - 1
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert, mLipok
; Date ..........: Fri Jan 15 18:37:29 CET 2010
; Link ..........:
; Related .......: _POP3_ServerLogIn()
; Example .......: No
; ==============================================================================
Func _POP3_ServerConnect($sServer, $iPort = 110)
If Not _POP3_ServerIsConnected() Then
If $iPort = 995 Then
_POP3_ConsoleDebugError("_POP3_ServerConnect: Error: SSL not supported ..." & @CRLF)
Return SetError(1, 0, _POP3_ServerIsConnected(False))
EndIf
TCPStartup()
If @error Then
Return SetError($POP3_ERROR_TCPCONNECT_FAILED, @error, _POP3_ServerIsConnected(False))
EndIf
; Basic name to IP conversion
_POP3_ConsoleDebug("_POP3_ServerConnect: connecting to: (" & $sServer & " - using port: " & $iPort & ") ")
If StringRegExp($sServer, "[a-zA-Z]") Then
Local $sServerIP = TCPNameToIP($sServer)
_POP3_ConsoleDebug($sServer & " >> " & $sServerIP & @CRLF)
$sServer = $sServerIP
EndIf
$g__iPOP3_SOCKET = TCPConnect($sServer, $iPort)
If @error Then
_POP3_ConsoleDebugError("_POP3_ServerConnect: Error: " & @error & @CRLF)
Return SetError($POP3_ERROR_TCPCONNECT_FAILED, 0, _POP3_ServerIsConnected(False))
EndIf
; We need a first OK from pop3 server
__POP3_WaitForOK()
If @error Then
Return SetError($POP3_ERROR_NO_OK_RESPONSE, 0, _POP3_ServerIsConnected(False))
Else
Return _POP3_ServerIsConnected(True)
EndIf
Else
Return SetError($POP3_ERROR_ALREADY_CONNECTED, 0, _POP3_ServerIsConnected())
EndIf
EndFunc ;==>_POP3_ServerConnect
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_ServerLogIn
; Description ...: Login to POP3 Conneted server
; Syntax ........: _POP3_ServerLogIn($sUserName, $sPasswd)
; Parameters ....: $sUserName - A string value.
; $sPasswd - A string value.
; Return values .: None
; Author ........: Lipok
; Modified ......:
; Remarks .......:
; Related .......: _POP3_ServerConnect()
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_ServerLogIn($sUserName, $sPasswd)
If _POP3_ServerIsConnected() Then
; Send user
__POP3_Cmd("USER " & $sUserName)
If @error Then
Return SetError($POP3_ERROR_USER_REFUSED, 0, _POP3_ServerIsAuth(False))
EndIf
; Send passwd
__POP3_Cmd("PASS " & $sPasswd)
If @error Then
Return SetError($POP3_ERROR_PASSWD_REFUSED, 0, _POP3_ServerIsAuth(False))
EndIf
Return SetError(0, 0, _POP3_ServerIsAuth(True))
Else
Return SetError($POP3_ERROR_NOT_CONNECTED, 0, _POP3_ServerIsAuth(False))
EndIf
EndFunc ;==>_POP3_ServerLogIn
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_ServerIsConnected
; Description ...: Set/Check POP3 Connection Status
; Syntax ........: _POP3_ServerIsConnected([$bState = Default])
; Parameters ....: $bState - [optional] A binary value. Default is Default = do not change nothing just return Current status.
; Return values .: Status, current or just set
; Author ........: mLipok
; Modified ......:
; Remarks .......: Default Status is False
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_ServerResponseTimeOut($iTimeOut = Default)
Local Static $iServerResponseTimeOut = 60000
If Not IsNumber($iTimeOut) Or Not StringIsDigit($iTimeOut) Then SetError(1, 0, $iServerResponseTimeOut)
If $iTimeOut <> Default Then
$iServerResponseTimeOut = $iTimeOut
EndIf
Return $iServerResponseTimeOut
EndFunc ;==>_POP3_ServerResponseTimeOut
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_ServerIsAuth
; Description ...: Set/Check whether user is loged to the POP3 server
; Syntax ........: _POP3_ServerIsAuth([$bState = Default])
; Parameters ....: $bState - [optional] A binary value. Default is Default = do not change nothing just return Current status.
; Return values .: Status, current or just set
; Author ........: mLipok
; Modified ......:
; Remarks .......: Default Status is False
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_ServerIsAuth($bState = Default)
Local Static $bIsAuth = False
If $bState <> Default Then
If $bState = True Then
$bIsAuth = True
Else
$bIsAuth = False
EndIf
EndIf
Return $bIsAuth
EndFunc ;==>_POP3_ServerIsAuth
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_ServerIsConnected
; Description ...: Set/Check POP3 Connection Status
; Syntax ........: _POP3_ServerIsConnected([$bState = Default])
; Parameters ....: $bState - [optional] A binary value. Default is Default = do not change nothing just return Current status.
; Return values .: Status, current or just set
; Author ........: mLipok
; Modified ......:
; Remarks .......: Default Status is False
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_ServerIsConnected($bState = Default)
Local Static $bIsConnected = False
If $bState <> Default Then
If $bState = True Then
$bIsConnected = True
Else
_POP3_ServerIsAuth(False)
$bIsConnected = False
EndIf
EndIf
Return $bIsConnected
EndFunc ;==>_POP3_ServerIsConnected
; #FUNCTION# ===================================================================
; Name ..........: _POP3_ServerDisconnect
; Description ...: Shuts down connection to POP3 server.
; Syntax ........: _POP3_ServerDisconnect()
; Parameter(s): .: -
; Return Value ..: Success - 1
; Failure - 0
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 11:15:16 CET 2010
; Remark(s) .....: Use _POP3_RFC_QUIT to exit !!
; Link ..........:
; Related .......:
; Example .......: No
; ==============================================================================
Func _POP3_ServerDisconnect()
If _POP3_ServerIsConnected() Then
TCPCloseSocket($g__iPOP3_SOCKET)
TCPShutdown()
_POP3_ServerIsConnected(False)
Return SetError(0, 0, 1)
Else
_POP3_ServerIsConnected(False)
Return SetError($POP3_ERROR_NOT_CONNECTED, 0, 1)
EndIf
EndFunc ;==>_POP3_ServerDisconnect
; #FUNCTION# ===================================================================
; Name ..........: _POP3_MsgCnt
; Description ...: Returns the number of messages
; Syntax ........: _POP3_MsgCnt()
; Parameter(s): .: -
; Return Value ..: Success - number of messages
; Failure - -1
; @ERROR -
; Author(s) .....: Thorsten Willert
; Date ..........: Fri Jan 15 09:56:20 CET 2010
; Link ..........:
; Related .......: _POP3_RFC_STAT
; Example .......: NO
; ==============================================================================
Func _POP3_MsgCnt()
Local $a = _POP3_RFC_STAT()
Return SetError(@error, 0, $a[0])
EndFunc ;==>_POP3_MsgCnt
#EndRegion _POP3_Ex.au3 - UDF Function
#Region _POP3_Ex.au3 - _EML_ Functions
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_SaveToFile
; Description ...:
; Syntax ........: _POP3_EML_SaveToFile($iMsg, $sEML_FileFullPath)
; Parameters ....: $iMsg - An integer value.
; $sEML_FileFullPath - A string value. FileFullPath to save EML file.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_SaveToFile($iMsg, $sEML_FileFullPath)
Local $sEML = _POP3_RFC_RETR($iMsg)
If Not @error Then
_POP3_ConsoleDebug(StringStripCR($sEML) & @CR)
Local $hEML_File = FileOpen($sEML_FileFullPath, $FO_OVERWRITE + $FO_CREATEPATH + $FO_UTF8_FULL)
FileWrite($hEML_File, $sEML)
FileClose($hEML_File)
Else
EndIf
EndFunc ;==>_POP3_EML_SaveToFile
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_GetDate
; Description ...:
; Syntax ........: _POP3_EML_GetDate($sEML_Content)
; Parameters ....: $sEML_Content - A string value.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_GetDate($sEML_Content)
Local $aDate = StringRegExp($sEML_Content, '(?i)(?:\A|\R)Date: (\V+)', 3)
If UBound($aDate) Then
Return SetError(0, 0, $aDate[0])
EndIf
Return SetError(1, 0, '')
EndFunc ;==>_POP3_EML_GetDate
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_GetSubject
; Description ...:
; Syntax ........: _POP3_EML_GetSubject($sEML_Content[, $bDecodeQP = True])
; Parameters ....: $sEML_Content - A string value.
; $bDecodeQP - [optional] A binary value. Default is True.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_GetSubject($sEML_Content, $bDecodeQP = True)
Local $aSubject = StringRegExp($sEML_Content, '(?i)(?:\A|\R)Subject: (\V+)', 3)
If UBound($aSubject) Then
Return SetError(0, 0, $bDecodeQP ? _QuotedPrintable_DecodeEncodedWord($aSubject[0]) : $aSubject[0])
EndIf
Return SetError(1, 0, '')
EndFunc ;==>_POP3_EML_GetSubject
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_GetThreadTopic
; Description ...:
; Syntax ........: _POP3_EML_GetThreadTopic($sEML_Content[, $bDecodeQP = True])
; Parameters ....: $sEML_Content - A string value.
; $bDecodeQP - [optional] A binary value. Default is True.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_GetThreadTopic($sEML_Content, $bDecodeQP = True)
Local $aTopic = StringRegExp($sEML_Content, '(?i)(?:\A|\R)Thread-Topic: (\V+)', 3)
If UBound($aTopic) Then
Return SetError(0, 0, $bDecodeQP ? _QuotedPrintable_DecodeEncodedWord($aTopic[0]) : $aTopic[0])
EndIf
Return SetError(1, 0, '')
EndFunc ;==>_POP3_EML_GetThreadTopic
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_GetFrom
; Description ...:
; Syntax ........: _POP3_EML_GetFrom($sEML_Content[, $bDecodeQP = True])
; Parameters ....: $sEML_Content - A string value.
; $bDecodeQP - [optional] A binary value. Default is True.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_GetFrom($sEML_Content, $bDecodeQP = True)
Local $aFrom = StringRegExp($sEML_Content, '(?i)(?:\A|\R)From: (\V+)', 3)
If UBound($aFrom) Then
Return SetError(0, 0, $bDecodeQP ? _QuotedPrintable_DecodeEncodedWord($aFrom[0]) : $aFrom[0])
EndIf
Return SetError(1, 0, '')
EndFunc ;==>_POP3_EML_GetFrom
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_GetTo
; Description ...:
; Syntax ........: _POP3_EML_GetTo($sEML_Content[, $bDecodeQP = True])
; Parameters ....: $sEML_Content - A string value.
; $bDecodeQP - [optional] A binary value. Default is True.
; Return values .: None
; Author ........: mLipok
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_GetTo($sEML_Content, $bDecodeQP = True)
Local $aTo = StringRegExp($sEML_Content, '(?i)(?:\A|\R)To: (\V+)', 3)
If UBound($aTo) Then
Return SetError(0, 0, $bDecodeQP ? _QuotedPrintable_DecodeEncodedWord($aTo[0]) : $aTo[0])
EndIf
Return SetError(1, 0, '')
EndFunc ;==>_POP3_EML_GetTo
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_EML_Parser
; Description ...:
; Syntax ........: _POP3_EML_Parser ($sEML_Contents)
; Parameters ....: $sEML_Contents - A string value.
; Return values .:
; It returns an Array where saved:
; In the 1st line - Sender's name
; In the 2nd line - Sender's address
; In the 3rd line - Recipient name
; In the 4th line - Recipient address
; In the 5th line - Subject
; In the 6th line - Charset
; In the 7th line - Message body
; In the 8th line - Attachment's name (if exists)
; In the 9th line - Attachment's body (if exists)
; In the next pairs of lines - names and bodies of the other attachments (if exist)
; Author ........: Tipulatoid, MrCreatoR
; Modified ......: mLipok
; Remarks .......:
; Related .......:
; Link ..........: http://www.autoitscript.com/forum/topic/22838-pop3-udf-according-to-the-1939-rfc/#entry596715
; Example .......: No
; ===============================================================================================================================
Func _POP3_EML_Parser($sEML_Contents)
Local $aLetter[1]
__POP3_EML_Parser_AddToLetterArray(StringRegExp($sEML_Contents, '(?im)^From: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1), $aLetter)
__POP3_EML_Parser_AddToLetterArray(StringRegExp($sEML_Contents, '(?im)^To: +(.*)(?: |<)(?:.*?<|)(.*?)(?:>|)\r\n', 1), $aLetter)
__POP3_EML_Parser_AddToLetterArray(StringRegExp($sEML_Contents, '(?im)^Subject: +(.*)\r\n', 1), $aLetter)
__POP3_EML_Parser_AddToLetterArray(StringRegExp($sEML_Contents, '(?i)charset="?(.*?)(?:"|\r\n)', 1), $aLetter)
Local $aSplit = StringSplit($sEML_Contents, @CRLF, 1)
Local $iFirstBoundaryString = _ArraySearch($aSplit, "boundary=", 0, 0, 0, 1)
Local $iBoundary = $aSplit[$iFirstBoundaryString]
Local $iBoundary_StartPos = StringInStr($iBoundary, '"')
Local $iBoundary_EndPos = StringInStr($iBoundary, '"', 0, 2)
Local $boundary = StringMid($iBoundary, $iBoundary_StartPos + 1, $iBoundary_EndPos - $iBoundary_StartPos - 1)
Local $boundary1 = _ArraySearch($aSplit, $boundary, $iFirstBoundaryString + 1, 0, 1, 1)
Local $boundary2 = _ArraySearch($aSplit, $boundary, $boundary1 + 1, 0, 1, 1)
Local $sMessage = ""
Local $bWrite = False
For $i = $boundary1 To $boundary2 - 1
If $aSplit[$i] = "" Then $bWrite = True
If $bWrite = True Then $sMessage &= $aSplit[$i] & @CRLF
Next
__POP3_EML_Parser_AddToLetterArray($sMessage, $aLetter)
__POP3_EML_Parser_AddToLetterArray(StringRegExp($sEML_Contents, '(?ims)filename="?(.*?)(?:"|\r).*?\n\r\n(.*?)\r\n^-+', 3), $aLetter)
Return $aLetter
EndFunc ;==>_POP3_EML_Parser
; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name ..........: __POP3_EML_Parser_AddToLetterArray
; Description ...:
; Syntax ........: __POP3_EML_Parser_AddToLetterArray($aContents, Byref $afLetter)
; Parameters ....: $aContents - An array of unknowns.
; $afLetter - [in/out] An array of booleans.
; Return values .: None
; Author ........: Tipulatoid, MrCreatoR
; Modified ......:
; Remarks .......:
; Related .......:
; Link ..........: http://www.autoitscript.com/forum/topic/22838-pop3-udf-according-to-the-1939-rfc/#entry596715
; Example .......: No
; ===============================================================================================================================
Func __POP3_EML_Parser_AddToLetterArray($aContents, ByRef $afLetter)
If IsArray($aContents) Then
For $i_ID = 0 To UBound($aContents) - 1
_ArrayAdd($afLetter, $aContents[$i_ID])
Next
Else
_ArrayAdd($afLetter, $aContents)
EndIf
; Return $afLetter
EndFunc ;==>__POP3_EML_Parser_AddToLetterArray
#EndRegion _POP3_Ex.au3 - _EML_ Functions
#Region _POP3_Ex.au3 - ConosoleDebugingSystem
Func _POP3_ConsoleDebugError($sText)
If _POP3_ConsoleDebugSatus() Then
ConsoleWriteError($sText & @CRLF)
EndIf
EndFunc ;==>_POP3_ConsoleDebugError
Func _POP3_ConsoleDebug($sText)
If _POP3_ConsoleDebugSatus() Then
ConsoleWrite($sText & @CRLF)
EndIf
EndFunc ;==>_POP3_ConsoleDebug
; #FUNCTION# ====================================================================================================================
; Name ..........: _POP3_ConsoleDebugSatus
; Description ...: Set/Check POP3 ConsoleDebugingSystem
; Syntax ........: _POP3_ConsoleDebugSatus([$bDebug = Default])
; Parameters ....: $bDebug - [optional] A binary value. Default is Default = do not change nothing just return Current status.
; Return values .: Status, current or just set
; Author ........: mLipok
; Modified ......:
; Remarks .......: Default Status is False = POP3 ConsoleDebugingSystem is Disabled
; Related .......:
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func _POP3_ConsoleDebugSatus($bDebug = Default)
Local Static $bDebugStatic = False
If $bDebug <> Default Then
If $bDebug = True Then
$bDebugStatic = True
Else
$bDebugStatic = False
EndIf
EndIf
Return $bDebugStatic
EndFunc ;==>_POP3_ConsoleDebugSatus
#EndRegion _POP3_Ex.au3 - ConosoleDebugingSystem
#Region _POP3_Ex.au3 - #INTERNAL_USE_ONLY#
; #INTERNAL_USE_ONLY# ==========================================================
; Name ..........: __POP3_Cmd
; Description ...:
; Syntax ........: __POP3_Cmd($sMSg)
; Parameter(s): .: $sMSg -
; Return Value ..: Success - string
; Failure - 0
; @ERROR -
; Author(s) .....: Thorsten Willert
; Date ..........: Thu Jan 14 17:07:08 CET 2010
; ==============================================================================
Func __POP3_Cmd($sMSg)
If _POP3_ConsoleDebugSatus() Then _POP3_ConsoleDebug(">: " & $sMSg & @CRLF)
TCPSend($g__iPOP3_SOCKET, $sMSg & @CRLF)
If @error Then Return SetError($POP3_ERROR_USER_REFUSED, 0, 0)
Local $sRet = __POP3_WaitForOK()
If @error Then Return SetError($POP3_ERROR_NO_OK_RESPONSE, 0, 0)
Return $sRet
EndFunc ;==>__POP3_Cmd
; #INTERNAL_USE_ONLY# ==========================================================
; Name ..........: __POP3_WaitForOK
; Description ...: Returns the server response if it starts with "+OK"
; Syntax ........: __POP3_WaitForOK()
; Parameter(s): .: -
; Return Value ..: Success - string
; Failure - ""
; @ERROR -
; Author(s) .....: Luc HENNINOT, Thorsten Willert
; Date ..........: Thu Jan 14 11:50:34 CET 2010
; ==============================================================================
Func __POP3_WaitForOK()
; Wait for server response.
Local $sRet
Local $hTimer = TimerInit()
While TimerDiff($hTimer) < _POP3_ServerResponseTimeOut()
$sRet = __POP3_WaitTcpResponse()
If Not @error And StringRegExp($sRet, '\+OK') Then Return StringRegExpReplace($sRet, '\+OK\s?', "")
If StringRegExp($sRet, '\-ERR\s?') Then Return SetError($POP3_ERROR_ERR_RESPONSE, 0, "")
Sleep(100)
WEnd
Return SetError($POP3_ERROR_SERVER_RESPONSE_TIMEOUT, 0, "")
EndFunc ;==>__POP3_WaitForOK
; #INTERNAL_USE_ONLY# ===========================================================================================================
; Name ..........: __POP3_WaitTcpResponse
; Description ...: Returns the server response
; Syntax ........: __POP3_WaitTcpResponse()
; Return values .:
; Success - string
; Failure - 0
; Author ........: Luc HENNINOT
; Modified ......: Thorsten Willert, mLipok
; Remarks .......: Timeout to 60 s, should be enough in most cases. Change it if needed by using _POP3_ServerResponseTimeOut().
; Related .......: _POP3_ServerResponseTimeOut()
; Link ..........:
; Example .......: No
; ===============================================================================================================================
Func __POP3_WaitTcpResponse()
Local $sRet = ""
Local $hTimer = TimerInit()
While TimerDiff($hTimer) < _POP3_ServerResponseTimeOut()
$sRet = TCPRecv($g__iPOP3_SOCKET, 512)
If _POP3_ConsoleDebugSatus() And $sRet Then _POP3_ConsoleDebug("<: " & $sRet)
If $sRet <> "" Then Return $sRet
Sleep(100)
WEnd
Return SetError($POP3_ERROR_TCPRECV_TIMEOUT, 0, 0)
EndFunc ;==>__POP3_WaitTcpResponse
#EndRegion _POP3_Ex.au3 - #INTERNAL_USE_ONLY#