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

问题描述 投票:4回答:3

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

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

c++ windows outlook email-client
3个回答
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;
}

2
投票

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

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


0
投票

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

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

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

HKEY_LM \ SOFTWARE \ Clients \ Mail \ Email Client Name \ shell \ open \ command

邮件客户端名称 - >可以从中获取

HKEY_LM \ SOFTWARE \客户\邮件

© www.soinside.com 2019 - 2024. All rights reserved.