悬而未决:如何用MAPI和CDONTS来发邮件
悬而未决:如何用MAPI和CDONTS来发邮件 如何用MAPI和CDONTS来发邮件
不想另外安装第三方的发邮件组件,想直接利用MS的。
请问在VB里如何用MAPI来发送邮件(好像MAPI是OUTLOOK和OE自带有的吧),需要像在OE里发邮件一样先手工设置好发信帐号吗?能不能像JMAIL一样在发信时指定SMTP服务器及发信验证用户名和密码?
哪里有CDONTS发邮件的源码?我需要能指定发邮件的SMTP及认证用户名和密码的那个版本的,这就相当于JMAIL能实现的功能了,好像低版本的CDO不支持,汗~~~~~
下面是使用winsock实现的发送邮件,但其它问题仍未解决,等待高手
eSTMP.vbp
-------------------------------------------
Type=Exe
Object={248DD890-BB45-11CF-9ABC-0080C7E7B78D}#1.0#0; MSWINSCK.OCX
Form=frmmail.frm
Startup='Form1'
HelpFile=''
Title='Email发送'
ExeName32='Email.exe'
Command32=''
Name='Email'
HelpContextID='0'
CompatibleMode='0'
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName='dapha.net'
VersionFileDescription='Email发送,支持服务器认证,超文本邮件内容'
VersionLegalCopyright='Copyright 2002 dapha.net'
VersionProductName='Email发送软件'
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
[MS Transaction Server]
AutoRefresh=1
frmMail.frm
-----------------------------------------
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
_Version = 393216
End
Begin VB.TextBox txtmessage1
Height = 1695
Left = 0
MultiLine = -1 'True
TabIndex = 8
Text = 'frmmail.frx':0000
ToolTipText = '这里为超文本信件内容'
Top = 3480
Width = 5775
End
Begin VB.TextBox user
Height = 270
Left = 3960
TabIndex = 4
Top = 840
Width = 1575
End
Begin VB.TextBox subject
Height = 270
Left = 960
TabIndex = 3
Text = '你好'
Top = 1320
Width = 2295
End
Begin VB.TextBox txtserver
Height = 270
Left = 960
TabIndex = 2
Text = 'smtp.etang.com'
Top = 960
Width = 2295
End
Begin VB.TextBox txtpwa
Height = 270
IMEMode = 3 'DISABLE
Left = 3960
PasswordChar = '*'
TabIndex = 5
Top = 1200
Width = 1575
End
Begin VB.TextBox getaddress
Height = 300
Left = 960
TabIndex = 1
Top = 600
Width = 2295
End
Begin VB.TextBox txtfrom
Height = 300
Left = 960
TabIndex = 0
Top = 240
Width = 2295
End
Begin VB.CommandButton cmdExit
Caption = '退出'
Height = 375
Left = 4680
TabIndex = 9
Top = 240
Width = 975
End
Begin VB.CommandButton CmdSend
Caption = '发送'
Default = -1 'True
Height = 375
Left = 3360
TabIndex = 6
Top = 240
Width = 975
End
Begin VB.TextBox txtMessage
Height = 1815
Left = 0
MultiLine = -1 'True
TabIndex = 7
Text = 'frmmail.frx':0A1E
ToolTipText = '信件内容'
Top = 1680
Width = 5775
End
Begin VB.Label Label6
AutoSize = -1 'True
Caption = '用户名'
Height = 180
Left = 3360
TabIndex = 16
Top = 840
Width = 540
End
Begin VB.Label StatusTxt
AutoSize = -1 'True
BackStyle = 0 'Transparent
BorderStyle = 1 'Fixed Single
Height = 285
Left = 960
TabIndex = 15
Top = 5200
Width = 3375
End
Begin VB.Label Label5
AutoSize = -1 'True
Caption = '主题:'
Height = 180
Left = 240
TabIndex = 14
Top = 1320
Width = 450
End
Begin VB.Label Label4
AutoSize = -1 'True
Caption = 'SMTP服务器'
Height = 180
Left = 0
TabIndex = 13
Top = 960
Width = 900
End
Begin VB.Label Label3
AutoSize = -1 'True
Caption = '密码'
Height = 180
Left = 3360
TabIndex = 12
Top = 1200
Width = 360
End
Begin VB.Label Label2
AutoSize = -1 'True
Caption = '收信人地址'
Height = 180
Left = 0
TabIndex = 11
Top = 600
Width = 900
End
Begin VB.Label Label1
AutoSize = -1 'True
Caption = '发信人地址'
Height = 180
Left = 0
TabIndex = 10
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
FrmMail.frx:(注意前面的两个特殊字符)
-------------------------------------------------
?
<style type=text/css>
<!--
A:link{color:#333333;text-decoration:none;}
A:visited{color:#333333;text-decoration:none;}
A:hover{color:#333333;text-decoration:underline overline;}
A:active{color:#333333;text-decoration:none;}
input.radio{background: #EFF3F9; color:#000000}
font{ FONT-size: 9pt; line-height: 13pt; FONT-FAMILY:宋体, Arial, Helvetica}
font_size{ FONT-size: 9pt; line-height: 13pt; FONT-FAMILY:宋体, Arial, Helvetica}
SELECT{ FONT-size: 9pt; line-height: 13pt; FONT-FAMILY:宋体, Arial, Helvetica; BACKGROUND-COLOR: #efefef}
table{ FONT-size: 9pt; line-height: 13pt; FONT-FAMILY:宋体, Arial, Helvetica}
td{ FONT-size: 9pt; line-height: 13pt; FONT-FAMILY:宋体, Arial, Helvetica}
textarea{ BACKGROUND-COLOR: #efefef; BORDER-BOTTOM: 1px double; BORDER-LEFT: 1px double; BORDER-RIGHT: 1px double; BORDER-TOP: 1px double; COLOR: #000000; font-size: 9pt ;FONT-FAMILY:宋体, Arial, Helvetica}
.Coolinput{ BACKGROUND-COLOR: #EFF3F9; BORDER-BOTTOM: 1px double; BORDER-LEFT: 1px double; BORDER-RIGHT: 1px double; BORDER-TOP: 1px double; COLOR: #000000; font-size: 9pt; FONT-FAMILY:宋体, Arial, Helvetica}
INPUT{ BACKGROUND-COLOR: #EFF3F9; CURSOR: HAND; BORDER-TOP-WIDTH: 1px; PADDING-RIGHT: 1px; PADDING-LEFT: 1px; BORDER-LEFT-WIDTH: 1px; FONT-SIZE: 9pt; FONT-FAMILY: '宋体, Arial, Helvetica'; BORDER-LEFT-COLOR: #cccccc; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 1px; BORDER-TOP-COLOR: #cccccc; PADDING-TOP: 1px; HEIGHT: 18px; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: #cccccc}
BODY{ FONT-FAMILY: 宋体; FONT-SIZE: 9pt; SCROLLBAR-HIGHLIGHT-COLOR: buttonface; SCROLLBAR-SHADOW-COLOR: buttonface; SCROLLBAR-3DLIGHT-COLOR: buttonhighlight; SCROLLBAR-TRACK-COLOR: #eeeeee; SCROLLBAR-DARKSHADOW-COLOR: buttonshadow }
//-->
</style>
本邮件采用程序太平洋邮件发送系统发送,本软件源代码已经在我的个人主页上发布,欢迎你前去下载。<br/>
真接下载地址:<a href=http://dapha.net/temp/mail.rar>真接下载</a><br/>
欢迎大家前往我的<a href=http://dapha.net><font face=Verdana, Arial, Helvetica, sans-serif size=1><b>个人主页交流学习</b></font></a><br/>
主页:<a href=http://dapha.net>http://www.dapha.net</a></br>
Email:<a href=mailto:dapha@etang.com>dapha@etang.com</a></br>
<TABLE cellSpacing=0 cellPadding=0 width='95%' border=0 align=center><tr><td><p align=center><font color=#000000></font></td></tr><tr valign=center><td align=center><font color=#000000>版权所有: <a href=http://www.dapha.net><font face=Verdana, Arial, Helvetica, sans-serif size=1><b>dapha<font color=#CC0000>.Net</font></b></font></a></td></tr></table>
N我是一位VB爱好者,欢迎大家和我交流,共同学习,进步
本页面请使用HTML方式流览