简体   繁体   English

如何以与我在Windows资源管理器中“发送到邮件收件人”相同的方式以编程方式发送电子邮件?

[英]How do I programmatically send an email in the same way that I can “Send To Mail Recipient” in Windows Explorer?

ShellExecute() allows me to perform simple shell tasks, allowing the system to take care of opening or printing files. ShellExecute()允许我执行简单的shell任务,允许系统负责打开或打印文件。 I want to take a similar approach to sending an email attachment programmatically. 我想采用类似的方法以编程方式发送电子邮件附件。

I don't want to manipulate Outlook directly, since I don't want to assume which email client the user uses by default. 我不想直接操作Outlook,因为我不想假设用户默认使用哪个电子邮件客户端。 I don't want to send the email directly, as I want the user to have the opportunity to write the email body using their preferred client. 我不想直接发送电子邮件,因为我希望用户有机会使用他们的首选客户端编写电子邮件正文。 Thus, I really want to accomplish exactly what Windows Explorer does when I right click a file and select Send To -> Mail Recipient. 因此,当我右键单击文件并选择Send To - > Mail Recipient时,我真的想要完成Windows资源管理器的功能。

I'm looking for a C++ solution. 我正在寻找一个C ++解决方案。

This is my MAPI solution: 这是我的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;
}

You can use a standard "mailto:" command in windows shell. 您可以在Windows shell中使用标准的“mailto:”命令。 It will run the default mail client. 它将运行默认邮件客户端。

The following C++ example shows how to invoke the SendTo mail shortcut used by Windows Explorer: 以下C ++示例演示如何调用Windows资源管理器使用的SendTo邮件快捷方式:

http://www.codeproject.com/KB/shell/sendtomail.aspx http://www.codeproject.com/KB/shell/sendtomail.aspx

You'll need to implement a MAPI client. 您需要实现MAPI客户端。 This will let you prefill the document, add attachments, etc.. before presenting the message to the user to send off. 这将允许您在向用户发送消息之前预填充文档,添加附件等。 You can use the default message store to use their default mail client. 您可以使用默认邮件存储来使用其默认邮件客户端。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM