`
lujar
  • 浏览: 512812 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

在VB6.0中使用Socket发送带SMTP认证的邮件

阅读更多

这个例子网上有很多版本,但是通常能发的,异常管理不是做的很好,这里的代码是我稍加整理的。包含了认证过程,我想现在SMTP一般都是要认证的吧。不要认证的只需把相应的行去掉即可。

代码如下:

Dim Response As String, Reply As Integer
Dim DateNow As String, first As String, Second As String, Third As String
Dim Fourth As String, Fifth As String, Sixth As String
Dim Seventh As String, Eighth As String
Dim Start As Single, Tmr As Single

Sub SendEmail(MailServerName As String, FromName As String, FromEmailAddress As String, ToName As String, ToEmailAddress As String, EmailSubject As String, EmailBodyOfMessage As String)
    Winsock1.LocalPort = 0  ' Must set local port to 0 (Zero) or
                            'you can only send 1 e-mail per program
                            'start

    If Winsock1.State = sckClosed Then 'Check to see if socet is closed
        DateNow = Format(Date, "Ddd") & ", " _
                & Format(Date, "dd Mmm YYYY") & " " _
                & Format(Time, "hh:mm:ss") & "" & " -0600"
       
        ' Get who's sending E-Mail address
        first = "mail from:" + Chr(32) + FromEmailAddress + vbCrLf
        ' Get who mail is going to
        Second = "rcpt to:" + Chr(32) + ToEmailAddress + vbCrLf
        ' Date when being sent
        Third = "Date:" + Chr(32) + DateNow + vbCrLf
        ' Who's Sending
        Fourth = "From:" + Chr(32) + FromName + vbCrLf
        ' Who it going to
        Fifth = "To:" + Chr(32) + ToNametxt + vbCrLf
        ' Subject of E-Mail
        Sixth = "Subject:" + Chr(32) + EmailSubject + vbCrLf
        ' E-mail message body
        Seventh = EmailBodyOfMessage + vbCrLf
        ' What program sent the e-mail, customize this
        Ninth = "X-Mailer: EBT Reporter v 2.x" + vbCrLf
        ' Combine for proper SMTP sending
        Eighth = Fourth + Third + Ninth + Fifth + Sixth
       
        Winsock1.Protocol = sckTCPProtocol ' Set protocol for sending
        Winsock1.RemoteHost = MailServerName ' Set the server address
        Winsock1.RemotePort = 25 ' Set the SMTP Port
        Winsock1.Connect ' Start connection
        WaitFor ("220")
        StatusTxt.Caption = "Connecting...."
        StatusTxt.Refresh
       
        Winsock1.SendData ("HELO xxx.gov.cn" + vbCrLf)
        WaitFor ("250")
        StatusTxt.Caption = "Connected"
        StatusTxt.Refresh
       
        Winsock1.SendData ("AUTH LOGIN" + vbCrLf)
        WaitFor ("334")
        StatusTxt.Caption = "Sending AUTH LOGIN"
        StatusTxt.Refresh
       
        Winsock1.SendData (Base64_Encode("danny@xxx.gov.cn") + vbCrLf)
        WaitFor ("334")
        StatusTxt.Caption = "Sending Username"
        StatusTxt.Refresh
       
        Winsock1.SendData (Base64_Encode("danny") + vbCrLf)
        WaitFor ("235")
        StatusTxt.Caption = "Sending Password"
        StatusTxt.Refresh
       
       
        Winsock1.SendData (first)
        StatusTxt.Caption = "Sending Message"
        StatusTxt.Refresh
        WaitFor ("250")
       
        Winsock1.SendData (Second)
        WaitFor ("250")
       
        Winsock1.SendData ("data" + vbCrLf)
        WaitFor ("354")
       
        Winsock1.SendData (Eighth + vbCrLf)
        Winsock1.SendData (Seventh + vbCrLf)
        Winsock1.SendData ("." + vbCrLf)
        WaitFor ("250")
       
        Winsock1.SendData ("quit" + vbCrLf)
        StatusTxt.Caption = "Disconnecting"
        StatusTxt.Refresh
        WaitFor ("221")
        Winsock1.Close
    Else
        MsgBox (Str(Winsock1.State))
    End If
End Sub

Sub WaitFor(ResponseCode As String)

    Start = Timer ' Time event so won't get stuck in loop

    While Len(Response) = 0
        Tmr = Start - Timer
        DoEvents ' Let System keep checking for incoming response **IMPORTANT**
            If Tmr > 50 Then ' Time in seconds to wait
                MsgBox "SMTP service error, timed out while waiting for response", 64, MsgTitle
                Exit Sub
            End If
        Wend

    While Left(Response, 3) <> ResponseCode
        DoEvents
            If Tmr > 50 Then
                MsgBox "SMTP service error, impromper response code. Code should have been: " + ResponseCode + " Code recieved: " + Response, 64, MsgTitle
                Exit Sub
            End If
    Wend
    Response = "" ' Sent response code to blank **IMPORTANT**
End Sub

Private Sub Command1_Click()
    SendEmail txtEmailServer.Text, txtFromName.Text, txtFromEmailAddress.Text, txtToEmailAddress.Text, txtToEmailAddress.Text, txtEmailSubject.Text, txtEmailBodyOfMessage.Text    'MsgBox ("Mail Sent")
    StatusTxt.Caption = "Mail Sent"
    StatusTxt.Refresh
    Beep
    Close
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Winsock1.GetData Response ' Check for incoming response *IMPORTANT*
End Sub

Private Function Base64_Encode(strSource) As String 'base6加密算法
    Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim strTempLine As String
    Dim j As Integer
    For j = 1 To (Len(strSource) - Len(strSource) Mod 3) Step 3
        strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
        strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
                      + Asc(Mid(strSource, j + 1, 1)) \ 16) + 1, 1)
        strTempLine = strTempLine + Mid(BASE64_TABLE, ((Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 _
                      + Asc(Mid(strSource, j + 2, 1)) \ 64) + 1, 1)
        strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 2, 1)) Mod 64) + 1, 1)
    Next j
    If Not (Len(strSource) Mod 3) = 0 Then
         If (Len(strSource) Mod 3) = 2 Then
            strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) \ 4) + 1, 1)
            strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 _
                      + Asc(Mid(strSource, j + 1, 1)) \ 16 + 1, 1)
             strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j + 1, 1)) Mod 16) * 4 + 1, 1)
            strTempLine = strTempLine & "="
        ElseIf (Len(strSource) Mod 3) = 1 Then
            strTempLine = strTempLine + Mid(BASE64_TABLE, Asc(Mid(strSource, j, 1)) \ 4 + 1, 1)
            strTempLine = strTempLine + Mid(BASE64_TABLE, (Asc(Mid(strSource, j, 1)) Mod 4) * 16 + 1, 1)
             strTempLine = strTempLine & "=="
        End If
     End If
    Base64_Encode = strTempLine
End Function

分享到:
评论

相关推荐

    VB6.0 简单 Socket 服务端

    在这个“VB6.0简单Socket服务端”项目中,开发者使用了Winsock控件来实现了一个基本的Socket服务器。下面将详细解释Socket、Winsock控件以及如何在VB6.0中构建Socket服务端。 Socket,也称为套接字,是网络编程中的...

    VB6.0实现SOCKET通讯一对多

    在VB6.0中,我们可以通过使用WINSOCK控件来实现网络通信功能,包括TCP/IP协议下的SOCKET通讯。本教程将深入探讨如何利用VB6.0的WINSOCK控件构建一个能够处理一对多通讯的服务器端程序。 SOCKET通讯是一种基于网络...

    vb6.0安装包/visual basic6.0下载中文/vb6.0软件安装包/visual basic6.0企业版下载

    VB6.0企业精简版在此基础上进一步优化了体积,减少了不必要的组件,使其更加轻便,运行效率更高。 该“vb6.0精简版”主要包含以下几个关键知识点: 1.**事件驱动编程**:VB6.0的核心编程模式是事件驱动,用户界面上...

    VB6.0 收发邮件一例,附代码

    撰写新邮件,使用MAPI对话框撰写及发送电子邮件,使用设计的窗体NewMsg撰写及发送电子邮件,在删除当前邮件后,下一封邮件的位置设置为当前位置,这时需要判断该邮件是否已经在子窗体MsgView中显示,如是,将其设为...

    Delphi6.0与VB6.0中的Socket技术对比分析及集成

    ### Delphi6.0与VB6.0中的Socket技术对比分析及集成 #### 一、引言 在当今数字化时代,计算机网络技术的发展推动了应用编程领域的革新,特别是在基于网络环境下的应用程序开发方面。Delphi6.0和VB6.0作为两款广泛...

    VB6.0 实现WebSocket 例子.7z

    总的来说,虽然VB6.0不直接支持WebSocket,但通过使用第三方库或者自行实现WebSocket协议,仍然可以在VB6.0中构建WebSocket应用程序。这个"VB6.0 实现WebSocket的例子"压缩包很可能是包含了一个完整的示例,展示了...

    VB6.0运行库文件

    尽管现在已经有了更新的版本,如Visual Studio .NET系列,但仍有大量遗留的VB6.0程序在各行业中使用。 MSVBVM60.DLL是VB6.0运行时库的主要文件,它包含了VB6.0的虚拟机和必要的函数库,用于解释和执行VB6.0编译后的...

    VB 6.0 帮助文档(中文)

    2. **控件介绍**:VB 6.0 提供了大量的内置控件,如按钮(Button)、文本框(TextBox)、列表框(ListBox)、复选框(CheckBox)等,文档中会对这些控件的属性、方法和事件进行详尽解析,帮助开发者理解如何在界面上添加和...

    VB6.0 SP6补丁

    总之,VB6.0 SP6补丁对于仍在使用VB6.0的开发者来说至关重要,它不仅可以提高开发效率,还能确保应用程序的安全性和稳定性。尽管VB6.0已经被VB.NET取代,但因其简单易用和强大的桌面应用开发能力,至今仍有部分企业...

    在VB6.0中调用SQL Server的存储过程.pdf

    在VB6.0中调用SQL Server的存储过程是VB开发者经常遇到的问题,本文将详细介绍如何在VB6.0中调用SQL Server的存储过程,并对存储过程的优点和使用方法进行了详细的解释。 首先,存储过程是一种封装方法,用于重复...

    VB6.0使用winsock控件实现聊天程序(源代码)

    在VB6.0中,我们可以利用Winsock控件来实现网络通信功能,如创建一个简单的聊天程序。本文将深入探讨如何利用VB6.0和Winsock控件构建一个多客户端通信的聊天程序,并针对描述中提到的问题进行分析。 1. Winsock控件...

    vb 6.0 QRcode条码生成控件

    本文将详细探讨如何在VB 6.0中使用特定的控件来实现QRcode的生成。 首先,我们需要了解VB 6.0的环境。Visual Basic 6.0是Microsoft推出的一种面向对象的编程语言,它提供了一个强大的集成开发环境(IDE),支持事件...

    VB6.0 收发邮件,附代码

    在VB6.0(Visual Basic 6.0)中实现电子邮件的发送和接收是一项常见的编程任务,这通常涉及到使用SMTP(Simple Mail Transfer Protocol)服务来发送邮件和POP3(Post Office Protocol version 3)或IMAP(Internet ...

    vb6.0可用的ico图标

    在VB6.0中使用这些图标,首先需要将ICO文件导入到工程中。这可以通过打开"资源视图",然后右键单击"图标"类别并选择"插入图标"来完成。导入后,开发者可以在代码中引用这些图标,例如: ```vb Form1.Icon = ...

    VB6.0繁体中文专业版sp6补丁

    在压缩包文件名称列表中,"VB6_sp6_CHT"很可能就是VB6.0 SP6补丁的繁体中文版安装文件。安装这个补丁的步骤通常是:首先,确保你已经正确安装了VB6.0繁体中文专业版;其次,运行这个补丁文件,按照提示进行操作,...

    VB6.0反编译工具

    在编程领域,编译器将高级语言(如VB6.0)编写的源代码转换为机器可执行的二进制代码,这个过程是不可逆的。然而,反编译工具试图通过分析二进制代码来重构源代码,帮助开发者理解程序的工作原理,或者用于代码的...

    vb6.0完整版安装包

    Visual Basic 6.0(简称VB6.0)是一款由微软公司推出的可视化编程工具,它在1998年发布,是Visual Basic系列中的一个重要版本。VB6.0以其直观的用户界面、强大的Windows应用程序开发能力以及易学易用的特点,在当时...

    vb6.0水晶报表的制作学习资料

    在VB6.0项目中使用水晶报表前,你需要确保已经安装了水晶报表的开发包,通常包含在Visual Studio或单独的SDK中。安装完成后,水晶报表的相关组件会出现在VB6.0的工具箱里,便于拖放使用。 接着,了解水晶报表的基本...

    VB6.0 在图片框中显示PNG图片

    在VB6.0中使用GDI+,你需要引入一个GDI+的ActiveX控件,如`gdiplus.dll`。首先将这个动态链接库添加到你的项目中,然后利用GDI+的类库来加载和绘制PNG图片。以下是一个简单的示例: ```vb Private Declare Function...

    VB6.0完整版VB6.0完整版

    7. **调试工具**:VB6.0内置的调试器可以帮助开发者定位并修复程序中的错误,提高开发效率。 8. **版本控制**:支持版本控制系统的集成,便于团队协作开发。 **VB6.0的应用领域:** - **桌面应用开发**:VB6.0常...

Global site tag (gtag.js) - Google Analytics