如何使用MAPI发送邮件?

时间:2011-10-17 09:54:32

标签: c++ windows winapi email mapi

我想使用用户Windows计算机上的邮件客户端发送电子邮件。据我所知,MAPI是最佳选择。但是,在阅读完MSDN文档之后,我发现MAPI非常庞大,没有源代码示例。我不需要99%的功能,我只想发送电子邮件。我该怎么做?

我在SO和网络上找到了示例,但它们似乎依赖于名为Simple MAPI的东西,微软显然已将其列为过时:“不鼓励使用简单MAPI。它可能会被更改或不可用后续版本的Windows“。所以我不想使用这些功能。

我找到了一个非常好的示例here,但遗憾的是它适用于Windows CE,并且与Win32 API不完全兼容。我设法从该链接实现代码,直到它到达尝试打开草稿文件夹的位置,GetProps的参数不兼容。有谁知道我在哪里可以找到类似PC的代码示例? C ++首选。

2 个答案:

答案 0 :(得分:2)

我已经在各种互联网资源的帮助下解决了这个问题。

Official MSDN documentation

MAPIEx: Extended MAPI Wrapper

代码经过适当测试后,记录在案,我会尝试在此发布以供将来参考。

答案 1 :(得分: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;
}