使用 MAPI 发送电子邮件 - COM DLL






4.86/5 (17投票s)
2002年9月24日
5分钟阅读

354797

8348
如何自动发送自定义电子邮件消息和附件?
引言
在软件开发过程中,我见过许多需要集成电子邮件支持的应用程序。我记得,有一次我需要开发一个应用程序,该应用程序会在特定时间向特定人员发送带有自定义消息的电子邮件。为此,我开发了一个使用 MAPI 的 COM 服务。MAPI,即消息应用程序编程接口,是标准的邮件体系结构以及一套完整的函数和面向对象的接口。在这里,我提供了一个电子邮件组件,一个 COM DLL,它包含一组消息函数,可以帮助您创建支持消息功能的应用程序。该 COM 组件使用了 Simple MAPI 来实现这一目标。
注意:MAPI 被各种行业标准的电子邮件客户端使用,例如 Microsoft Exchange 客户端、所有版本的 Microsoft Outlook 和 Outlook Express,包括 QUALCOMM Incorporated (Eudora) 和 Netscape Communications Corporation。因此,您也可以将此组件与这些客户端应用程序一起使用。
组件设计
电子邮件组件的 CLSID
是 CLSID_Mail
,它只有一个接口 IMail
,接口 ID 为 IID_IMail
。
CMail
是实现类,包含以下数据成员:
m_MAPILogon |
MAPILogon 的函数指针 |
m_MAPISendMail |
MAPISendMail 的函数指针 |
m_MAPISendDocuments |
MAPISendDocuments 的函数指针 |
m_MAPIFindNext |
MAPIFindNext 的函数指针 |
m_MAPIReadMail |
MAPIReadMail 的函数指针 |
m_MAPIResolveName |
MAPIResolveName 的函数指针 |
m_MAPIAddress |
MAPIAddress 的函数指针 |
m_MAPILogoff |
MAPILogoff 的函数指针 |
m_MAPIFreeBuffer |
MAPIFreeBuffer 的函数指针 |
m_MAPIDetails |
MAPIDetails 的函数指针 |
m_MAPISaveMail |
MAPISaveMail 的函数指针 |
IMail
包含以下函数:
IsMapiInstalled |
检查系统是否安装了 MAPI。它会搜索 Win.INI 文件中的 MAPI 键。如果找到,则返回 S_OK 。 |
InitMapi |
在通过 IsMapiInstalled 检查后,它会初始化 MAPI 函数指针。在使用该组件之前,应调用此方法一次。 |
put_strProfileName |
接受您用于发送电子邮件的 Outlook 配置文件名称。 |
put_strEmailAddress |
设置收件人电子邮件地址。您可以指定多个用逗号 (,) 分隔的收件人地址。 |
put_strRecipient |
设置您想要为收件人指定的姓名,设置发件人的电子邮件名称 – 这可能与您指定的配置文件电子邮件地址不同。 |
put_strSubject |
设置电子邮件的主题。 |
get_strSubject |
返回电子邮件主题。 |
put_strMessage |
设置电子邮件消息文本。 |
get_strMessage |
返回消息文本。 |
put_strAttachmentFilePath |
设置电子邮件附件,需要提供完整路径,例如 “c:\abc.txt”。 |
get_strAttachmentFilePath |
返回电子邮件附件的路径。 |
put_strAttachmentFile |
附件的显示名称 (Sample.txt),默认情况下,它与在 put_strAttachmentFilePath 中指定的相同。 |
get_strAttachmentFile |
返回附件文件名。 |
Logon |
如果尚未打开,则使用指定的 Outlook 配置文件、名称和配置文件密码打开新的登录会话。在发送电子邮件之前,您必须先登录。我将密码设置为 NULL ,假设您指定的配置文件没有密码,但您可以指定自己的密码。Send 方法会自动调用此方法。 |
Logoff |
注销并关闭会话。Send 方法在发送电子邮件后会自动调用此方法。 |
发送 |
发送电子邮件,需要有效的 Outlook 配置文件名称、收件人电子邮件地址和登录会话才能发送电子邮件。 |
执行演示项目的步骤
演示项目展示了如何使用该组件发送电子邮件。为了执行演示项目,需要以下设置:
步骤 1:您必须拥有一个有效的 Outlook Express 电子邮件帐户,或者创建一个名为 TestProfile 的帐户。
您可以在 Express 中通过 **工具 > 帐户** 菜单创建电子邮件帐户。这将打开 Internet 帐户属性表。在“所有”选项卡上,单击“添加”按钮,然后选择“邮件”。一个向导将引导您创建电子邮件帐户,并指定有效的电子邮件地址。对于 Hotmail 帐户,向导会自动设置电子邮件服务器的名称。
成功创建帐户后,在“所有”选项卡中的列表中选择帐户名称(对于 Hotmail 帐户,默认帐户名称是 Hotmail)。按“属性”按钮打开帐户属性,并将帐户名称从默认名称(例如 Hotmail)更改为 **TestProfile**。
步骤 2:注册 DLL
所有 COM DLL 都需要注册。复制 DLL 源代码后,您可以通过右键单击 DLL 并选择“注册 DLL”或“注册 COM 组件”选项来注册 DLL,或者直接双击 DLL。在 Visual Studio 中编译 DLL 代码会自动注册该 DLL。
步骤 3:登录网络
请确保您已登录到网络。否则,Outlook 将无法发送电子邮件,但您仍然可以在“发件箱”中检查撰写的电子邮件。
如何发送电子邮件?
在对话框中指定信息后,单击“发送”按钮。将显示一条警告消息,单击“发送”按钮。
注意:由于安全限制,会显示警告对话框。如果您想摆脱这个对话框,那么您将不得不使用 Extended MAPI 而不是 Simple MAPI。
这是 CTestEmailDlg::OnSend
方法,它用于将用户指定的信息传递给电子邮件对象,并在设置完所有内容后调用 IMail::Send
方法。
//##//##////////////////////////////////////////////////////////////// /////////////////////////////////////////////// // // void CTestEmailDlg::OnSend() // // This module is called when send button is pressed and uses //Email COM DLL to send email - Aisha Ikram // Note: dont forget to initialize COM library using CoInitialize(NULL); //##//##//////////////////////////////////////////////////////////////////// /////////////////////////////////////////////// void CTestEmailDlg::OnSend() { UpdateData(); try{ CComPtrobjMail; HRESULT hr; // make sure the DLL is registered hr = objMail.CoCreateInstance(CLSID_Mail); if(SUCCEEDED(hr)) { if(hr== S_OK) { // profile name is compulsory, this is the outlook profile, // i used "outlook express" as configuring it is easier than // "MS outlook" make sure to specify the correct sender's address // for this profile and make sure that outlook express is //the default email client. if(m_strProfile.IsEmpty()) { AfxMessageBox("Please specify email profile name "); return; } if(m_strTo.IsEmpty()) { AfxMessageBox("Please specify recipient's email address "); return; } // by default, it's TestProfile, assumes that a profile with this //name exists in outlook hr= objMail->put_strProfileName((_bstr_t)m_strProfile); hr = objMail->put_strSubject((_bstr_t)m_strSubject); // this is the email or set of email addresses (separated by ,) // which is actually used to send email hr = objMail->put_strEmailAddress((_bstr_t)m_strTo); // recipient is just to show the display name hr = objMail->put_strRecipient((_bstr_t)m_strTo); hr = objMail->put_strAttachmentFilePath((_bstr_t)m_strAttachment); hr = objMail->put_strMessage((_bstr_t)m_strMessage); hr= objMail->Send(); if(hr!=S_OK) AfxMessageBox("Error, make sure the info is correct"); }//if } //if } // try catch(...) { AfxMessageBox("Error, make sure specified info is correct"); } }
检查收件人收件箱中的邮件。
使用场景
此组件可以扩展以集成其他功能,例如自动打开现有收件箱读取电子邮件以及撰写新电子邮件等。它可用于在特定时间自动向特定人员发送带有自定义用户消息和附件的电子邮件,尤其是在使用某些 exe 服务器或 NT 服务时。
就是这样。如果您有任何建议或意见,都非常欢迎。您的评分将帮助我评估我文章的水平。
寻找类而不是 COM 组件?
我还构建了一个类 CSMAPI
,用于使用 Simple MAPI 发送电子邮件、读取和查找消息,更多功能还在添加中。您可以在我的网站上找到这个类,它可以在任何地方使用(包括 win32、MFC 或 ATL),以及 MFC 中的演示项目。
您可以在 我的网站(免费代码和文章网站)找到所有内容。