VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 使用VB收发电子邮件
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:9769, 日期:2001-03-23
---- 发 送 和 接 收 电 子 邮 件, 对 于 某 些 执 行 特 殊 任 务 的 应 用 程 序 而 言, 是 一 个 十 分 有 用 的 功 能。 例 如, 一 个 监 视 网 络 服 务 器 资 源 使 用 情 况 的 工 具 软 件, 如 果 它 具 有 自 动 发 送 电 子 邮 件 的 功 能, 那 么 当 它 发 现 服 务 器 的 资 源 使 用 已 经 接 近 事 先 设 定 的 临 界 状 态 时, 便 可 以 向 系 统 管 理 员 发 送 一 封 告 警 的 电 子 邮 件, 从 而 使 系 统 管 理 员 能 够 及 时 地 采 取 措 施, 以 避 免 重 大 事 故 的 出 现。 在Visual Basic 中, 应 用 程 序 可 以 通 过 调 用 微 软 公 司 的MAPI(Messaging Application Programming Interface, 消 息 应 用 程 序 编 程 接 口), 实 现 收 发 电 子 邮 件 的 功 能。 笔 者 将 在 本 文 中 结 合 简 单 实 例, 向 大 家 介 绍 在VB 程 序 中 实 现 电 子 邮 件 收 发 功 能 的 编 程 方 法。

---- 编 制 具 有 收 发 电 子 邮 件 功 能 的VB 程 序, 必 须 使 用Visual Basic 4.0 以 上 的 版 本, 因 为 只 有4.0 以 上 的Visual Basic 才 带 有 两 个 实 现 电 子 邮 件 收 发 功 能 的 核 心 控 件:MAPI 会 话 控 件 和MAPI 消 息 控 件。MAPI 会 话 控 件 用 于 建 立 和 控 制 一 个Microsoft Mail 会 话,MAPI 消 息 控 件 用 于 创 建 和 收 发 邮 件 消 息。 此 外, 程 序 必 须 运 行 在 采 用 遵 从MAPI 的 消 息 系 统( 如:Microsoft Exchange、Microsoft Mail、Outlook 等) 的 环 境 中。

.
.
.

---- 在 其 中 的“Available Controls” 列 表 框 中 选 中“Microsoft MAPI Controls” 表 项, 然 后 按“OK” 命 令 按 钮 退 出 该 对 话 框 .

.
.

---- 下 面, 笔 者 将 以 两 个 简 单 的VB 程 序 为 例, 分 别 介 绍 发 送 邮 件 和 接 收 邮 件 的 程 序 编 制 方 法。

---- 邮 件 发 送 程 序

---- 邮 件 发 送 程 序 的 基 本 处 理 过 程 是: 根 据 用 户 输 入 信 息 组 成 邮 件, 然 后 使 用MAPI 消 息 控 件 的Send 方 法 将 邮 件 发 出。 编 程 步 骤 如 下:

---- 1、 新 建 一 个VB 项 目。

---- 2、 将 缺 省 窗 体Form1 的Caption 属 性 设 置 为“ 发 送 邮 件”。

---- 3、 将MAPI 控 件 加 入VB 工 具 框。

---- 4、 在Form1 中 加 入 一 个MAPI 会 话 控 件MAPISession1 和 一 个MAPI 消 息 控 件MAPIMessages1。

---- 5、 在Form1 中 加 入 三 个 文 本 框 控 件, 将 它 们 的Name 属 性 分 别 设 置 为txtSendTo、txtSubject、txtMessage, 并 将txtMessage 的Multiline 属 性 设 置 为True。 这 三 个 文 本 框 控 件 将 分 别 用 于 填 写 邮 件 的 收 件 人、 主 题 和 内 容。

---- 6、 在Form1 中 加 入 三 个 标 签 控 件, 将 它 们 的Caption 属 性 分 别 设 置 为“ 收 件 人”、“ 主 题” 和“ 内 容”, 并 将 它 们 放 在 合 适 的 位 置 用 以 标 注 相 应 的 文 本 框 控 件。

---- 7、 在Form1 中 加 入 一 个 命 令 按 钮 控 件, 将 其Caption 属 性 和Name 属 性 分 别 设 置 为“ 发 送” 和“cmdSend”。

---- 8、 将 下 列 代 码 加 入Form1 的Form_Load 事 件:

Private Sub Form_Load()
MAPISession1.SignOn
End Sub

---- 9、 将 下 列 代 码 加 入Form1 的Form_Unload 事 件:

Private Sub Form_Unload(Cancel As Integer)
MAPISession1.SignOff
End Sub

---- 10、 将 下 列 代 码 加 入cmdSend 的Click 事 件:

Private Sub cmdSend_Click()
With MAPIMessages1
.MsgIndex = -1
.RecipDisplayName = txtSendTo.Text
.MsgSubject = txtSubject.Text
.MsgNoteText = txtMessage.Text
.SessionID = MAPISession1.SessionID
.Send
End With
MsgBox "邮件发送完毕!", , "发送邮件"
End Sub
.
.
.

---- 邮 件 接 收 程 序

---- 邮 件 接 收 程 序 比 邮 件 发 送 程 序 稍 微 复 杂 一 些。 首 先 需 要 使 用MAPI 消 息 控 件 的Fetch 方 法 读 取 邮 件, 这 个 过 程 将 把 用 户 收 件 箱 中 所 有 未 读 邮 件 全 部 装 入MAPI 消 息 控 件 中。 然 后, 检 查MAPI 消 息 控 件 的MsgCount 属 性 以 确 定 通 过Fetch 方 法 读 取 的 邮 件 的 总 数。 接 着, 可 以 通 过 设 置MAPI 消 息 控 件 的MsgIndex 属 性 来 指 定 具 体 需 要 处 理 哪 一 封 邮 件。 需 要 说 明 的 是,MsgIndex 属 性 值 的 计 数 是 从0 开 始 的, 也 就 是 说, 第 一 封 邮 件 的 索 引 号 是0, 第 二 封 邮 件 的 索 引 号 是1, 依 次 类 推。 编 程 步 骤 如 下:

---- 1、 新 建 一 个VB 项 目。

---- 2、 将 缺 省 窗 体Form1 的Caption 属 性 设 置 为“ 接 收 邮 件”。

---- 3、 将MAPI 控 件 加 入VB 工 具 框。

---- 4、 在Form1 中 加 入 一 个MAPI 会 话 控 件MAPISession1 和 一 个MAPI 消 息 控 件MAPIMessages1。

---- 5、 在Form1 中 加 入 三 个 标 签 控 件 和 一 个 文 本 框 控 件, 将 三 个 标 签 控 件 的Name 属 性 分 别 设 置 为lblMsgDateReceived、lblMsgOrigDisplayName、lblMsgSubject, 将 文 本 框 控 件 的Name 属 性 设 置 为txtMsgNoteText, 并 将 标 签 控 件 的Caption 属 性 和 文 本 框 控 件 的Text 属 性 的 内 容 清 空。 这 四 个 控 件 将 分 别 用 于 显 示 邮 件 的 日 期、 发 件 人、 主 题 和 内 容。

---- 6、 将txtMsgNoteText 控 件 的Locked 属 性 和Multiline 属 性 设 置 为True,ScrollBars 属 性 设 置 为2 - Vertical。

---- 7、 在Form1 中 再 加 入 四 个 标 签 控 件 用 于 标 注 上 述 四 个 控 件, 将 它 们 的Caption 属 性 分 别 设 置 为“ 日 期”、“ 发 件 人”、“ 主 题”、“ 内 容”。

---- 8、 在Form1 中 加 入 一 个 标 签 控 件, 将 其Name 属 性 设 置 为lblMsgCount,Caption 属 性 设 置 为“ 第 0 封 邮 件, 总 计 0 封 邮 件”。 该 控 件 用 于 显 示 接 收 的 邮 件 总 数 以 及 当 前 正 在 处 理 第 几 封 邮 件。

---- 9、 在Form1 中 加 入 三 个 命 令 按 钮 控 件, 将 它 们 的Name 属 性 分 别 设 置 为cmdPrevious、cmdNext、cmdClose,Caption 属 性 分 别 设 置 为“ 上 一 封”、“ 下 一 封”、“ 关 闭”。

---- 10、 编 写 一 个 窗 体 级 子 例 程FetchNewMail:

Public Sub FetchNewMail()
MAPIMessages1.FetchUnreadOnly = True
MAPIMessages1.Fetch
End Sub

---- 11、 编 写 一 个 窗 体 级 子 例 程DisplayMessage:

... ...

---- 12、 将 下 列 代 码 加 入Form1 的Form_Load 事 件:

... ...

---- 13、 将 下 列 代 码 加 入cmdPrevious 的Click 事 件:


... ...

---- 14、 将 下 列 代 码 加 入cmdNext 的Click 事 件:


... ...

---- 15、 将 下 列 代 码 加 入cmdClose 的Click 事 件:


... ...

---- 本 例 是 读 取 用 户 收 件 箱 中 所 有 未 读 邮 件, 如 果 要 读 取 收 件 箱 中 所 有 的 邮 件, 那 么 只 需 在 执 行Fetch 方 法 之 前, 将MAPI 消 息 控 件 的FetchUnreadOnly 属 性 设 置 为False。 具 体 接 收 的 邮 件 是 否 已 经 读 过, 可 以 通 过MsgRead 属 性 来 判 别。 如 果 邮 件 的 正 文 或 附 件 曾 经 被 浏 览 过, 那 么 该 邮 件 就 会 自 动 标 记 为 已 读, 不 过 只 浏 览 邮 件 的 主 题 不 会 标 记 该 邮 件 已 读。

---- 邮 件 附 件

---- 与 处 理 邮 件 的 方 式 一 样,MAPI 也 为 邮 件 的 附 件 提 供 了 一 个 计 数 器 和 一 个 索 引。 在 处 理 收 到 的 邮 件 时, 可 以 通 过 检 查AttachmentCount 属 性 来 确 定 该 邮 件 携 带 了 多 少 个 附 件, 然 后 可 以 通 过 设 置AttachmentIndex 属 性 依 次 处 理 每 一 个 附 件。AttachmentIndex 的 合 法 取 值 范 围 为0 至AttachmentIndex-1。 在 设 置 了AttachmentIndex 属 性 值 后, 可 以 读 取 附 件 的 下 列 属 性:

---- AttachmentName: 当 附 件 是 一 个 文 件 时, 该 属 性 用 于 指 定 文 件 的 名 称。 当 附 件 是 一 个OLE 对 象 时, 该 属 性 用 于 指 定 对 象 的 类 型。

---- AttachmentPath: 该 属 性 用 于 指 定 做 为 附 件 的 文 件 的 全 路 径 名。

---- AttchmentPosition: 该 属 性 用 于 指 定 附 件 在 邮 件 内 容 部 分 中 的 位 置。 当 邮 件 收 发 程 序 显 示 邮 件 内 容 时, 将 使 用 该 属 性 提 供 的 信 息 把 附 件 的 标 志 放 在 合 适 的 位 置。

---- AttachmentType: 该 属 性 用 于 指 定 附 件 的 类 型, 其 合 法 取 值 为 三 个 整 数 型 数 值, 在VB 中 分 别 由 下 列 常 量 表 示:

mapData - 附 件 是 一 个 数 据 文 件

mapEOLE - 附 件 是 一 个 嵌 入 式OLE 对 象

mapSOLE - 附 件 是 一 个 静 态OLE 对 象
---- 发 送 邮 件 时, 上 述 属 性 的 使 用 方 法 与 接 收 邮 件 时 相 同, 只 不 过 由 读 操 作 改 为 写 操 作 了。 值 得 一 提 的 是AttachmentIndex 属 性, 发 送 邮 件 时 可 以 将 其 设 置 为 任 意 值。 而AttachmentCount 属 性 则 会 自 动 设 置 为 正 确 的 值, 无 需 人 为 设 置。

---- 小 结

---- 通 过 分 析 上 述 两 个 程 序 的 代 码, 可 以 归 纳 出 具 有 收 发 电 子 邮 件 功 能 的VB 程 序 的 基 本 流 程 如 下:

---- 1、 使 用MAPI 会 话 控 件 建 立 一 个 邮 件 会 话。

---- 2、 使 用MAPI 消 息 控 件 进 行 邮 件 的 处 理 工 作。

---- 3、 再 次 使 用MAPI 会 话 控 件 释 放 邮 件 会 话。

---- 由 于 上 述 两 个VB 程 序 只 是 简 单 的 示 例, 因 而 略 去 了 一 些 与 本 文 主 题 关 系 不 大 的 细 节, 如 错 误 处 理 等。 在 编 制 实 用 程 序 时, 为 了 保 证 程 序 的 可 靠 性, 应 该 考 虑 加 入 这 些 细 节 部 分。