【问题标题】:Launch default email client to open a "send email" window with a pre-selected file attachment启动默认电子邮件客户端以打开带有预选文件附件的“发送电子邮件”窗口
【发布时间】:2011-01-27 17:04:00
【问题描述】:

我需要在我们的应用程序中添加“创建和发送电子邮件”功能。我们的程序创建了一个输出文件,然后我必须启动默认电子邮件客户端以打开“写电子邮件”窗口,并将输出文件预选为附件。

我见过其他程序这样做,即使默认客户端是 Thunderbird 而不是 Outlook。

【问题讨论】:

  • 您可以使用 ShellExecute 启动带有收件人地址的电子邮件客户端(请参阅下面的链接),但不知道如何通知客户端有关附件的信息。 stackoverflow.com/questions/3863231/…

标签: c++ windows outlook email-client


【解决方案1】:

我最终使用 MAPI 来实现它。我使用 LoadLibrary 和 GetProcAddress 来获取所需的功能。

我使用的代码是这样的:

bool MailSender::Send(HWND hWndParent, LPCTSTR szSubject)
{
    if (!m_hLib)
        return false;

    LPMAPISENDMAIL SendMail;
    SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, "MAPISendMail");

    if (!SendMail)
        return false;

    vector<MapiFileDesc> filedesc;
    for (std::vector<attachment>::const_iterator ii = m_Files.begin(); ii!=m_Files.end(); ii++)
    {
        MapiFileDesc fileDesc;
        ZeroMemory(&fileDesc, sizeof(fileDesc));
        fileDesc.nPosition = (ULONG)-1;
        fileDesc.lpszPathName = (LPSTR) ii->path.c_str();
        fileDesc.lpszFileName = (LPSTR) ii->name.c_str();
        filedesc.push_back(fileDesc);
    }

    std::string subject;
    if (szSubject)
        subject = utf16to8(szSubject).c_str();
    else
    {
        for (std::vector<attachment>::const_iterator ii = m_Files.begin(); ii!=m_Files.end(); ii++)
        {
            subject += ii->name.c_str();
            if (ii+1 != m_Files.end())
                subject += ", ";
        }
    }

    MapiMessage message;
    ZeroMemory(&message, sizeof(message));
    message.lpszSubject = (LPSTR) subject.c_str();
    message.nFileCount = filedesc.size();
    message.lpFiles = &filedesc[0];

    int nError = SendMail(0, (ULONG)hWndParent, &message, MAPI_LOGON_UI|MAPI_DIALOG, 0);

    if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
        return false;

    return true;
}

【讨论】:

  • 我需要执行与启动带有附件的默认邮件客户端相同的活动。您能否提及您正在使用的所有标题?还是完整的原型?谢谢
  • 我找不到原始项目,我可能已经丢失了。
【解决方案2】:

使用mailto 方案可能是一个解决方案,但由于对哪些字段被认为是安全的限制,它会很棘手(如果你想走这条路,请参阅 RFC 23686067 以获取完整的详细信息)。

另一个解决方案是找出安装了哪些电子邮件客户端,并尽可能地启动它并通过命令行指定您需要的所有内容。请参阅 here 获取 Thunderbird 和 here 获取 Outlook。

【讨论】:

  • 谢谢,mailto 不支持文件附件。我测试了具有此功能的第三方应用程序。他们使用以下命令行调用 Thunderbird:“C:\Program Files\Mozilla Thunderbird\thunderbird.exe”/MAPIStartup -Embedding”。所以他们似乎是在使用 MAPI 来实现结果。我会先尝试调查。
  • @satuon: 使用mailto 我想在正文字段中包含 MIME 编码的附件,但它至少会很棘手,而且很可能根本不起作用。查看答案中的链接,了解 Thunderbird 和 Outlook 的替代命令行选项。
【解决方案3】:

您可以使用以下命令启动带有附件的默认客户端应用程序

"默认邮件client.exe的路径" -mail -compose subject='Subject',attachment='File path',body='body'"

默认邮件客户端的路径->可以从注册表路径中获取

HKEY_LM\SOFTWARE\Clients\Mail\Email 客户端名称\shell\open\command

邮件客户端名称 -> 可以取自

HKEY_LM\软件\客户端\邮件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多