Что нового

Отправка письма на адрес Mail.ru с помощью TCP

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код сырой, но работает, если кто захочет, то можете доработать, даже можно написать UDF для отправки на Gmail, Yandex и другие Smtp сервера и прикрутить возможность отправки файлов почтой.

Пример
Код:
SendMail('Кому@mail.ru', 'От кого@mail.ru', 'Пароль', 'Тема', 'Сообщение')

Func SendMail($To, $sFrom, $sPassw, $sSubject, $sMessage)
	TCPStartup()

    $iSocket = TCPConnect(TCPNameToIP('smtp.mail.ru'), 25)
    TCPSend($iSocket, 'HELO ' & @LogonDomain & @CRLF)

    While 1
	    $sRecv = TCPRecv($iSocket, 2048)
	    If $sRecv <> '' Then
			If StringRegExp($sRecv, '250 smtp(.*).mail.ru') Then TCPSend($iSocket, 'AUTH LOGIN' & @CRLF)	
			If StringInStr($sRecv, 'VXNlcm5hbWU6') Then TCPSend($iSocket, _Base64_Encode($sFrom))
			If StringInStr($sRecv, 'UGFzc3dvcmQ6') Then TCPSend($iSocket, _Base64_Encode($sPassw))
			If StringInStr($sRecv, 'Authentication succeeded') Then
				TCPSend($iSocket, 'MAIL FROM: ' & $sFrom & @CRLF)
				TCPSend($iSocket, 'RCPT TO: ' & $To & @CRLF) 
			EndIf	
			If StringInStr($sRecv, '250 Accepted') Then TCPSend($iSocket, 'DATA' & @CRLF)
			If StringInStr($sRecv, '354 Enter message') Then
				TCPSend($iSocket, 'From: ' & $sFrom & @CRLF)
				TCPSend($iSocket, 'Subject: ' & $sSubject & @CRLF & @CRLF)
				TCPSend($iSocket, $sMessage & @CRLF)
				TCPSend($iSocket, '.' & @CRLF )
			EndIf	
			If StringInStr($sRecv, '250 OK id=') Then
				TCPSend($iSocket, 'QUIT' & @CRLF)
				ExitLoop
			EndIf	
	    EndIf
		Switch StringMid($sRecv, 1, 3)
		    Case 421 To 554 
			    Return SetError(-1, 0, 0)
        EndSwitch
    Wend
	
	TCPCloseSocket($iSocket)
	TCPShutdown()
	Return 1
EndFunc	

Func _Base64_Encode($sData, $iFlag = 1)
    Local $Ret, $bData, $tData, $tText
    $bData = StringToBinary($sData, $iFlag)
    $tData = DllStructCreate('byte[' & BinaryLen($bData) & ']')
    DllStructSetData($tData, 1, $bData)
    $Ret = DllCall('crypt32.dll', 'bool', 'CryptBinaryToStringW', 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1, 'ptr', 0, 'dword*', 0)
    If (@error) Or (Not $Ret[0]) Then
        Return SetError(1, 0, '')
    EndIf
    $tText = DllStructCreate('wchar[' & $Ret[5] & ']')
    $Ret = DllCall('crypt32.dll', 'bool', 'CryptBinaryToStringW', 'ptr', DllStructGetPtr($tData), 'dword', DllStructGetSize($tData), 'dword', 1, 'ptr', DllStructGetPtr($tText), 'dword*', $Ret[5])
    If (@error) Or (Not $Ret[0]) Then
        Return SetError(1, 0, '')
    EndIf
    Return DllStructGetData($tText, 1)
EndFunc

Протокол smtp.mail.ru
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Жаль что нельзя отправить также файл(ы). А так..... здорово :ok:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Почему нельзя, можно, только сделать нужно :smile:
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Возникает законный вопрос - как?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
странно. у меня не работает. правда у меня почта на inbox, я поменял в скрипте нужные значения, но скрипт висит в цикле несколько минут и ничего.
и еще вопрос - через прокси работает? если есть настройка в свойствах обозревателя на прокси.
отправка писем используя CDO.Message работает и с прокси
 
Верх