Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>Can your software require <a href="http://www.google.com/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBkQFjAA&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FMessaging_Application_Programming_Interface&amp;rct=j&amp;q=MAPI&amp;ei=0XAjTcW9EoL_8AburuyGDg&amp;usg=AFQjCNHSZEz14_X2416eQyqa2P1ttKmgCA&amp;sig2=7uUEi1XrvAv21FHJdyFK9w&amp;cad=rja" rel="nofollow">MAPI</a>? That's an interface that provides a fairly simple interface to whatever the user's installed as default email program is.</p> <p>If so, then you can use something like the following:</p> <pre><code>///////////////////////////////////////////////////////// // CMapiSendMessage // Allows for simplified message generation and transmission using Simple MAPI class CMapiSendMessage { public: // constant data enum RecipientType { FROM = MAPI_ORIG, TO = MAPI_TO, CC = MAPI_CC, BCC = MAPI_BCC }; // ctors CMapiSendMessage() { } // accessors CString GetSubject() const { return m_subject; } CString &amp; GetMessage() { return m_message; } const CString &amp; GetMessage() const { return m_message; } // setters void AddRecipient(RecipientType type, const CStringA &amp; strName, const CStringA &amp; strAddress = "") { m_recipients.push_back(Recipient(type, strName, strAddress)); } void SetSubject(const CString &amp; strSubject) { m_subject = strSubject; } void SetMessage(const CString &amp; strMessage) { m_message = strMessage; } void AddAttachment(const CFilename &amp; filename) { m_attachments.push_back(filename.cstring()); } // actions ULONG Send(bool bShowDialog, HWND hwndParent); // send this message, show or don't show the user the message dialog // returns SUCCESS_SUCCESS if all went well // returns MAPI_USER_ABORT if user aborted the send // returns MAPI_E_LOGIN_FAILURE if unable to login to MAPI service (user login failed) ULONG AfxSend(bool bShowDialog, bool bShowError); // send message with special processing for an MFC application // set bShowError if you wish to automatically show standard MFC error messages if the send message failed protected: // types struct Recipient { RecipientType type; CStringA name; CStringA address; Recipient(RecipientType _type, const CStringA &amp; _name, const CStringA &amp; _address = "") : type(_type), name(_name), address(_address) { } // force default ctor to set type to zero (not random) Recipient() : type(FROM) { } }; typedef std::vector&lt;Recipient&gt; RecipientVector; typedef std::vector&lt;CString&gt; AttachmentVector; CMailAPI32 m_api; // MAPI interface RecipientVector m_recipients; // recipients (TO:, CC:, and BCC:) CString m_subject; // message subject CString m_message; // message body text AttachmentVector m_attachments; // file attachments }; </code></pre> <p>And the CPP half:</p> <pre><code>typedef std::vector&lt;CMapiRecipDesc&gt; MapiRecipDescVector; typedef std::vector&lt;CMapiFileDesc&gt; MapiFileDescVector; ////////////////////////////////////////////////////////////////////// // CMailAPI32 ////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// // CMapiSendMessage ULONG CMapiSendMessage::Send(bool bShowDialog, HWND hwndParent) // send, show user interface - let them edit the message and have final choice in send/cancel { // save the cwd CPathname cwd(CPathname::GetCurrent()); // build the recipients array const size_t total_recipients = m_recipients.size(); MapiRecipDescVector recipients(total_recipients); for (size_t i = 0; i &lt; total_recipients; ++i) { CMapiRecipDesc recipient; recipient.ulReserved = 0L; recipient.ulRecipClass = m_recipients[i].type; recipient.lpszName = const_cast&lt;LPSTR&gt;(GetPtrOrNull(m_recipients[i].name)); recipient.lpszAddress = const_cast&lt;LPSTR&gt;(GetPtrOrNull(m_recipients[i].address)); recipient.ulEIDSize = 0; recipient.lpEntryID = NULL; recipients[i] = recipient; } // build attachments array const size_t total_attachments = m_attachments.size(); MapiFileDescVector attachments(total_attachments); for (size_t j = 0; j &lt; total_attachments; ++j) { CFilename filename(m_attachments[j]); if (!filename.Exists()) ThrowLabeledException(FString(_T("File does not exist: %s"), filename.c_str())); // get the fully specified path size_t size = filename.cstring().GetLength() + 1; attachments[j].lpszPathName = new char[size]; #ifdef _UNICODE _wcstombsz(attachments[j].lpszPathName, filename, size); #else lstrcpy(attachments[j].lpszPathName, filename); #endif // build an appropriate title for the attachment CString strTitle = filename.GetFullName(); size = strTitle.GetLength() + 1; attachments[j].lpszFileName = new char[size]; #ifdef _UNICODE _wcstombsz(attachments[j].lpszFileName, strTitle, size); #else lstrcpy(attachments[j].lpszFileName, strTitle); #endif // attachment not embedded in the mapi_msg text; attachments[j].nPosition = (ULONG)-1; } // prepare the mapi_msg MapiMessage mapi_msg = { 0, // reserved, must be 0 (LPSTR)GetPtrOrNull(m_subject), // subject (LPSTR)GetPtrOrNull(m_message), // body NULL, // NULL = interpersonal mapi_msg NULL, // no date; MAPISendMail ignores it NULL, // no conversation ID 0L, // no flags, MAPISendMail ignores it NULL, // no originator, this is ignored too total_recipients, // no. recipients total_recipients ? &amp;recipients[0] : NULL, // array of recipients total_attachments, // no. attachments total_attachments ? &amp;attachments[0] : NULL // array of attachments }; // send mail FLAGS flags = MAPI_LOGON_UI; BitSetIf(flags, MAPI_DIALOG, bShowDialog); ULONG nError = m_api.SendMail( NULL, // temporary session (ULONG)hwndParent, &amp;mapi_msg, flags, 0 ); // delete the attachment filenames for (int k = total_attachments; k ; --k) { delete [] attachments[k-1].lpszPathName; delete [] attachments[k-1].lpszFileName; } // restore CWD cwd.SetCurrent(); // indicate if we succeeded or not return nError; } ULONG CMapiSendMessage::AfxSend(bool bShowDialog, bool bReportError) { // prepare for modal dialog box AfxGetApp()-&gt;EnableModeless(FALSE); HWND hWndTop; CWnd * pParentWnd = CWnd::GetSafeOwner(NULL, &amp;hWndTop); // some extra precautions are required to use MAPISendMail as it // tends to enable the parent window in between dialogs (after // the login dialog, but before the send note dialog). pParentWnd-&gt;SetCapture(); ::SetFocus(NULL); pParentWnd-&gt;m_nFlags |= WF_STAYDISABLED; // attempt to send the message ULONG nError = Send(bShowDialog, pParentWnd-&gt;GetSafeHwnd()); // display error to user if (nError != SUCCESS_SUCCESS &amp;&amp; nError != MAPI_USER_ABORT &amp;&amp; nError != MAPI_E_LOGIN_FAILURE) { AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND); } // after returning from the MAPISendMail call, the window must // be re-enabled and focus returned to the frame to undo the workaround // done before the MAPI call. ::ReleaseCapture(); pParentWnd-&gt;m_nFlags &amp;= ~WF_STAYDISABLED; pParentWnd-&gt;EnableWindow(TRUE); ::SetActiveWindow(NULL); pParentWnd-&gt;SetActiveWindow(); pParentWnd-&gt;SetFocus(); if (hWndTop != NULL) ::EnableWindow(hWndTop, TRUE); AfxGetApp()-&gt;EnableModeless(TRUE); // report success or not return nError; } </code></pre> <p>This is from my codebase - and I'm not making an effort to unravel it from my own libraries. But you should be able to "fill in the blanks".</p> <p>Good luck!</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload