简介
本文介绍如何使用VB.NET实现POP3和SMTP协议。在源文件中包含有一个DLL文件,该DLL包含两个类来实现POP3和SMTP和电子邮件的编解码器的一个额外的类(基数为64只,不包含在源代码,因为它是现在正在测试)。
有问题吗?请合同{A}我立刻。这些类的主要功能
最基本的功能是相同的类的POP3和SMTP类。连接到邮件服务器
发送命令到服务器{C}检查服务器的响应 Private Function Connect() As Boolean
Try
sockPOP3.Connect(m_Remote)
If sockPOP3.Connected = True Then
sockPOP3.Receive(bufferReceive)
Return True
Else
Return False
End If
Catch ex As Exception
sockPOP3.Close()
Throw New Exception("Failed to Connect " +
"Host:" & vbCrLf & ex.Message)
End Try
End Function
POP3和SMTP的命令'POP3
'The pop3 server will return "+OK" when command success,
'otherwise it will return "-ERR".
Private Function CorrectedResponse(ByVal ReceivedBytes() As Byte, _
Optional ByRef Message As String = "") As Boolean
Dim strText As String = Encoding.ASCII.GetString(ReceivedBytes)
Message = strText
RaiseEvent GotResponse(strText)
If strText.StartsWith("+OK") Then
Return True
Else
Return False
End If
End Function
'SMTP
'The SMTP server will return a message with a three-bit-digital
'for each command. The first bit indicates whether the
'command is successful or failed as show below
Private Function CorrectedResponse(ByVal ReceivedBytes() As Byte, _
Optional ByRef Message As String = "") As Boolean
'The first digital of the three digitals in
'response message indicates as follow:
'1: command accepted, waiting for confirm
'2: command executed
'3: command accepted, waiting for more information
'4: command refused
'5: command failed
Dim strText As String = Encoding.ASCII.GetString(ReceivedBytes)
Message = strText
RaiseEvent GotResponse(strText)
Select Case strText.Substring(0, 1)
Case 1, 2, 3
Return True
Case 4, 5
Return False
Case Else
Return False
End Select
End Function
在这里,我将只显示您使用Microsoft Exchange邮件服务器的两个会议。邮件类调用的SendCommand()方法和CorrectedResponse()方法,将命令发送到服务器并检查命令的执行结果。你可以找到更多关于POP3和SMTP协议标准的信息在网络上。
大胆的字符串表示这是一个命令:
如何使用QMailClient类==SMTP===
220 Microsoft ESMTP MAIL Service, Version: 5.0.2195.6713 ready at
Fri, 13 Aug 2004 11:12:22 +0800
helo
250 mail.cyberrs2.com Hello [192.168.101.52]
mail from:test@test.com
250 2.1.0 test@test.com ....Sender OK
rcpt to:abc@abc.com
250 2.1.5 abc@abc.com
data
354 Start mail input; end with <CRLF>.<CRLF>
subject:test test smtp & pop3
.
250 2.6.0 <MAILiAXL21xDenYPnDd00022f02> Queued mail for delivery
quit
221 2.0.0 Service closing transmission channel
==POP3==
+OK Microsoft Exchange Server 2003 POP3 6.5.6944.0 (mail.cyberrs2.com)
user test
+OK
pass ******
+OK User successfully logged on.
stat
+OK 1 414
list
+OK 1 414
1 414
.
retr 1
+OK
Received: Microsoft SMTPSVC(5 .0.2195.6713);
Fri, 13 Aug 2004 11:12:45 +0800 subject:test From: test@test.com
Bcc:
Return-Path: test@test.com
Message-ID: <MAILiAXL21xDenYPnDd00022f02>
X-OriginalArrivalTime: 13 Aug 2004 03:13:00.0356 (UTC)
FILETIME=[7051D840:01C480 E3]
Date: 13 Aug 2004 11:13:00 +0800
test smtp & pop3
.
dele 1
+OK
quit
+OK Microsoft Exchange Server 2003 POP3 6.5.6944.0
'Get mail list from serverrDim MailReceiver As QMailClient.POP3Client
MailReceiver = New POP3Client
MailReceiver.RemoteServerAddress = "pop3.163.com"
MailReceiver.UserName = "xxx"
MailReceiver.Password = "yyyy"
'Optional, please set this TRUE when you are under firewall or
'using antivirus software which will scan incoming and outgoing mails.
MailReceiver.IncreaseNetworkCompatible = True
If MailReceiver.Login() = False Then
MessageBox.Show("Login failed", "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End If
If Not arrList Is Nothing Then
arrList.Clear()
arrList = MailReceiver.GetMailList(True)
MailReceiver.Quit()
End Iff
'Get a mail from server according to the
'mail index which can be obtained in mail list
Dim MailReceiver As QMailClient.POP3Client
MailReceiver = New POP3Client
MailReceiver.RemoteServerAddress = "pop3.163.com"
MailReceiver.UserName = "xxx"
MailReceiver.Password = "yyyy"
MailReceiver.IncreaseNetworkCompatible = True
Try
MailReceiver.Login()
'Mail Index, it can be obtain from mail list(start from 1)
Mail = MailReceiver.RetrieveMail(MailIndex)
Catch ex As Exception
MessageBox.Show(ex.Message, "Error", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
MailReceiver.Quit()
End Try
'NOTES: The Retrievemail() method has two overloads which will return
'a QMailClient.EMail object or the source code string of the mail,
'The EMail object can decode the mail automatically and
'support many mail content type such as multipart/mixed,
'multipart/related and multipart/report.
'If you want to use your own mail decoder then just call the overload
'function which only return mail source code (string).
'Show mail on a form or a web page
'NOTES: The code below is not assured to run because it needs some
'form controls, here just show an example.
'The Email.body contains the plain text mail content and the
'Email.bodyHTML contains the source HTML code of the mail
'content if the mail is formatted in HTML
Private Sub ShowMail()
>> Me.lblMailDate.Text = "DATE: " & Mail.Date
>> Me.lblMailFrom.Text = "FROM: " & Mail.From
>> Me.lblMailSubject.Text = "SUBJECT: " & Mail.Subject
>> Me.lblMailTo.Text = "TO: " & Mail.To
>> 'Write a temp file to show HTML mail
>> If Mail.BodyContentType = EMail.ContentType.MultipartAlternative Then
>> Dim file As New FileStream(FolderTmp & "tmp.html", _
FileMode.Create, FileAccess.Write, FileShare.None)
>> Dim a As Encoding = Encoding.GetEncoding("gb2312")
>>
>> file.Write(a.GetBytes(Mail.BodyHTML), 0, _
a.GetByteCount(Mail.BodyHTML))
>> file.Close()
>> Me.rtxtContent.Text = Mail.Body
>> Me.tbtnHTML.Enabled = True
>> ElseIf Mail.BodyContentType = EMail.ContentType.MultipartRelated Then
>> Dim file As New FileStream(FolderTmp & "tmp.html", _
FileMode.Create, FileAccess.Write, FileShare.None)
>> Dim a As Encoding = Encoding.GetEncoding("gb2312")
>>
>> Dim att As MailAttachment
>> Dim strBody As String = Mail.BodyHTML
>> For Each att In Mail.Attachments
>> If att.ContentID <> "" Then
>> strBody = strBody.Replace("cid:" & att.ContentID, _
att.FileName)
>> att.SaveToFile(FolderTmp & att.FileName)
>> End If
>> Next
>>
>> file.Write(a.GetBytes(strBody), 0, a.GetByteCount(strBody))
>> file.Close()
>> Me.rtxtContent.Text = Mail.Body
>> Me.tbtnHTML.Enabled = True
>> Else
>> Me.rtxtContent.Text = Mail.Body
>> Me.tbtnHTML.Enabled = False
>> End If
>>
>> If Mail.Attachments.Count <> 0 Then
>> Dim mailAttach As MailAttachment
>>
>> For Each mailAttach In Mail.Attachments
>> 'Create a empty file in order to get icon
>> Dim strExName As String = _
>> FileInformation.GetFileExtendedName(mailAttach.FileName)
>> Dim strmFile As New _
>> FileStream(FolderTmp & "ico." & strExName, _
>> FileMode.Create)
>> strmFile.Close()
>>
>> Dim fsi As System.IO.FileSystemInfo
>> fsi = New FileInfo(FolderTmp & "ico." & strExName)
>> imgFileIcons.Images.Add(IconExtractor.GetSmallIcon(fsi))
>> lstvAttachments.Items.Add(_
SysInfomation.GetFileNameFromFilePath(_
mailAttach.FileName), _
imgFileIcons.Images.Count - 1)
>> Next
>> Me.grpbxAttach.Visible = True
>> End If
>> End Sub
'Sending a mail
>>>> Dim mailSend As New QMailClient.EMail
'Use ";" to splite multi-receivers
>>>> mailSend.To = "abc@bcd.com;dd@dd.com"
>>>> mailSend.Cc = "cc@dd.com"
>>>> mailSend.Subject = "test"
>>>> mailSend.Body = "test1"
>>>> mailSend.From = "abc@abc.com"
>>>>
>>>> Dim mailClient As New SMTPClient
>>>> mailClient.RemoteServerAddress = "pop3.163.com"
>>>>
>>>> mailClient.IncreaseNetworkCompatible = True
>>>>
>>>> If mailClient.Connect = True Then
>>>>
>>>> mailClient.UserName = "user"
>>>> mailClient.Password = "pass"
>>>>
>>>> If mailClient.AuthLogin = False Then
>>>> MessageBox.Show("Authentication failed", _
"Error", MessageBoxButtons.OK, _
MessageBoxIcon.Error)
>>>>
>>>> Exit Sub
>>>> End If
>>>>
>>>>
>>>> mailClient.SendMail(mailSend)
>>>>
>>>> mailClient.Quit()
>>>>
>>>> mailClient = Nothing
>>>> End If