# Re: 有人用过MAPI这个activeX元件吗?

Posted by richard on December 04, 1998 at 15:23:09:

In Reply to: 有人用过MAPI这个activeX元件吗? posted by rex on December 04, 1998 at 15:05:06:

利用 MAPI 寄信到 Internet

MAPI是 Messaging Application Program Interface 的缩写，Visual Basic 中有 2 个
MAPI 控制项，分别是 MAPISession 与 MAPIMessages，MAPISession 控制项
可登入并且建立一个 MAPI 连线(session)，也可以用来结束一个 MAPI 连线；
而 MAPIMessages 控制项让使用者可以执行多种邮件系统的功能。如果要正
常执行含有 MAPI 控制项的 VB 程式，作业系统中必须安装 MicroSoft Exchnage
(主要用到的是 32 位元 MAPI DDLs)，否则将无法完成一些 MAPI 的功能，这
也是使用 MAPI 比较麻烦之处；国外有一些 OCX 专门针对收发 E-Mail 而设计
，但是必须花钱购买。

其实 VB 范例程式中的 vbmail.vbp 已经提供了一个相当完整的收发 E-mail 的程
式，但是现在IE、NC等免费浏览器都已具有 Mail 的功能，可能没有人会再需
要像 vbmail.vbp 这样的程式；如果你的程式中只是需要寄信的功能，不需要像
vbmail.vbp 中一堆繁琐的程式，倒是可以参考以下两段程式：

需求物件：

一个 Form,一个 MAPISession，一个 MAPIMessages,两个 CommandButton
(MAPISession与 MAPIMessages置放于[专案]->[设定使用元件]->[Microsoft
MAPI Controls 5.0]之内)

１.将相同内容的信件寄给多个使用者：

Private Sub Command1_Click()
Dim i As Long, strMailAddr(1 To 2) As String
Dim strSubject As String, strNoteText As String
strMailAddr(1) = "M8606018@mail.ntust.edu.tw"
strMailAddr(2) = "Jaric@ch.ntust.edu.tw"
strSubject = "测试MAPI的寄信功能"
strNoteText = "这是第一行" & vbNewLine & "这是第二行"
If MAPISession1.SessionID > 0 Then MAPISession1.SignOff
MAPISession1.LogonUI = True
MAPISession1.DownLoadMail = False
MAPISession1.SignOn
MAPIMessages1.SessionID = MAPISession1.SessionID
For i = LBound(strMailAddr) To UBound(strMailAddr)
MAPIMessages1.Compose
MAPIMessages1.RecipAddress = strMailAddr(i)
MAPIMessages1.ResolveName
MAPIMessages1.MsgSubject = strSubject
MAPIMessages1.MsgNoteText = strNoteText
MAPIMessages1.Send
Next
MAPISession1.SignOff
End Sub

RecipAddress 就是收件者的电子邮件地址，MsgSubject 就是邮件的主旨，
MsgNoteText就是邮件的内容，只要增加 strMailAddr 的资料数量，就可将
邮件寄给更多人，比较方便的做法是连结至某个资料库来设定 strMailAddr
，由于设定 MAPISession1.LogonUI = True，所以程式执行后会出现以下的对
话盒：(若已设定完成则不显现设定盒)

这个对话盒是选取你之前在 Microsoft Exchange 编辑过的设定档，如果没有
任何设定档，就必须按 "新增" 钮来设定一些 Mail 伺服器的资料。

２.将不同内容的信件寄给多个使用者：

这段程式主要是通知每个使用者的个人密码，这里的 Password 函数只是很
简单地把传入的参数当成密码传回，如果要产生比较复杂一点的密码，可
以把字串转换成 ASCII，再对这些 ASCII 加减乘除一番。

Private Sub Command2_Click()
Dim i As Long, strMailAddr(1 To 2) As String, strCommon As String
Dim strAccount As String, strSubject As String, strNoteText As String
strMailAddr(1) = "M8606018@mail.ntust.edu.tw"
strMailAddr(2) = "Jaric@ch.ntust.edu.tw"
strSubject = "电脑教室使用通知"
strCommon = "本系电脑教室将于xx年xx月xx日开放，请务必遵守使用定。" _
& vbNewLine & "您的帐号和密码如下：" & vbNewLine
If MAPISession1.SessionID > 0 Then MAPISession1.SignOff
MAPISession1.DownLoadMail = False
MAPISession1.LogonUI = True
MAPISession1.SignOn
MAPIMessages1.SessionID = MAPISession1.SessionID
For i = LBound(strMailAddr) To UBound(strMailAddr)
strAccount = Mid(strMailAddr(i), 1, InStr(1, strMailAddr(i), "@") - 1)
MAPIMessages1.Compose
strNoteText = ""
strNoteText = strAccount & " 您好：" & vbNewLine & strCommon
strNoteText = strNoteText & "帐号：" & strAccount & vbNewLine
strNoteText = strNoteText & "密码：" & Password(strAccount)
MAPIMessages1.RecipAddress = strMailAddr(i)
MAPIMessages1.MsgSubject = strSubject
MAPIMessages1.MsgNoteText = strNoteText
MAPIMessages1.ResolveName
MAPIMessages1.Send
Next
MAPISession1.SignOff
End Sub

Private Function Password(s As String) As String
Password = s
End Function

寄出的两封信件大概是这样：

Jaric 您好：
本系电脑教室将于xx年xx月xx日开放，请务必遵守使用定。
您的帐号和密码如下：
帐号：Jaric
密码：Jaric

M8606018 您好：
本系电脑教室将于xx年xx月xx日开放，请务必遵守使用定。
您的帐号和密码如下：
帐号：M8606018
密码：M8606018

Follow Ups:

- Re: 有人用过MAPI这个activeX元件吗? yes888 12:40:52 1/06/99 (0)