我想用winsock实现发送邮件 请给我贴段完整代码或URL 可行 立马给分
要求 越简单越快的越好
要求 越简单越快的越好
解决方案 »
- 如何判断句柄所属控件的类型
- 关于类模块的问题,是否要使用DB中的表时,就一个表建一个类呢?
- 有关vb和autocad混合编程的问题
- 是水晶报表打包出错?帮帮忙,很急的!!
- 谁有多窗口浏览器的源码,谢谢,急。。。。
- VB中的二进制文件的存取,VB中运行时不显示图片,导入的图片,不能随记录上下翻页
- recordset的update问题
- 在局域网里使用SQL SEVER,客户端需不需要安装SQL SEVER 客户端组件?
- 请问此问题如何解决:“多步OLE DB操作产生错误。请检查每个OLE DB状态值。没有工作被完成。"
- 急急急!谁有用api写的邮件发送源程序?60分全奉上!
- 还是刚才的字符串问题,郁闷阿!
- 关于combobox
MAIL_CONNECT
MAIL_HELO
MAIL_FROM
MAIL_RCPTTO
MAIL_DATA
MAIL_DOT
MAIL_QUIT
MAIL_USER
MAIL_PASS
MAIL_LOGIN
End Enum
Dim m_State As SMTP_State
Dim filebyte() As Byte
Dim m_strEncodedFiles() As String, m_strTmpEncodedFiles() As String
Dim lng_LocalPort As Long
Dim str_SMTPAddress As String
Dim strMailTO As String
Dim isBreak As Boolean
Dim isMultiple As BooleanPrivate Function Base64_EncodeBin(byteSource) As String
Dim BASE64_TABLE(1 To 64) As Byte '用Byte数组保存编码表,可以省掉计算Asc值这一步
Dim j As Double
Dim m As Double
Dim n As Double
Dim num As Double
Dim intPos As Double
Dim BASE64_STR As String
Dim a() As Byte
BASE64_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
For j = 1 To 64
BASE64_TABLE(j) = Asc(Mid(BASE64_STR, j, 1))
Next
n = (UBound(byteSource) - UBound(byteSource) Mod 3)
num = (n \ 3) * 4
m = 0
intPos = 0
ReDim a(1 To num) As Byte
For j = 1 To n Step 3
m = m + 1
a(m) = BASE64_TABLE((byteSource(j) \ 4) + 1)
m = m + 1
a(m) = BASE64_TABLE(((byteSource(j) Mod 4) * 16 + byteSource(j + 1) \ 16) + 1)
m = m + 1
a(m) = BASE64_TABLE(((byteSource(j + 1) Mod 16) * 4 + byteSource(j + 2) \ 64) + 1)
m = m + 1
a(m) = BASE64_TABLE((byteSource(j + 2) Mod 64) + 1)
intPos = intPos + 4 If (intPos Mod 76) = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
DoEvents
Next j
If Not (UBound(byteSource) Mod 3) = 0 Then
If (UBound(byteSource) Mod 3) = 2 Then
num = num + 4
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = BASE64_TABLE((byteSource(j) \ 4) + 1)
If m Mod 76 = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
m = m + 1
a(m) = BASE64_TABLE((byteSource(j) Mod 4) * 16 + byteSource(j + 1) \ 16 + 1)
If m Mod 76 = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
m = m + 1
a(m) = BASE64_TABLE((byteSource(j + 1) Mod 16) * 4 + 1)
If m Mod 76 = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
m = m + 1
a(m) = Asc("=")
ElseIf (UBound(byteSource) Mod 3) = 1 Then
num = num + 3
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = BASE64_TABLE(byteSource(j) \ 4 + 1)
If m Mod 76 = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
m = m + 1
a(m) = BASE64_TABLE((byteSource(j) Mod 4) * 16 + 1)
If m Mod 76 = 0 Then
num = num + 2
ReDim Preserve a(1 To num) As Byte
m = m + 1
a(m) = Asc(vbCr)
m = m + 1
a(m) = Asc(vbLf)
End If
m = m + 1
a(m) = Asc("==")
End If
End If
ReDim Preserve a(1 To m) As Byte '去掉有可能多出的空格
Base64_EncodeBin = StrConv(a, vbUnicode)
End Function
Private Function Base64_Encode(strSource) As String 'base6加密算法
Const BASE64_TABLE As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim strTempLine As String
Dim j As Long
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 FunctionPrivate Sub Command1_Click()
Dim ColonPos As Long
If Trim(Text1.Text) = "" Then MsgBox "收件人不能为空!", vbExclamation, "错误": Text1.SetFocus: Exit Sub
SendWinsock.Close
SendWinsock.LocalPort = 0
ColonPos = InStr(str_SMTPServerName, ":")
If ColonPos = 0 Then
SendWinsock.Connect str_SMTPServerName, 25
Else
lng_LocalPort = CLng(Right$(str_SMTPServerName, Len(str_SMTPServerName) - ColonPos))
str_SMTPAddress = Left$(str_SMTPServerName, ColonPos - 1)
SendWinsock.Connect str_SMTPAddress, lngPort
End If
m_State = MAIL_CONNECT '
StatusBar1.SimpleText = "试图与服务器连接"
End SubPrivate Sub Command2_Click()
SendWinsock.Close
isBreak = True
Unload Me
End Sub
Private Sub Command3_Click()
Dim str_TempFiles() As String
Dim str_TmpStrings As String, str_TmpPath As String
Dim afileSize As Double
Dim fileIdx As Long
On Error Resume Next
Erase filebyteCommand1.Enabled = False
Command3.Enabled = FalseCommonDialog1.FileName = ""
CommonDialog1.DialogTitle = "添加附件"CommonDialog1.Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer Or cdlOFNFileMustExist Or cdlOFNHideReadOnly Or cdlOFNPathMustExistCommonDialog1.Filter = "所有文件(*.*)|*.*|"
CommonDialog1.ShowOpenIf CommonDialog1.FileName <> "" Then
StatusBar1.SimpleText = "正在加载附件,可能会花费一些时间.请稍侯..."
fileAttach.Clear
Me.MousePointer = 11
If InStr(CommonDialog1.FileName, Chr(0)) <> 0 Then
str_TmpStrings = Right(CommonDialog1.FileName, Len(CommonDialog1.FileName) - InStr(CommonDialog1.FileName, Chr(0)))
str_TmpPath = Left(CommonDialog1.FileName, InStr(CommonDialog1.FileName, Chr(0)) - 1)
str_TempFiles = Split(str_TmpStrings, Chr(0), -1, vbBinaryCompare)
str_TmpPath = IIf(Right(str_TmpPath, 1) = "\", str_TmpPath, str_TmpPath & "\")
ReDim m_strEncodedFiles(UBound(str_TempFiles))
For fileIdx = 0 To UBound(str_TempFiles)
If Dir(str_TmpPath & str_TempFiles(fileIdx)) <> "" Then
If FileLen(str_TmpPath & str_TempFiles(fileIdx)) > 5242880 Then
If MsgBox("附件超过5MB,可能会花费很多时间." & vbCrLf & vbCrLf & "确定要继续吗?", vbQuestion + vbYesNo + vbDefaultButton2, "提示") = vbNo Then
Command1.Enabled = True
Exit Sub
End If
End If
Open str_TmpPath & str_TempFiles(fileIdx) For Binary Access Read As #1
afileSize = LOF(1)
ReDim filebyte(1 To afileSize)
Get #1, , filebyte
Close #1
m_strEncodedFiles(fileIdx) = Base64_EncodeBin(filebyte)
fileAttach.AddItem str_TempFiles(fileIdx)
End If
Next
If fileAttach.ListCount > 0 Then
isMultiple = True
fileAttach.Text = fileAttach.List(0)
Else
isMultiple = False
End If
Else
If Dir(CommonDialog1.FileName) <> "" Then
If FileLen(CommonDialog1.FileName) > 5242880 Then
If MsgBox("附件超过5MB,可能会花费很多时间." & vbCrLf & vbCrLf & "确定要继续吗?", vbQuestion + vbYesNo + vbDefaultButton2, "提示") = vbNo Then
Text4.Text = ""
Command1.Enabled = True
Exit Sub
End If
End If
Open CommonDialog1.FileName For Binary Access Read As #1
afileSize = LOF(1)
ReDim filebyte(1 To afileSize)
Get #1, , filebyte
Close #1
ReDim m_strEncodedFiles(1)
m_strEncodedFiles(0) = Base64_EncodeBin(filebyte)
fileAttach.AddItem Right(CommonDialog1.FileName, Len(CommonDialog1.FileName) - InStrRev(CommonDialog1.FileName, "\"))
fileAttach.Text = fileAttach.List(0)
isMultiple = False
End If
End If
Else
fileAttach.Clear
End IfMe.MousePointer = 0
Command1.Enabled = True
Command3.Enabled = TrueStatusBar1.SimpleText = "发送邮件(SMTP) : " & str_SMTPMailAddressEnd SubPrivate Sub fileAttach_Click()
fileAttach.ToolTipText = fileAttach.Text
End SubPrivate Sub fileAttach_KeyDown(KeyCode As Integer, Shift As Integer)
Dim I As Long
Dim curIdx As Long
If KeyCode = 46 And fileAttach.ListCount > 0 Then
If MsgBox("确定要删除附件 " & fileAttach.List(fileAttach.ListIndex) & " 吗?", vbQuestion + vbYesNo + vbDefaultButton2, "提示") = vbYes Then
curIdx = fileAttach.ListIndex
For I = curIdx To fileAttach.ListCount - 2
m_strEncodedFiles(I) = m_strEncodedFiles(I + 1)
Next
fileAttach.RemoveItem curIdx
If fileAttach.ListCount > 0 Then
fileAttach.Text = fileAttach.List(0)
End If
End If
End If
End SubPrivate Sub Form_Load()
mPriority.ComboItems.Add 1, "p1", "高", 1
mPriority.ComboItems.Add 2, "p3", "普通", 2
mPriority.ComboItems.Add 3, "p5", "低", 3
mPriority.ComboItems.Item(2).Selected = True
StatusBar1.SimpleText = "发送邮件(SMTP) : " & str_SMTPMailAddress
isBreak = False
isMultiple = False
fileAttach.Clear
End Sub
Dim idx As Long, Rcpts As Long
Dim strTempRcpt() As String
If SendWinsock.State <> 7 Then Exit Sub
Dim strServerResponse As String
Dim strResponseCode As String
Dim strDataToSend As String
Dim strPriority As String
Const RandString As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_"
Dim Globalstr As String
Select Case CStr(Trim(Replace(mPriority.SelectedItem.Key, "p", "")))
Case "1"
strPriority = "High"
Case "3"
strPriority = "Normal"
Case "5"
strPriority = "Low"
End Select
For jd = 1 To 24
uniquey = Int(Rnd * Len(RandString)) + 1
Globalstr = Globalstr + Mid(RandString, uniquey, 1)
Next jd
strime1 = "Subject:" + Chr(32) + Text2.Text + vbCrLf ' Subject of E-Mail
strime = Text3.Text + vbCrLf ' E-mail message body
strime2 = "X-Priority: " & Trim(Replace(mPriority.SelectedItem.Key, "p", "")) + vbCrLf + "X-MSMail-Priority: " + strPriority + vbCrLf + "X-Mailer: MailChecker Ver:" & App.Major & "." & App.Minor & "." & App.Revision & " Author:Johnny Lill" ' What program sent the e-mail, customize this
'MULTI-PART Edit
strime = "------=_NextPart_" + Globalstr + vbCrLf + "Content-Type: multipart/alternative; " + vbCrLf + Chr(9) + "boundary=""----=_NextPart_" + Globalstr + """" + vbCrLf + vbCrLf + "------=_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
If fileAttach.ListCount > 0 Then
strime = strime + "------=_NextPart_" + Globalstr + "--" + vbCrLf + vbCrLf
If isMultiple Then
For idx = 0 To fileAttach.ListCount - 1
strime = strime + "------=_NextPart_" + Globalstr + vbCrLf
strime = strime + "Content-Type: application/octet-stream;" + vbCrLf
strime = strime + Chr(9) + "Name=" + Chr(34) + fileAttach.List(idx) + Chr(34) + vbCrLf
strime = strime + "Content-Transfer-Encoding: base64" + vbCrLf
strime = strime + "Content-Disposition: attachment;" + vbCrLf
strime = strime + Chr(9) + "FileName=" + Chr(34) + fileAttach.List(idx) + Chr(34) + vbCrLf + vbCrLf
strime = strime + m_strEncodedFiles(idx) + vbCrLf
Next
strime = strime + "------=_NextPart_" + Globalstr + "--" + vbCrLf
Else
strime = strime + "------=_NextPart_" + Globalstr + vbCrLf
strime = strime + "Content-Type: application/octet-stream;" + vbCrLf
strime = strime + Chr(9) + "Name=" + Chr(34) + fileAttach.Text + Chr(34) + vbCrLf
strime = strime + "Content-Transfer-Encoding: base64" + vbCrLf
strime = strime + "Content-Disposition: attachment;" + vbCrLf
strime = strime + Chr(9) + "FileName=" + Chr(34) + fileAttach.Text + vbCrLf + vbCrLf
strime = strime + m_strEncodedFiles(0) + vbCrLf
strime = strime + "------=_NextPart_" + Globalstr + "--" + vbCrLf
End If
End If
strimeall = strime1 + "MIME-Version: 1.0" + vbCrLf + strime2 + vbCrLf + "Content-Type: multipart/mixed; " + 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
SendWinsock.GetData strServerResponse, vbString
Else
Exit Sub
End If
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
strDataToSend = Trim$(str_SMTPMailAddress)
strDataToSend = Left$(strDataToSend, _
InStr(1, strDataToSend, "@") - 1)
If Trim(str_SMTPNeedLogin) = "0" Then
m_State = MAIL_LOGIN
SendWinsock.SendData "HELO " & strDataToSend & vbCrLf
StatusBar1.SimpleText = "登陆服务器"
ElseIf Trim(str_SMTPNeedLogin) = "1" Then
m_State = MAIL_HELO
SendWinsock.SendData "EHLO " & strDataToSend & vbCrLf
StatusBar1.SimpleText = "登陆服务器"
Else
MsgBox "SMTP设置有误,请重新设置后再试!", vbExclamation, "错误"
SendWinsock.Close
Unload Me
End If
Case MAIL_HELO
m_State = MAIL_USER
SendWinsock.SendData "AUTH LOGIN" & vbCrLf
StatusBar1.SimpleText = "正在校验用户名"
Case MAIL_USER
m_State = MAIL_PASS
SendWinsock.SendData (Base64_Encode(Trim(str_SMTPLoginID))) & vbCrLf
StatusBar1.SimpleText = "校验用户密码"
Case MAIL_PASS
m_State = MAIL_LOGIN
SendWinsock.SendData (Base64_Encode(Trim(str_SMTPPassword))) & vbCrLf
StatusBar1.SimpleText = "确认发送人邮件地址"
Case MAIL_LOGIN
m_State = MAIL_FROM
SendWinsock.SendData "MAIL FROM:" & Trim$(str_SMTPMailAddress) & vbCrLf
StatusBar1.SimpleText = "确认接收人邮件地址"
Case MAIL_FROM
m_State = MAIL_RCPTTO
If InStr(Text1.Text, ";") = 0 Then
SendWinsock.SendData "RCPT TO:" & Trim$(Text1.Text) & vbCrLf
strMailTO = "<" & Trim$(Text1.Text) & ">"
Else
strTempRcpt = Split(Trim$(Text1.Text), ";", -1, vbTextCompare)
For Rcpts = 0 To UBound(strTempRcpt)
SendWinsock.SendData "RCPT TO:" & Trim$(strTempRcpt(Rcpts)) & vbCrLf
If Rcpts = 0 Then
strMailTO = "<" & strTempRcpt(Rcpts) & ">," & vbCrLf
Else
If Rcpts = UBound(strTempRcpt) Then
strMailTO = strMailTO & Chr(9) & "<" & strTempRcpt(Rcpts) & ">"
Else
strMailTO = strMailTO & Chr(9) & "<" & strTempRcpt(Rcpts) & ">," & vbCrLf
End If
End If
Next
End If
StatusBar1.SimpleText = "邮件发送之中..."
Case MAIL_RCPTTO
m_State = MAIL_DATA
SendWinsock.SendData "DATA" & vbCrLf
StatusBar1.SimpleText = "获取邮件内容"
Case MAIL_DATA
m_State = MAIL_DOT
SendWinsock.SendData "From:" & str_SMTPMailAddress & " <" & str_SMTPMailAddress & ">" & vbCrLf
SendWinsock.SendData "To:" & strMailTO & vbCrLf
SendWinsock.SendData strimeall & vbCrLf
SendWinsock.SendData strime & vbCrLf
SendWinsock.SendData "." & vbCrLf
StatusBar1.SimpleText = "邮件送完毕"
Case MAIL_DOT
m_State = MAIL_QUIT
SendWinsock.SendData "QUIT" & vbCrLf
StatusBar1.SimpleText = "邮件成功发送!!!"
MsgBox "邮件成功发送到: " & vbCrLf & Replace(Replace(strMailTO, Chr(9), ""), ",", ""), vbInformation, "提示"
SendWinsock.Close
Unload Me
Case MAIL_QUIT
End Select
Else
SendWinsock.Close
End If
End SubPrivate Sub Text1_Change()
Dim strTmp As String
strTmp = Trim(Text1.Text)
If strTmp = "" Then Command1.Enabled = False: Exit Sub
If Trim(strTmp) <> "" And InStr(strTmp, "@") > 1 And InStr(strTmp, ".") > 2 And Right(strTmp, 1) <> "." < Len(strTmp) And Right(strTmp, 1) <> "@" And Abs(InStr(strTmp, "@") - InStr(strTmp, ".")) <> 1 And InStr(Right(strTmp, Len(strTmp) - InStr(strTmp, "@")), ".") <> 0 Then
Command1.Enabled = True
Else
Command1.Enabled = False
End If
End SubPrivate Sub Text1_GotFocus()
If Trim(Text1.Text) = "" Then
Command1.Enabled = False
End If
End Sub
我的E-Mail 为 ; [email protected]
再次感谢