c++ - 启动默认电子邮件客户端以打开带有预选文件附件的 "send email"窗口

标签 c++ windows outlook email-client

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

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

最佳答案

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

关于c++ - 启动默认电子邮件客户端以打开带有预选文件附件的 "send email"窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4819450/

相关文章:

c++ - 无法创建对类的新实例的引用

windows - 如何让 Windows 控制台\命令提示符显示颜色?

windows - 为什么 mogrify 将 PNG 大小调整为 50 像素的宽度,而不是批处理文件中指定的 50%?

.net - Outlook 互操作 PrintOut 文档名称

c# - 无法在 Outlook VSTO 中使用 PropertyAccessor 设置项目日期时间(如 PT_SYSTIME)

c++ - 初始化对象数组

c++ - 传递指针 vector 的指针......不不?

c++ - Arduino/C++ 中的函数/方法定义错误。还是语法错误?

c# - 无法查询 AD(获取 DirectoryServicesCOMException)

vba - 选择特定文件夹中的所有项目并将它们移动到另一个文件夹