2011-10-17 39 views
3

我想使用用戶的Windows計算機上的郵件客戶端發送電子郵件。據我可以從網絡上看出,MAPI是一條路。但是,在閱讀MSDN文檔後,我發現MAPI相當龐大,沒有源代碼示例。我不需要99%的功能,我只想發送電子郵件。我該怎麼做呢?如何使用MAPI發送郵件?

我在這裏發現了一些關於SO和網絡的例子,但它們似乎依賴於稱爲簡單MAPI的東西,微軟顯然列爲過時的東西:「簡單MAPI的使用是不鼓勵的,它可能被改變或不可用在Windows的後續版本中「。所以我不想使用這些功能。

我找到了一個很好的例子here,但不幸的是它是用於Windows CE並且與Win32 API不完全兼容。我設法實現了該鏈接中的代碼,直到它試圖打開草稿文件夾時,GetProps的參數不兼容。有誰知道我在哪裏可以找到類似的PC代碼示例? C++首選。

+0

如果您安裝了Outlook或其他MAPI客戶端,則僅在Windows計算機上存在完整的MAPI。 Windows只帶有簡單的MAPI。如果您知道您已安裝Outlook,爲何不使用Outlook的API發送電子郵件? –

+0

這個想法是使用他們擁有的任何MAPI客戶端,我寧願不強迫人們使用特定的電子郵件客戶端。但出於好奇,Outlook API究竟是什麼?是VBA還是其他? – Lundin

+0

如果你不想強迫某人使用特定的電子郵件客戶端,那麼你可能會被簡單的mapi所困住。如果他們使用網絡郵件,它將無法工作,但大多數電子郵件客戶端都支持簡單的MAPI。點擊此處查看:http://msdn.microsoft.com/en-us/library/gg608200.aspx瞭解outlook的apis信息。 –

回答

2

我有我自己解決了這個,從各種網絡資源的幫助。

Official MSDN documentation

MAPIEx: Extended MAPI Wrapper

一旦代碼被很好的測試&記錄,我會嘗試張貼在這裏以供將來參考。

+1

您是否曾經測試過代碼?你可以發佈嗎? – DougN

+0

@DougN是的,我現在已經在生產代碼中運行它了。不幸的是,它現在是公司財產,所以我不能整體分享它。此外,它是爲特定應用程序定製的,所以我不確定它會給其他人帶來什麼價值。不過,如果有人爲此付出努力,我很樂意提供片段和提示。儘管如此,我仍然只是一名新手,因爲我通常使用嵌入式系統,遠離MAPI :) – Lundin

0

Sending Email using MAPI - A COM DLL

[編輯]

我使用MAPI一次,我會後的代碼。我不確定這是你在找什麼。這會發送帶有可選附加文件的消息(但不包含主體)。

頁眉:

#pragma once 

class MailSender 
{ 
public: 
    MailSender(); 
    ~MailSender(); 

    void AddFile(LPCTSTR path, LPCTSTR name = NULL); 
    bool Send(HWND hWndParent, LPCTSTR szSubject = NULL); 

private: 
    struct attachment { tstring path, name; }; 
    vector<attachment> m_Files; 
    HMODULE m_hLib; 
}; 

.cpp的:

#include "stdafx.h" 
#include "MySendMail.h" 
#include <mapi.h> 

MailSender::MailSender() 
{ 
    m_hLib = LoadLibrary(_T("MAPI32.DLL")); 
} 

MailSender::~MailSender() 
{ 
    FreeLibrary(m_hLib); 
} 

void MailSender::AddFile(LPCTSTR file, LPCTSTR name) 
{ 
    attachment a; 
    a.path = file; 
    if (!name) 
     a.name = PathFindFileName(file); 
    else 
     a.name = name; 
    m_Files.push_back(a); 
} 

bool MailSender::Send(HWND hWndParent, LPCTSTR szSubject) 
{ 
    if (!m_hLib) 
     return false; 

    LPMAPISENDMAIL SendMail; 
    SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, _T("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 = (LPTSTR) ii->path.c_str(); 
     fileDesc.lpszFileName = (LPTSTR) ii->name.c_str(); 
     filedesc.push_back(fileDesc); 
    } 

    tstring subject; 
    if (szSubject) 
     subject = szSubject; 
    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 = (LPTSTR) 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; 
} 
+0

我發現我連接了幾次。這樣的鏈接就是爲什麼我寫了簡單的MAPI無法使用的原因。 – Lundin

+0

簡單MAPI和完整MAPI有什麼區別? – sashoalm

+0

我是這方面的初學者,但據我所知,[簡單MAPI](http://msdn.microsoft.com/en-us/library/windows/desktop/dd296734%28v=vs.85% 29.aspx)很簡單,[擴展MAPI](http://msdn.microsoft.com/en-us/library/cc842378.aspx)是巨大的。不幸的是,你的代碼使用簡單的MAPI,因此它可能已經過時。 – Lundin