经常在论坛看到网友提问如何发送电子邮件(SMTP服务器认证),其实只要知道客户端与邮件服务器之间会话,用户 名和密码是通过base64编码加密后传送,问题就很容易被解决.协议使用方面和smtp协议使用是一模一样的,值得 注意的就是esmtp协议在用户名和密码验证时,服务器返回一个354的消息代号.本代码没有针对错误提示信息处理, 但保证能正常发送邮件,大家可以自己完善它,本代码还使用IME编码,这样就可以发送超文本电子邮件了。用过 Foxmail4.1朋友应该知道,它实现的图文并茂声音邮件是它的一个亮点。本代码同样可以实现超文本邮件,要发 送mid做为背景音东的邮件,只要对ime代码部分稍加修改就可以实现,歌曲也须用base64编码后发送。目前流行 邮件病毒的原理和此一样,通过IE在IME中的漏洞实现,解决方法可以在注册表中删除IME编码格式,或者安装Winamp 同样也可以解决它(需做的只要在winamp支持的文件格式全选上),怎么越讲越跑题了,大家不要向我扔臭鸡蛋呀, hehe,我也不多废话了,下附本软件所有代码.全整代码也可以在我的个人主页上下载,欢迎各位VB爱好与我联系,交 流编程技术. 主页:http://www.dapha.net Msn:[email protected] VERSION 5.00 Object = "{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 End End Attribute VB_Name = "Form1" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute 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_login End Enum Private m_State As SMTP_State Private m_strEncodedFiles As String 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 Private Sub cmdExit_Click() Unload Me End Sub Private 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 If Debug.Print strServerResponse End Sub 全文完... 
|