启动默认电子邮件客户端以打开带有预先选择的文件附件的“发送电子邮件”窗口

时间:2011-01-27 17:04:00

标签: c++ windows outlook email-client

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

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

3 个答案:

答案 0 :(得分:3)

我最终使用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;
}

答案 1 :(得分:2)

使用mailto方案可能是一种解决方案,但由于对哪些字段被认为是安全的限制,它会变得棘手(有关完整详细信息,请参阅RFC 23686067你想去那条路)

另一个解决方案是弄清楚安装了哪个电子邮件客户端 - 并且 - 尽可能 - 启动它并通过命令行指定所需的全部内容。有关Thunderbird&amp ;;的信息,请参阅here。 Outlook here

答案 2 :(得分:0)

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

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

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

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

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

HKEY_LM \ Software \ Clients \ Mail

相关问题