如何以与在 Windows 资源管理器中“发送给邮件收件人”相同的方式以编程方式发送电子邮件?
Posted
技术标签:
【中文标题】如何以与在 Windows 资源管理器中“发送给邮件收件人”相同的方式以编程方式发送电子邮件?【英文标题】:How do I programmatically send an email in the same way that I can "Send To Mail Recipient" in Windows Explorer? 【发布时间】:2008-11-04 16:52:28 【问题描述】:ShellExecute() 允许我执行简单的 shell 任务,让系统负责打开或打印文件。我想采用类似的方法以编程方式发送电子邮件附件。
我不想直接操作 Outlook,因为我不想假设用户默认使用哪个电子邮件客户端。我不想直接发送电子邮件,因为我希望用户有机会使用他们的首选客户端编写电子邮件正文。因此,当我右键单击文件并选择发送到 -> 邮件收件人时,我真的很想完成 Windows 资源管理器所做的事情。
我正在寻找 C++ 解决方案。
【问题讨论】:
【参考方案1】:这是我的 MAPI 解决方案:
#include <tchar.h>
#include <windows.h>
#include <mapi.h>
#include <mapix.h>
int _tmain( int argc, wchar_t *argv[] )
HMODULE hMapiModule = LoadLibrary( _T( "mapi32.dll" ) );
if ( hMapiModule != NULL )
LPMAPIINITIALIZE lpfnMAPIInitialize = NULL;
LPMAPIUNINITIALIZE lpfnMAPIUninitialize = NULL;
LPMAPILOGONEX lpfnMAPILogonEx = NULL;
LPMAPISENDDOCUMENTS lpfnMAPISendDocuments = NULL;
LPMAPISESSION lplhSession = NULL;
lpfnMAPIInitialize = (LPMAPIINITIALIZE)GetProcAddress( hMapiModule, "MAPIInitialize" );
lpfnMAPIUninitialize = (LPMAPIUNINITIALIZE)GetProcAddress( hMapiModule, "MAPIUninitialize" );
lpfnMAPILogonEx = (LPMAPILOGONEX)GetProcAddress( hMapiModule, "MAPILogonEx" );
lpfnMAPISendDocuments = (LPMAPISENDDOCUMENTS)GetProcAddress( hMapiModule, "MAPISendDocuments" );
if ( lpfnMAPIInitialize && lpfnMAPIUninitialize && lpfnMAPILogonEx && lpfnMAPISendDocuments )
HRESULT hr = (*lpfnMAPIInitialize)( NULL );
if ( SUCCEEDED( hr ) )
hr = (*lpfnMAPILogonEx)( 0, NULL, NULL, MAPI_EXTENDED | MAPI_USE_DEFAULT, &lplhSession );
if ( SUCCEEDED( hr ) )
// this opens the email client with "C:\attachment.txt" as an attachment
hr = (*lpfnMAPISendDocuments)( 0, ";", "C:\\attachment.txt", NULL, NULL );
if ( SUCCEEDED( hr ) )
hr = lplhSession->Logoff( 0, 0, 0 );
hr = lplhSession->Release();
lplhSession = NULL;
(*lpfnMAPIUninitialize)();
FreeLibrary( hMapiModule );
return 0;
【讨论】:
如何设置收件人? 这不是 100% 的程序化解决方案。此代码打开电子邮件客户端,并将提供的文件添加为附件。然后由用户输入收件人,就像他们在其他任何时候一样。 Outlook 标头,包括 mapix.h,可以从 MSDN 的以下位置下载 - microsoft.com/en-us/download/confirmation.aspx?id=12905 但是,我在执行此代码时遇到错误,表示默认电子邮件客户端没有安装。但是我可以通过将任何文件发送到电子邮件来从 Windows 资源管理器调用 Outlook。【参考方案2】:您可以在 Windows shell 中使用标准的“mailto:”命令。它将运行默认的邮件客户端。
【讨论】:
【参考方案3】:以下 C++ 示例显示如何调用 Windows 资源管理器使用的 SendTo 邮件快捷方式:
http://www.codeproject.com/KB/shell/sendtomail.aspx
【讨论】:
【参考方案4】:您需要实现MAPI client. 这将允许您在将消息呈现给用户发送之前预先填写文档、添加附件等。您可以使用默认消息存储来使用他们的默认邮件客户端。
【讨论】:
以上是关于如何以与在 Windows 资源管理器中“发送给邮件收件人”相同的方式以编程方式发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 资源管理器中添加“在此处打开 git-bash ...”上下文菜单?
如何像在 Windows 资源管理器中一样在 Delphi 中获取排序顺序?
如何在 Windows 11 的 Windows 资源管理器中添加“Git Bash Here”上下文菜单选项?