打开默认的电子邮件客户端,以打开一个“发送电子邮件”窗口,并预先选择一个文件附件。

4
我需要在我们的应用程序中添加“创建并发送电子邮件”的功能。我们的程序会生成一个输出文件,我必须启动默认的电子邮件客户端以打开“编写电子邮件”窗口,并将输出文件预选为附件。
我已经看到其他程序这样做,即使默认客户端是Thunderbird而不是Outlook。

你可以使用ShellExecute来启动带有收件人地址的电子邮件客户端(请参见下面的链接),但不知道如何通知客户端附件的存在。http://stackoverflow.com/questions/3863231/easy-way-to-invoke-standard-mail-client-from-c-with-recipient-adress-and-subjec/3863259#3863259 - Christian Ammer
3个回答

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

我需要执行相同的操作,即使用附件启动默认邮件客户端。您能否提及您正在使用的所有标头?或者完整的原型?谢谢。 - Teja
我找不到原始项目,可能已经丢失了。 - sashoalm

2
使用mailto方案可能是一种解决方案,但由于对被认为是安全的字段有限制,所以这将会很棘手(如果您想采用这种方法,请参阅RFC 23686067以获取完整的详细信息)。
另一个解决方案是找出安装了哪个电子邮件客户端,并在可能的情况下启动它,并通过命令行指定所有需要的内容。请参见此处了解Thunderbird和此处了解Outlook。

谢谢,但mailto不支持文件附件。我测试了一个具有此功能的第三方应用程序。他们使用以下命令行调用Thunderbird:"C:\Program Files\Mozilla Thunderbird\thunderbird.exe" /MAPIStartup -Embedding。因此,他们似乎正在使用MAPI来实现结果。我将首先尝试调查这一点。 - sashoalm
@satuon:使用mailto时,我考虑将MIME编码的附件包含在正文字段中,但这至少会很棘手,很可能根本无法工作。请查看答案中提供的链接,了解Thunderbird和Outlook的替代命令行选项。 - Eugen Constantin Dinca

0

您可以使用以下命令启动默认的客户端应用程序并附加文件:

"默认邮件客户端.exe的路径" -mail -compose subject='主题',attachment='文件路径',body='正文'"

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

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

邮件客户端名称可以从以下位置获取:

HKEY_LM\Software\Clients\Mail


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接