不想另外安装第三方的发邮件组件,想直接利用MS的。请问在VB里如何用MAPI来发送邮件(好像MAPI是OUTLOOK和OE自带有的吧),需要像在OE里发邮件一样先手工设置好发信帐号吗?能不能像JMAIL一样在发信时指定SMTP服务器及发信验证用户名和密码?哪里有CDONTS发邮件的源码?我需要能指定发邮件的SMTP及认证用户名和密码的那个版本的,这就相当于JMAIL能实现的功能了,好像低版本的CDO不支持,汗~~~~~

解决方案 »

  1.   

    如果你的程序可以使用WINSOCK控件,那还是自己写一个ESMTP过程吧。使用MAPI需要用户自己配置好OE才行。
      

  2.   

    倒啊,自己研究一下ESMTP的协议,很快就可以写一个的啊!!!我以前只花了几个小时时间就搞定了ESMTP邮件发送了.主要就是搞个BASE64算法花的时间多一点.
      

  3.   

    网上随便搜一下也是一大把的啊!!!!这里帮你转个http://www.dapha.net的例子:以下保存为Email.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--------------------------------------------------------
      

  4.   

    以下保存为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------------------------------------------------------
    以上是窗体第一部分,一次发不完.
      

  5.   

    倒,楼上的要厚道啊,要给就把代码给完整嘛。而且,http://www.dapha.net怎么变成了http://www.265.com/index.html上网导航垃圾站???
      

  6.   

    不是不给完.....55555555555555555555555555555555CSDN里一次只能连回三帖...............................抱歉啊!!!!!!不过你现在顶了一贴,就可以了~~~~嘿嘿
      

  7.   

    续frmMail.frm:-----------------------------------------'程序组合: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 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 = strTempLine
    End FunctionPrivate Sub cmdExit_Click()
    Unload Me
    End 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 SubPrivate 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
      

  8.   

    以下保存为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:[email protected]>[email protected]</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方式流览
    -----------------------------------
    所有文件完成.清单:Email.vbp
    frmmail.frm
    FRMMAIL.frx共三个文件.
      

  9.   

    To 小马,刚刚没仔细看,为何你会说:
    以下保存为FrmMail.frx:(注意前面的两个特殊字符).frx不是自动由frmMail.frm生成的吗?
    你贴的好像只是网页内容嘛。
    还有,你所说的两个特殊字符在哪?我啥没看到哩