Давайте начнем с начала POP3
является третье версией POP (Post Office Protocol). Он (вместе с IMAP)
является стандартным почтовым протоколом для получения почты через Сеть. Вам
нужно знать только несколько вещей: имя пользователя, пароль, и адрес вашего
почтового сервера. Для тех, кто использует dial-up подключение этот адрес
выглядит приблизительно так: pop.ispname.com, где ispname -- имя вашего
провайдера. Это все, что вам нужно знать для использования почты, но если вы
хотите что-то написать свое , вам нужно понять, как это все работает.
Сначала вам нужно подсоединиться к
правильному порту. Обычно это порт 110. Если вы знаете, что ваша ЛС
(локальная сеть) использует другой порт, вам нужно использовать именно его,
чтобы все работало.
Для этой статьи я использовал контрол
Winsock. Теперь я расскажу в деталях про то, что делает Winsock. Winsock не
предоставляет нам богатство свойств, но те, что он имеет, плюс методы и
события делают его очень мощным контролом. В этой статья я опишу, как нужно
подсоединяться к серверу через Winsock, но для этого вам нужно понимание всех
комманд, которые я привожу.
Неплохой идеей для изучения комманд POP
сервера является загрузка пробной версии MDaemon (http://mdaemon.com). Это
очень неплохая программа, которая позволит вам изучить все комманды при
работе с почтовым сервером.
Команды Перед тем, как отсылать данные,
вам нужно послать ключевое слово, например USER, потом значение, а потом
vbCrlf. Вот список доступных комманд:
USER - отсылает имя пользователя
PASS - отсылает пароль
QUIT - завершает сессию соединения
DELE - удаляет сообщение с сервера
RSET - отменяет все изменения, созданные
за эту сессию
STAT - получает количество сообщений на
сервере
RETR - получает содержимое сообщения
Если комманда проходит успешно, то вы
получите ответ +OK от сервера. Если были какие-либо проблемы, то вы получите
сообщение -ER. Вот пример кода, который отсылает имя пользователя:
Winsock1.SendData "USER Bob" & vbCrlf
Теперь, чтобы определить, что же мы
получили от сервера, нам надо использовать событие Winsock1_DataArrival. Это
событие не доставляет нам никаких данных, оно просто показывает нам, пришло
ли какие данные и их размер. Мы должны использовать метод Winsock1.GetData
чтобы получить данные:
Private Sub WInsock1_DataArrival(ByVal bytesTotal As Long)
Dim strData As String
Winsock1.GetData strData, vbString
WholeThing = WholeThing & strData
ResponseState = Left$(WholeThing, 3)
End Sub
Ошибки
Winsock также предоставляет событие
Winsock1_Error. Это событие предоставляет огромное количество информации про
ошибки, помогающие нам сказать пользователю, что же произошло. Вот пример события Winsock1_Error event:
Private Sub Winsock1_Error(ByVal Number
As Integer, _
Description As String, ByVal Scode As Long, _
ByVal Source As String, ByVal HelpFile As String, _
ByVal HelpContext As Long, CancelDisplay As Boolean)
Msgbox "Error number: "
& Number & vbCrlf & _
"Error Description: " & Description
End Sub
Что мне нравится в идеи написания собственного почтового клиента, так это то, что можно оставлять сообщения на сервере . Это
может выглядить так: вы в дороге, проверяете почту и читаете ее, ответить на
важные сообщения и/или удалить ненужные сообщения на сервере и отсоединиться,
оставив остальную часть почты нетронутой. Это позволит вам загрузить все
сообщения позже, на работе/дома. Вы можете даже расширить функциональность
своей программы, добавив возможность сохранять вашу почту на HDD, для последующего
ее прочтения.
Соединение
Теперь давайте проверим все на практике.
Вставьте нижеприведенный код; я объясню, что он делает:
Private Function
ConnectToPOP(strServer As String, _
strUser As String, strPwd As String)As Boolean
Dim strOut As String
ConnectToPOP = False
Winsock1.Connect strServer, 110 ' Измените порт , если это необходимо
WaitFor 1, strOut
If strOut = "+OK" Then
Winsock1.SendData "USER " & strUser & vbCrlf
Else
ConnectToPOP = False
Exit Function
End If
WaitFor 1, strOut
If strOut = "+OK" Then
Winsock1.SendData "PASS " & strPwd & vbCrlf
Else
ConnectToPOP = False
Exit Function
End If
WaitFor 1, strOut
If strOut = "+OK" Then
ConnectToPOP = True
Else
ConnectToPOP = False
End If
End Function
Запомните, после того, как мы отправим какие-либо данные, нам нужно подождать ответа. Я
использовал для этого процедуру WaitFor. Сначала мы подсоединяемся, используя
метод Winsock1.Connect, указывая имя сервера и порт. Потом мы ждем ответа, и
проверим, чтобы ответ был +OK. Если ответ +OK, то мы отсылаем имя
пользователя, используя комманду USER. И наконец, если ответ +OK, то мы
отсылаем пароль. И если все это прошло успешно, то мы подключились к серверу!
|