PDA

Показать полную графическую версию : [решено] Работа с POP3 сервером


morgan1991
04-08-2009, 16:19
Здравствуйте!
Помогиет пожалуйста понять в чём проблема:

#include <GUIConstantsEx.au3>

TCPStartup()
$ConnectedSocket = -1
$ConnectedSocket = TCPConnect("94.100.177.6", 110)
If @error Then
MsgBox(0, "", "Ошибка: " & @error)
Exit
EndIf

Global $GuiMain = GUICreate("test", 300, 255)
Global $GuiEdit = GUICtrlCreateEdit("", 10, 10, 280, 180)
Global $GuiInput = GUICtrlCreateInput("", 10, 200, 280, 20)
Global $GuiButtonSend = GUICtrlCreateButton("Выслать =>>", 200, 225)
GUISetState()

While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit

If $msg = $GuiButtonSend Then
GUICtrlSetData($GuiEdit, _
"Я" & " > " & GUICtrlRead($GuiInput) & @CRLF & GUICtrlRead($GuiEdit))
TCPSend($ConnectedSocket, GUICtrlRead($GuiInput))
If @error Then Exit
EndIf

$recv = TCPRecv($ConnectedSocket, 2048)
If @error Then Exit
If $recv <> "" Then GUICtrlSetData($GuiEdit, _
"pop3" & " > " & $recv & @CRLF & GUICtrlRead($GuiEdit))
WEnd

IP адрес в скрипте адрес mail.ru сервера...
Скрипт коннектится показывает ответ сервера +OK, но когда я ввожу команду и нажимаю отправить сервер не отвечает....
Скажите пожалуйста как это исправить?
И ещё вопросик как узнать IP адрес сервера?
Например я ввожу pop.mail.ru, а скрипт должен мне показать 94.100.177.6

amel27
05-08-2009, 10:02
morgan1991, все не так просто - POP3 использует протокол TELNET (http://ru.wikipedia.org/wiki/Telnet), поэтому требуется его пролная реализация в скрипте... либо (что проще) использовать для этого сторонние клиенты (Microsoft Telnet, PuTTY, etc.) или библиотеки (ExtraPUTTY (http://www.extraputty.com/index.html))

abb269
05-08-2009, 10:06
2morgan1991
может Вам вот это нужно
http://www.autoitscript.com/forum/index.php?showtopic=23860&st=0
Хотя это немного из другой оперы

amel27
05-08-2009, 10:10
И ещё вопросик как узнать IP адрес сервера?
Например я ввожу pop.mail.ru, а скрипт должен мне показать 94.100.177.6»
TCPStartup()
ConsoleWrite(TCPNameToIP("pop.mail.ru") &@CRLF)

morgan1991
05-08-2009, 17:15
или библиотеки (ExtraPUTTY) »
Я так понял в ней функция "Connexion" служит для подключения к серверу?
Я не очень понимаю, но пробовал сделать так:

$DllOpen = DllOpen("ExtraPuTTY.dll")
DllCall($DllOpen, "char", "Connexion", "char", "pop.mail.ru", "unsigned long", "4", "char", "ЛОГИН", "char", "ПАРОЛЬ", & _
"bool", "TRUE", "long", "0", "unsigned long", "0", "long", "1")

Не понял зачем нужно "GenerateReport" и "CallBackRcvData"...
Помогите разобраться....

amel27
06-08-2009, 06:00
пробовал сделать так »должно быть примерно так:
$ExtraPuTTY = EnvGet("ExtraPuTTY") ; путь к программе
$thConn = DllStructCreate("ulong") ; структура описателя соединения
If $ExtraPuTTY=="" Then MsgBox(16, "Script Error!", "Переменная окружения ExtraPuTTY н задана!")
; Открываем DLL
$hDll = DllOpen($ExtraPuTTY &"\ExtraPuTTY.dll")
If $hDll=-1 Then MsgBox(16, "Script Error!", "Файл ExtraPuTTY.DLL не найден!")
; Подключаемся...
$aRet = DllCall($hDll, "int", "Connexion", _
"str", "94.100.177.6", _ ; TargetName (TargetName or PuttySession Name )
"ptr", DllStructGetPtr($thConn), _ ; ConnexionId (Connexion Handle)
"str", "", _ ; Login
"str", "", _ ; Password
"int", 0, _ ; ShowPuTTY (TRUE: Putty Terminal is display, FALSE: not display)
"int", 0, _ ; Protocol (0:Telnet,1:SSH,2:Rlogin,3:Raw,4:LoadPutty Session)
"int", 110, _ ; PortNumber (If the parameter is set to 0, the value of the default settings of putty is used)
"int", 0, _ ; GenerateReport (1:extraputty report activate,0:Not activate)
"ptr", 0 ) ; CallBackRcvData
; Анализируем результат
If @error Then MsgBox(16, "DllCall Error!", @error &":"& @extended)
$hConn = DllStructGetData($thConn, 1) ; Получаем описатель соединения
ConsoleWrite("Результат выполнения ф-ции Connexion = "& $aRet[0] &@CRLF)
; Закрываем соединение
If $hConn <> 0 Then
DllCall($hDll, "int", "CloseConnexion", "ulong", $hConn)
EndIf
Не понял зачем нужно "GenerateReport" и "CallBackRcvData"... »
это опциональные параметры... судя по имени, GenerateReport должен генерить отчет о сеансе, CallBackRcvData - определяет CallBack-функцию, которая будет перехватывать все промежуточные данные еще до завершения команды (обычно используется для всяких индикаторов состояния/прогрессбаров)

P.S. Для POP3 (http://ru.wikipedia.org/wiki/POP3) не нужно передавать Login/Password при установке соединения - для этого есть отдельные команды (USER/PASS), передаваемые уже в самом сеансе.

morgan1991
06-08-2009, 13:23
должно быть примерно так: »
Он мне возвращает 1, и какой бы я путь к программе не указал пишет что путь не указан.
А если коменчу, то возвращает 1.

amel27
06-08-2009, 13:29
Он мне возвращает 1 »в свойствах компьютера нужно задать системную переменную с именем ExtraPuTTY, содержащую путь к каталогу с программой, и проверить в CMD командой: "Set ExtraPuTTY", должна выдать что-то типа:
ExtraPutty=C:\Program Files\ExtraPuTTY

цитата из справки:
The ExtraPuTTY DLL need the path of ExtraPuTTY.
In order to do that you must create the environment variable "ExtraPuTTY" with the path of ExtraPuTTY.

morgan1991
06-08-2009, 13:36
в свойствах компьютера нужно задать системную переменную с именем ExtraPuTTY, содержащую путь к каталогу с программой, и проверить в CMD »
Всё сделал, но всёравно выдаёт ошибки: переменная не задана и не могу открыть DLL...

amel27
06-08-2009, 13:51
всёравно выдаёт ошибки »можно задать напрямую через реестр, но потребуется перелогин/перезагрузка:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]
"ExtraPutty"="C:\\Program Files\\ExtraPuTTY"

morgan1991
06-08-2009, 14:37
amel27, спасибо помогло.
Дальше сделал так:

$ExtraPuTTY = EnvGet("ExtraPuTTY") ; путь к программе
$thConn = DllStructCreate("ulong") ; структура описателя соединения
If $ExtraPuTTY == "" Then MsgBox(16, "Script Error!", "Переменная окружения ExtraPuTTY не задана!")
; Открываем DLL
$hDll = DllOpen($ExtraPuTTY & "\ExtraPuTTY.dll")
If $hDll=-1 Then MsgBox(16, "Script Error!", "Файл ExtraPuTTY.DLL не найден!")
; Подключаемся...
$aRet = DllCall($hDll, "int", "Connexion", _
"str", "94.100.177.6", _ ; TargetName (TargetName or PuttySession Name )
"ptr", DllStructGetPtr($thConn), _ ; ConnexionId (Connexion Handle)
"str", "", _ ; Login
"str", "", _ ; Password
"int", 0, _ ; ShowPuTTY (TRUE: Putty Terminal is display, FALSE: not display)
"int", 0, _ ; Protocol (0:Telnet,1:SSH,2:Rlogin,3:Raw,4:LoadPutty Session)
"int", 110, _ ; PortNumber (If the parameter is set to 0, the value of the default settings of putty is used)
"int", 0, _ ; GenerateReport (1:extraputty report activate,0:Not activate)
"ptr", 0 ) ; CallBackRcvData
; Анализируем результат
If @error Then MsgBox(16, "DllCall Error!", @error &":"& @extended)
$hConn = DllStructGetData($thConn, 1) ; Получаем описатель соединения
ConsoleWrite("Результат выполнения ф-ции Connexion = "& $aRet[0] &@CRLF)

$aRet2 = DllCall($hDll, "int", "SendRcvData", _
"ptr", DllStructGetPtr($thConn), _
"str", "USER ЛОГИН", _
"int", 1, _
"str", "com", _
"int", 1000, _
"int", 1, _
"int", 2048, _
"int", 0)
ConsoleWrite("Результат выполнения ф-ции SendRcvData = "& $aRet2[0] &@CRLF)

; Закрываем соединение
If $hConn <> 0 Then
DllCall($hDll, "int", "CloseConnexion", "ulong", $hConn)
EndIf

А в ответ:


Результат выполнения ф-ции Connexion = 0
Результат выполнения ф-ции SendRcvData = 1


Что опять не так?

amel27
07-08-2009, 10:17
Что опять не так? »путаешь указатели с данными
$ExtraPuTTY = EnvGet("ExtraPuTTY") ; путь к программе
$thConn = DllStructCreate("ulong") ; структура описателя соединения
If $ExtraPuTTY == "" Then Exit MsgBox(16, "Script Error!", "Переменная окружения ExtraPuTTY не задана!")
$hDll = DllOpen($ExtraPuTTY & "\ExtraPuTTY.dll")
If $hDll=-1 Then Exit MsgBox(16, "Script Error!", "Файл ExtraPuTTY.DLL не найден!")

$aRet = DllCall($hDll, "int", "Connexion", _
"str", "94.100.177.6", "ptr", DllStructGetPtr($thConn), _
"str", "", "str", "", "int", 0, _
"int", 0, "int", 110, _
"int", 0, "ptr", 0 )
If @error Then MsgBox(16, "DllCall Error!", @error &":"& @extended)
$hConn = DllStructGetData($thConn, 1) ; Получаем описатель соединения
ConsoleWrite("Результат выполнения ф-ции Connexion = "& $aRet[0] &@CRLF)

$iMax = 1024 ; размер буфера
$tBuf = DllStructCreate("char["& $iMax &"]") ; буфер
$tpBuf = DllStructCreate("ptr") ; указатель на буфер
DllStructSetData($tpBuf, 1, DllStructGetPtr($tBuf)) ; устанавливаем указатель

$aRet = DllCall($hDll, "int", "SendRcvData", _
"ulong", $hConn, "str", "USER ivan@mybox.ru", _
"str", "", "str", "", "long", 1000, _
"int", DllStructGetPtr($tpBuf), "int", $iMax, _
"int", 0)
ConsoleWrite("Результат выполнения ф-ции SendRcvData = "& $aRet[0] &@CRLF)
ConsoleWrite("Содержимое буфера:"& DllStructGetData($tBuf,1) &@CRLF)

; Закрываем соединение
If $hConn <> 0 Then
DllCall($hDll, "int", "CloseConnexion", "ulong", $hConn)
EndIf

З.Ы. в комплекте идет скомпиленый пример "SampleConnexion.exe" - полезная тулза для ручной установки соединения и проверки всех TELNET-команд

got686
28-01-2011, 21:40
Спасибо автору. Он сделал все совершенно верно в изначальном коде и без сторонних утилит. Я тоже убил сутки на раскрычивание этого дела, а стоило прочитать спецификацию pop3. Каждая команда оканчивается символом CRLF (перенос каретки).

Изначальный код верен с добавлением этого символа




© OSzone.net 2001-2012