启动默认的电子邮件客户端,以打开一个“发送电子邮件”窗口与预选的文件附件

我需要添加一个“创build和电子邮件”的function到我们的应用程序。 我们的程序创build一个输出文件,然后我必须启动默认的电子邮件客户端打开一个“写电子邮件”窗口,并预先输出文件作为附件。

我已经看到其他程序这样做,即使默认客户端是Thunderbird而不是Outlook。

Solutions Collecting From Web of "启动默认的电子邮件客户端,以打开一个“发送电子邮件”窗口与预选的文件附件"

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

使用mailto方案可能是一个解决方案,但是由于限制哪些字段被认为是安全的,这将是棘手的(如果你想要去那条路由,请参阅RFC 2368和6067的全部细节)。

另一个解决方案是找出安装了哪个电子邮件客户端,并在可能的情况下启动它,并通过命令行指定所有你需要的东西。 看到这里的雷鸟& 这里的Outlook。