アプリに「作成してメールする」機能を追加する必要があります。私たちのプログラムは出力ファイルを作成します。次に、デフォルトの電子メール クライアントを起動して「電子メールの書き込み」ウィンドウを開き、出力ファイルが添付ファイルとして事前に選択されている必要があります。
デフォルトのクライアントが Outlook ではなく Thunderbird であっても、他のプログラムがそれを行うのを見たことがあります。
アプリに「作成してメールする」機能を追加する必要があります。私たちのプログラムは出力ファイルを作成します。次に、デフォルトの電子メール クライアントを起動して「電子メールの書き込み」ウィンドウを開き、出力ファイルが添付ファイルとして事前に選択されている必要があります。
デフォルトのクライアントが Outlook ではなく Thunderbird であっても、他のプログラムがそれを行うのを見たことがあります。
私はそれを達成するために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を参照してください)。
もう 1 つの解決策は、インストールされている電子メール クライアントを特定し、可能な限りそれを起動して、コマンド ラインから必要なものをすべて指定することです。Thunderbirdはこちら、Outlookはこちらをご覧ください。