⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 39.htm

📁 VB的一些网络编程的例子,个人认为还不错。大家一起来研究一下.
💻 HTM
字号:
<p>简单电子邮件发送程序</p>
<p></p>
<p></p>
<p>本文将向你介绍如何编写一个能发送简单的电子邮件的程序。所谓简单是指本程序只能发送纯文本,并且一次只能发送给一个收件人。</p>
<p></p>
<p>首先新建一个工程。</p>
<p></p>
<p>将窗体的Name属性改为"frmSendMail" ,Caption属性改为"Simple Mail sender", BorderStyle 属性值设为"1 - Fixed Single"。</p>
<p></p>
<p>向窗体中添加一个Winsock控件。按下图所示在窗体中添加相应的控件。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>将上面的New Message, Send Message ?Close 等命令按钮的Name属性分别改为cmdNew, cmdSend ?及cmdClose。</p>
<p></p>
<p>将下面的代码添加到相应的事件中</p>
<p></p>
<p>Private Sub cmdNew_Click()</p>
<p></p>
<p>    txtRecipient = ""</p>
<p>    txtSubject = ""</p>
<p>    txtMessage = ""</p>
<p>    </p>
<p>End Sub</p>
<p></p>
<p>Private Sub cmdClose_Click()</p>
<p></p>
<p>    Unload Me</p>
<p>    </p>
<p>End Sub </p>
<p></p>
<p>现在来写发送邮件的代码。</p>
<p></p>
<p>如果你看过本站的上一篇文章“SMTP协议简介”的话,你就已经知道了我们在这里会用到一些什么样的命令。这些命令必须严格按照预先规定的顺序来发送。为了跟踪这一顺序,我们将用到一个特殊的变量m_State,我们将用它来存储当前的SMTP进程的状态。</p>
<p></p>
<p>你可以将SMTP进程状态看作是等待服务对某一命令反应的状态,也就是说向服务器发送了多少个命令就有多少个状态。我们无法用VB的数据类型来描述进程所处的状态。因此本程序中用到了一个特殊的数据类型"SMTP_State" 。把下面的代码添加到窗体的声明段中: </p>
<p></p>
<p>Private Enum SMTP_State</p>
<p>    MAIL_CONNECT</p>
<p>    MAIL_HELO</p>
<p>    MAIL_FROM</p>
<p>    MAIL_RCPTTO</p>
<p>    MAIL_DATA</p>
<p>    MAIL_DOT</p>
<p>    MAIL_QUIT</p>
<p>End Enum</p>
<p></p>
<p>Private m_State As SMTP_State</p>
<p></p>
<p>把下面的代码放在Send Message的Click事件中。</p>
<p></p>
<p>Private Sub cmdSend_Click()</p>
<p></p>
<p>    Winsock1.Connect Trim$(txtHost), 25</p>
<p>    m_State = MAIL_CONNECT</p>
<p>    </p>
<p>End Sub</p>
<p></p>
<p>上面的代码第一行用来同服务器建立连接,25是SMTP服务器的默认端口号。接下来要做的就是在Winsock的DataArrival事件中编写代码处理服务的回应。代码的结构如下:</p>
<p></p>
<p>Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)</p>
<p></p>
<p>    Dim strServerResponse   As String </p>
<p>    Dim strResponseCode     As String </p>
<p>    </p>
<p>    strResponseCode = Left(strServerResponse, 3)</p>
<p>    </p>
<p>    If strData = "250" Or _</p>
<p>       strData = "220" Or _</p>
<p>       strData = "354" Then </p>
<p>       </p>
<p>        Select Case m_State </p>
<p>            Case MAIL_CONNECT</p>
<p>            Case MAIL_HELO</p>
<p>            Case MAIL_FROM</p>
<p>            Case MAIL_RCPTTO</p>
<p>            Case MAIL_DATA</p>
<p>            Case MAIL_DOT</p>
<p>            Case MAIL_QUIT </p>
<p>        End Select </p>
<p>       </p>
<p>    Else </p>
<p>        MsgBox "SMTP Error: " & strServerResponse, _</p>
<p>                vbInformation, "SMTP Error"</p>
<p>    End If </p>
<p>    </p>
<p>End Sub </p>
<p></p>
<p>第一行执行代码用来辨明来自服务器的回应。接下来的IF/ELSE/ENDIF循环用来判断回应是否同预定义的值相等。220,250和354都是来自服务器的肯定回应(详见SMTP协议简介一文),对于来自服务器的失败的回应则用一个对话框来显示。下面是完整的代码。</p>
<p></p>
<p>Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)</p>
<p></p>
<p>    Dim strServerResponse   As String </p>
<p>    Dim strResponseCode     As String </p>
<p>    Dim strDataToSend       As String </p>
<p>    ' </p>
<p>    '接收来自服务器的数据并存储在strServerResponse变量中</p>
<p>    ' </p>
<p>    Winsock1.GetData strServerResponse</p>
<p>    ' </p>
<p>    Debug.Print strServerResponse</p>
<p>    ' </p>
<p>    获取来自服务器的回应的代码</p>
<p>    ' </p>
<p>    strResponseCode = Left(strServerResponse, 3)</p>
<p>    ' </p>
<p>    '只有下面这个三个数字才表示服务执行你的命令成功,我们可以进行下一步的操作</p>
<p>    ' </p>
<p>    If strResponseCode = "250" Or _</p>
<p>       strResponseCode = "220" Or _</p>
<p>       strResponseCode = "354" Then </p>
<p>       </p>
<p>        Select Case m_State</p>
<p>            Case MAIL_CONNECT</p>
<p>                '改变当前进程的状态</p>
<p>                m_State = MAIL_HELO</p>
<p>                ' </p>
<p>                '去掉空格</p>
<p>                strDataToSend = Trim$(txtSender)</p>
<p>                ' </p>
<p>                '获取信箱名</p>
<p>                strDataToSend = Left$(strDataToSend, _</p>
<p>                                InStr(1, strDataToSend, _</p>
<p>                                "@") - 1)</p>
<p>                '向服务器发送HELO命令</p>
<p>                Winsock1.SendData "HELO " & _</p>
<p>                                  strDataToSend & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "HELO " & strDataToSend</p>
<p>                ' </p>
<p>            Case MAIL_HELO</p>
<p>                ' </p>
<p>                '改变当前进程的状态 </p>
<p>                m_State = MAIL_FROM</p>
<p>                ' </p>
<p>                '向服务器发送 MAIL FROM命令</p>
<p>                Winsock1.SendData "MAIL FROM:" & _</p>
<p>                                 Trim$(txtSender) & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "MAIL FROM:" & Trim$(txtSender)</p>
<p>                ' </p>
<p>            Case MAIL_FROM</p>
<p>                ' </p>
<p>                '改变当前进程的状态</p>
<p>                m_State = MAIL_RCPTTO</p>
<p>                ' </p>
<p>                '</p>
<p>                Winsock1.SendData "RCPT TO:" & _</p>
<p>                                 Trim$(txtRecipient) & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "RCPT TO:" & Trim$(txtRecipient)</p>
<p>                ' </p>
<p>            Case MAIL_RCPTTO</p>
<p>                ' </p>
<p>                '改变当前进程的状态</p>
<p>                m_State = MAIL_DATA</p>
<p>                ' </p>
<p>                '向服务器发送DATA命令 </p>
<p>                Winsock1.SendData "DATA" & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "DATA"</p>
<p>                ' </p>
<p>            Case MAIL_DATA</p>
<p>                ' </p>
<p>                '改变当前进程的状态</p>
<p>                m_State = MAIL_DOT</p>
<p>                ' </p>
<p>                '现在我们可以开始发送邮件正文</p>
<p>                '文本的每一行必须以vbLf结尾</p>
<p>                '记住不是vbCrLf </p>
<p>                ' </p>
<p>                '发送邮件主题</p>
<p>                Winsock1.SendData "Subject:" & txtSubject & vbLf</p>
<p>                ' </p>
<p>                Debug.Print "Subject:" & txtSubject</p>
<p>                ' </p>
<p>                Dim varLines    As Variant </p>
<p>                Dim varLine     As Variant </p>
<p>                ' </p>
<p>                '解析邮件以获得行(VB6适用)</p>
<p>                varLines = Split(txtMessage, vbCrLf)</p>
<p>                ' </p>
<p>                '发送每一行邮件</p>
<p>                For Each varLine In varLines</p>
<p>                    Winsock1.SendData CStr(varLine) & vbLf</p>
<p>                    ' </p>
<p>                    Debug.Print CStr(varLine)</p>
<p>                Next </p>
<p>                ' </p>
<p>                '向服务器发送一个小数点告诉服务器邮件发送完毕。</p>
<p>                Winsock1.SendData "." & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "."</p>
<p>                ' </p>
<p>            Case MAIL_DOT</p>
<p>                '改变当前进程的状态</p>
<p>                m_State = MAIL_QUIT</p>
<p>                ' </p>
<p>                '向服务器发送QUIT命令</p>
<p>                Winsock1.SendData "QUIT" & vbCrLf</p>
<p>                ' </p>
<p>                Debug.Print "QUIT"</p>
<p>            Case MAIL_QUIT</p>
<p>                ' </p>
<p>                '断开连接</p>
<p>                Winsock1.Close </p>
<p>                ' </p>
<p>        End Select</p>
<p>       </p>
<p>    Else </p>
<p>        ' </p>
<p>        '如果服务器返回一个错误的代码就断开连接并提示用户</p>
<p>        ' </p>
<p>        Winsock1.Close </p>
<p>        ' </p>
<p>        MsgBox "SMTP Error: " & strServerResponse, _</p>
<p>                vbInformation, "SMTP Error"</p>
<p>        ' </p>
<p>    End If </p>
<p>    </p>
<p>End Sub </p>
<p></p>
<p>请注意,对于要发送的文本,我们是以vbLf结尾,而不是vbCrLf。这一规则同样适用于发送邮件的主题。如果不以vbLf结尾会让服务器错误理解你的命令。最后要做的事是对Winsock的Error事件编码,以处理错误。</p>
<p></p>
<p>Private Sub Winsock1_Error(ByVal Number As Integer, _</p>
<p>                           Description As String, _</p>
<p>                           ByVal Scode As Long, _</p>
<p>                           ByVal Source As String, _</p>
<p>                           ByVal HelpFile As String, _</p>
<p>                           ByVal HelpContext As Long, _</p>
<p>                           CancelDisplay As Boolean)</p>
<p></p>
<p>    MsgBox "Winsock Error number " & Number & vbCrLf & _</p>
<p>            Description, vbExclamation, "Winsock Error"</p>
<p></p>
<p>End Sub </p>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -