Как отправить письмо с помощью MAPI? - PullRequest
3 голосов
/ 17 октября 2011

Я хочу отправить электронное письмо с помощью почтового клиента на компьютере пользователя Windows.Насколько я могу судить по сети, MAPI - это путь.Однако, прочитав документацию MSDN, я обнаружил, что MAPI довольно обширный, без примеров исходного кода.И мне не нужны 99% функций, я просто хочу отправить электронное письмо.Как мне это сделать?

Я нашел здесь примеры в SO и в Интернете, но, похоже, они основаны на чем-то, называемом Simple MAPI, которое Microsoft, по-видимому, перечислило как устаревшее: «Использование Simple MAPIне рекомендуется. Это может быть изменено или недоступно в последующих версиях Windows ".Поэтому я не хочу использовать эти функции.

Я нашел очень хороший пример здесь , но, к сожалению, он предназначен для Windows CE и не полностью совместим с Win32 API.Мне удалось реализовать код по этой ссылке, пока он не попал туда, где он пытается открыть папку черновиков, параметры GetProps не совместимы.Кто-нибудь знает, где я могу найти подобный пример кода для ПК?C ++ предпочтительнее.

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Я решил это самостоятельно, с помощью различных интернет-источников.

Официальная документация MSDN

MAPIEx: расширенная оболочка MAPI

Как только код будет должным образом протестирован и задокументирован, я постараюсь опубликовать его здесь для дальнейшего использования.

0 голосов
/ 17 октября 2011

См. Отправка электронной почты с использованием MAPI - 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;
}
...