如何以与在 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 资源管理器中刷新文件的缩略图?

如何在 Windows 资源管理器中添加“在此处打开 git-bash ...”上下文菜单?

如何像在 Windows 资源管理器中一样在 Delphi 中获取排序顺序?

如何在 Windows 11 的 Windows 资源管理器中添加“Git Bash Here”上下文菜单选项?

如何像 Windows 任务管理器中显示的那样获得可用的物理内存

如何将标签更改为与在 Xamarin 表单上显示通知相同的布局?