发送电子邮件源码(支持ESTMP协议,超文本电子邮件格式)

    技术2022-05-11  117

    经常在论坛看到网友提问如何发送电子邮件(SMTP服务器认证),其实只要知道客户端与邮件服务器之间会话,用户名和密码是通过base64编码加密后传送,问题就很容易被解决.协议使用方面和smtp协议使用是一模一样的,值得注意的就是esmtp协议在用户名和密码验证时,服务器返回一个354的消息代号.本代码没有针对错误提示信息处理,但保证能正常发送邮件,大家可以自己完善它,本代码还使用IME编码,这样就可以发送超文本电子邮件了。用过Foxmail4.1朋友应该知道,它实现的图文并茂声音邮件是它的一个亮点。本代码同样可以实现超文本邮件,要发送mid做为背景音东的邮件,只要对ime代码部分稍加修改就可以实现,歌曲也须用base64编码后发送。目前流行邮件病毒的原理和此一样,通过IE在IME中的漏洞实现,解决方法可以在注册表中删除IME编码格式,或者安装Winamp同样也可以解决它(需做的只要在winamp支持的文件格式全选上),怎么越讲越跑题了,大家不要向我扔臭鸡蛋呀,hehe,我也不多废话了,下附本软件所有代码.全整代码也可以在我的个人主页上下载,欢迎各位VB爱好与我联系,交流编程技术.主页:http://www.dapha.netMsn:dapha@msn.comVERSION 5.00Object = "{248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0"; "MSWINSCK.OCX"Begin VB.Form Form1    BorderStyle     =   1  'Fixed Single   Caption         =   "邮件发送程序(支持smtp服务器验证)"   ClientHeight    =   5550   ClientLeft      =   45   ClientTop       =   330   ClientWidth     =   5805   LinkTopic       =   "Form1"   MaxButton       =   0   'False   ScaleHeight     =   5550   ScaleWidth      =   5805   StartUpPosition =   3  'Windows Default   Begin MSWinsockLib.Winsock Winsock1       Left            =   2640      Top             =   2520      _ExtentX        =   741      _ExtentY        =   741   End   Begin VB.TextBox txtmessage1       Height          =   1695      Left            =   0      MultiLine       =   -1  'True      TabIndex        =   16      ToolTipText     =   "这里为超文本信件内容"      Top             =   3480      Width           =   5775   End   Begin VB.TextBox user       Height          =   270      Left            =   3960      TabIndex        =   15      Top             =   840      Width           =   1575   End   Begin VB.TextBox subject       Height          =   270      Left            =   960      TabIndex        =   12      Text            =   "你好"      Top             =   1320      Width           =   2295   End   Begin VB.TextBox txtserver       Height          =   270      Left            =   960      TabIndex        =   9      Text            =   "smtp.21cn.com"      Top             =   960      Width           =   2295   End   Begin VB.TextBox txtpwa       Height          =   270      IMEMode         =   3  'DISABLE      Left            =   3960      MaxLength       =   8      PasswordChar    =   "*"      TabIndex        =   7      Top             =   1200      Width           =   1575   End   Begin VB.TextBox getaddress       Height          =   300      Left            =   960      TabIndex        =   5      Top             =   600      Width           =   2295   End   Begin VB.TextBox txtfrom       Height          =   300      Left            =   960      TabIndex        =   3      Top             =   240      Width           =   2295   End   Begin VB.CommandButton cmdExit       Caption         =   "退出"      Height          =   375      Left            =   4680      TabIndex        =   2      Top             =   240      Width           =   975   End   Begin VB.CommandButton CmdSend       Caption         =   "发送"      Height          =   375      Left            =   3360      TabIndex        =   1      Top             =   240      Width           =   975   End   Begin VB.TextBox txtMessage       Height          =   1815      Left            =   0      MultiLine       =   -1  'True      TabIndex        =   0      ToolTipText     =   "信件内容"      Top             =   1680      Width           =   5775   End   Begin VB.Label Label6       AutoSize        =   -1  'True      Caption         =   "用户名"      Height          =   180      Left            =   3360      TabIndex        =   14      Top             =   840      Width           =   540   End   Begin VB.Label StatusTxt       AutoSize        =   -1  'True      BackStyle       =   0  'Transparent      BorderStyle     =   1  'Fixed Single      Height          =   285      Left            =   960      TabIndex        =   13      Top             =   5200      Width           =   3375   End   Begin VB.Label Label5       AutoSize        =   -1  'True      Caption         =   "主题:"      Height          =   180      Left            =   240      TabIndex        =   11      Top             =   1320      Width           =   450   End   Begin VB.Label Label4       AutoSize        =   -1  'True      Caption         =   "SMTP服务器"      Height          =   180      Left            =   0      TabIndex        =   10      Top             =   960      Width           =   900   End   Begin VB.Label Label3       AutoSize        =   -1  'True      Caption         =   "密码"      Height          =   180      Left            =   3360      TabIndex        =   8      Top             =   1200      Width           =   360   End   Begin VB.Label Label2       AutoSize        =   -1  'True      Caption         =   "收信人地址"      Height          =   180      Left            =   0      TabIndex        =   6      Top             =   600      Width           =   900   End   Begin VB.Label Label1       AutoSize        =   -1  'True      Caption         =   "发信人地址"      Height          =   180      Left            =   0      TabIndex        =   4      Top             =   240      Width           =   900   EndEndAttribute VB_Name = "Form1"Attribute VB_GlobalNameSpace = FalseAttribute VB_Creatable = FalseAttribute VB_PredeclaredId = TrueAttribute VB_Exposed = False'程序组合:dapha(汪锋)'下载http://www.dapha.net'我是一名VB爱好者,希望得到大家的帮助,共同学习,进步Private Enum SMTP_State    MAIL_CONNECT    MAIL_HELO    MAIL_from    MAIL_RCPTTO    MAIL_DATA    MAIL_DOT    MAIL_QUIT    MAIL_USER    MAIL_PASS    mail_loginEnd EnumPrivate m_State As SMTP_StatePrivate m_strEncodedFiles As StringPrivate 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 = strTempLineEnd FunctionPrivate Sub cmdExit_Click()Unload MeEnd SubPrivate Sub CmdSend_Click()    Winsock1.Close    Winsock1.LocalPort = 0    strserver = txtserver    ColonPos = InStr(strserver, ":")    If ColonPos = 0 Then        Winsock1.Connect strserver, 25    Else        lngPort = CLng(Right$(strserver, Len(strserver) - ColonPos))        strserver = Left$(strserver, ColonPos - 1)        Winsock1.Connect strserver, lngPort    End If    m_State = MAIL_CONNECT    '    StatusTxt = "试图与服务器连接"End Sub

    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)    Dim strServerResponse   As String    Dim strResponseCode     As String    Dim strDataToSend       As String    '    Const RandString As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"    Dim Globalstr As String    For jd = 1 To 24        uniquey = Int(Rnd * Len(RandString)) + 1        Globalstr = Globalstr + Mid(RandString, uniquey, 1)    Next jd    strime1 = "Subject:" + Chr(32) + subject + vbCrLf ' Subject of E-Mail    strime = txtMessage + vbCrLf ' E-mail message body    strime2 = "X-Mailer:程序太平洋:邮件发送软件V1.0" + vbCrLf ' What program sent the e-mail, customize this    'MULTI-PART Edit    strime = "------=_NextPart_" + Globalstr + vbCrLf + "Content-type: text/plain; charset=gb2312" + vbCrLf + vbCrLf + strime    strime = strime + "------=_NextPart_" + Globalstr + vbCrLf + "Content-type: text/HTML" + vbCrLf + vbCrLf + txtmessage1 + vbCrLf + vbCrLf    strime = strime + "------=_NextPart_" + Globalstr + "--" + vbCrLf    strime1 = strime1 + "MIME-Version: 1.0" + vbCrLf + "Content-Type: multipart/alternative; " + vbCrLf + Chr(9) + "boundary=""----=_NextPart_" + Globalstr + """" + vbCrLf + vbCrLf + "This mail is In MIME format. Your mail interface does Not appear To support this format." + vbCrLf + vbCrLf    strimeall = strime2 + strime1    Winsock1.GetData strServerResponse    strResponseCode = Left(strServerResponse, 3)    If strResponseCode = "250" Or _       strResponseCode = "220" Or _       strResponseCode = "354" Or _       strResponseCode = "334" Or _       strResponseCode = "235" Then        Select Case m_State            Case MAIL_CONNECT                m_State = MAIL_HELO                strDataToSend = Trim$(txtfrom)                'strDataToSend = Left$(strDataToSend, _                                InStr(1, strDataToSend, "@") - 1)                 Winsock1.SendData "HELO " & strDataToSend & vbCrLf                 StatusTxt = "登陆服务器"            Case MAIL_HELO                 m_State = MAIL_USER                 Winsock1.SendData "AUTH LOGIN" & vbCrLf                 StatusTxt = "正在校验用户名"            Case MAIL_USER                 m_State = MAIL_PASS                 Winsock1.SendData (Base64_Encode(Trim(user.Text))) & vbCrLf                 StatusTxt = "校验用户密码"            Case MAIL_PASS                 m_State = mail_login                 Winsock1.SendData (Base64_Encode(txtpwa)) & vbCrLf                 StatusTxt = "发送人邮件地址"            Case mail_login                 m_State = MAIL_from                 Winsock1.SendData "MAIL FROM:" & Trim$(txtfrom) & vbCrLf                 StatusTxt = "接收人邮件地址"            Case MAIL_from                 m_State = MAIL_RCPTTO                 Winsock1.SendData "RCPT TO:" & Trim$(getaddress) & vbCrLf                 StatusTxt = "邮件发送之中..."            Case MAIL_RCPTTO                 m_State = MAIL_DATA                 Winsock1.SendData "DATA" & vbCrLf                 StatusTxt = "获取邮件内容"            Case MAIL_DATA                m_State = MAIL_DOT                Winsock1.SendData "From:" & user.Text & " <" & txtfrom & ">" & vbCrLf                Winsock1.SendData "To:" & toname & " <" & getaddress & ">" & vbCrLf                Winsock1.SendData strimeall & vbCrLf                Winsock1.SendData strime & vbCrLf                Winsock1.SendData "." & vbCrLf                StatusTxt = "邮件送完毕"            Case MAIL_DOT                m_State = MAIL_QUIT                Winsock1.SendData "QUIT" & vbCrLf                StatusTxt = "邮件成功发送!!!"              Case MAIL_QUIT                 Winsock1.Close                 StatusTxt = "待命之中..."         End Select    Else         Winsock1.Close    End IfDebug.Print strServerResponseEnd Sub全文完...


    最新回复(0)