0

[目的]

基本的なC++コンソールアプリケーションは、Outlook 2007(最小化された状態で実行されます)を介してHTMLメールを送信できる必要があります。添付ファイルは必要ありません。このメソッドはプレーンテキストで機能し、HTMLの要件に合うように変更できるかどうかはわかりません。どこかで、添付ファイルを参照して、それが本体になると読んだことがあります。次に何をすべきかわからない。提案?

[これまでに持っているもの]

BOOL SendMail(CHAR *lpszFrom, CHAR *lpszTo, CHAR *lpszSubject, CHAR *lpszMessage)
{
   BOOL bSent = FALSE;

   HINSTANCE hMAPI = ::LoadLibrary(_T("mapi32.dll"));
   if(0==hMAPI) return bSent;

   typedef ULONG (FAR PASCAL *PFN_MAPILogon)(ULONG,LPTSTR,LPTSTR,FLAGS,ULONG,LPLHANDLE);
   typedef ULONG (FAR PASCAL *PFN_MAPISendMail)(LHANDLE,ULONG,lpMapiMessage,FLAGS,ULONG);
   typedef ULONG (FAR PASCAL *PFN_MAPILogoff)(LHANDLE,ULONG,FLAGS,ULONG);

   PFN_MAPILogon MAPILogon = (PFN_MAPILogon)::GetProcAddress(hMAPI,"MAPILogon");
   PFN_MAPISendMail MAPISendMail = (PFN_MAPISendMail)::GetProcAddress(hMAPI,"MAPISendMail");
   PFN_MAPILogoff MAPILogoff = (PFN_MAPILogoff)::GetProcAddress(hMAPI,"MAPILogoff");

   const BOOL bFunctionsLoaded = (0!=MAPILogon)&&(0!=MAPISendMail)&&(0!=MAPILogoff);
   ASSERT(bFunctionsLoaded);

   if(bFunctionsLoaded)
   {

      LHANDLE session = 0;
      VERIFY(SUCCESS_SUCCESS==MAPILogon(0,0,0,MAPI_NEW_SESSION,0,&session));
      ASSERT(0!=session);

      MapiRecipDesc recipient;
      ::ZeroMemory(&recipient,sizeof(recipient));
      recipient.ulRecipClass = MAPI_TO;
      recipient.lpszName = lpszTo;

      MapiMessage message;
      ::ZeroMemory(&message,sizeof(message));
      message.lpszSubject = lpszSubject;
      message.lpszNoteText = lpszMessage;
      message.nRecipCount = 1;
      message.lpRecips = &recipient;

      bSent = SUCCESS_SUCCESS == MAPISendMail(session,0,&message,0,0);

      VERIFY(SUCCESS_SUCCESS==MAPILogoff(session,0,0,0));

   }

   ::FreeLibrary(hMAPI);

   return bSent;
}

によって呼び出されます...

SendMail("from","to","subject","body");
4

2 に答える 2

1

MAPIはHTMLメールには適していないようです。

http://support.microsoft.com/kb/268440

MFCを介してHTMLメールを送信しましたが、それはMAPIではありません。

于 2012-08-24T17:21:56.707 に答える
0

同じことを要求して送信していました-htmlファイルを添付すると、電子メールの本文でhtmlファイルが使用されることになります。

以下のコードはこのサイト(どこか)で見つかり、うまく機能しています。

コード

bool SendMail(HWND hWndParent, std::string strAttachmentFileName,  std::string strSubject,std::string& err)
{
    // The attachment must exist as a file on the system
    // or MAPISendMail will fail, so......
    if (strAttachmentFileName.empty())
        return false;

    // You may want to remove this check, but if a valid
    // HWND is passed in, the mail dialog will be made
    // modal to it's parent.
    //if (!hWndParent || !::IsWindow(hWndParent))
    //   return false;

    HINSTANCE hMAPI = ::LoadLibraryA("MAPI32.DLL");
    if (!hMAPI)
        return false;

    // Grab the exported entry point for the MAPISendMail function
    ULONG (PASCAL *SendMail)(ULONG, ULONG_PTR, 
            MapiMessage*, FLAGS, ULONG);
    (FARPROC&)SendMail = GetProcAddress(hMAPI, 
            "MAPISendMail");

    if (!SendMail)
        return false;

    //  TCHAR szFileName[_MAX_PATH];
    // TCHAR szPath[_MAX_PATH];
    // TCHAR szSubject[_MAX_PATH];
    // ::strcpy(&szFileName[0], strAttachmentFileName.c_str());
    // ::strcpy(&szPath[0], strAttachmentFileName.c_str());
    // ::strcpy(&szSubject[0], strSubject.c_str());

    MapiFileDesc fileDesc;
    ::ZeroMemory(&fileDesc, sizeof(fileDesc));
    fileDesc.nPosition = (ULONG)-1;
    fileDesc.lpszPathName = (char *)strAttachmentFileName.c_str();
    fileDesc.lpszFileName = (char *)strAttachmentFileName.c_str();

    MapiMessage message;
    ::ZeroMemory(&message, sizeof(message));
    message.lpszSubject = (char *)strSubject.c_str();//&szSubject[0];//szSubject;
    message.nFileCount = 1;
    message.lpFiles = &fileDesc;

    // Ok to send
    int nError = SendMail(0, (ULONG_PTR)hWndParent, 
            &message, MAPI_LOGON_UI|MAPI_DIALOG, 0);

    if (nError != SUCCESS_SUCCESS && 
            nError != MAPI_USER_ABORT && 
            nError != MAPI_E_LOGIN_FAILURE)
        err =  "error";
    return false;
    err="ok";
    return true;
}
于 2015-01-22T21:13:42.330 に答える