我需要在我们的应用程序中添加“创建和发送电子邮件”功能。我们的程序创建了一个输出文件,然后我必须启动默认电子邮件客户端以打开“写电子邮件”窗口,并将输出文件预选为附件。
我见过其他程序这样做,即使默认客户端是 Thunderbird 而不是 Outlook。
我需要在我们的应用程序中添加“创建和发送电子邮件”功能。我们的程序创建了一个输出文件,然后我必须启动默认电子邮件客户端以打开“写电子邮件”窗口,并将输出文件预选为附件。
我见过其他程序这样做,即使默认客户端是 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;
}
使用该mailto
方案可能是一种解决方案,但由于对哪些字段被认为是安全的限制,它会很棘手(如果你想走这条路,请参阅 RFC 2368和6067了解完整的详细信息)。
另一种解决方案是找出安装了哪些电子邮件客户端,并尽可能地启动它并通过命令行指定您需要的所有内容。有关Thunderbird 的信息,请参见此处,有关 Outlook 的信息请参见此处。
您可以使用以下命令启动带有附件的默认客户端应用程序
"默认邮件client.exe的路径" -mail -compose subject='Subject',attachment='File path',body='body'"
默认邮件客户端的路径-> 可以从注册表路径中获取
HKEY_LM\SOFTWARE\Clients\Mail\Email 客户端名称\shell\open\command
邮件客户端名称 -> 可以取自
HKEY_LM\软件\客户端\邮件