2011-10-17 6 views
3

사용자의 Windows 컴퓨터에서 메일 클라이언트를 사용하여 전자 메일을 보내려고합니다. 내가 알 수있는 한, MAPI는 갈 길이 멀다. 그러나 MSDN 설명서를 읽은 후 MAPI는 소스 코드 예제없이 매우 방대하다는 것을 알게되었습니다. 99 %의 기능이 필요 없으며 전자 메일 만 보내고 싶습니다. 어떻게해야합니까?MAPI를 사용하여 메일을 보내는 방법은 무엇입니까?

나는 여기와 웹에서 예제를 찾았지만 단순 MAPI라고 불리는 것에 의존하고있는 것처럼 보였다. Simple MAPI는 Microsoft가 분명히 사용하지 않는 것으로 명시한 바 있습니다. "Simple MAPI 사용은 권장하지 않으며 변경되거나 사용 불가능할 수 있습니다 후속 버전의 Windows에서 ". 그래서 저는 그러한 기능을 사용하고 싶지 않습니다.

아주 좋은 예제는 here입니다.하지만 불행히도 Windows CE 용이며 Win32 API와 완벽하게 호환되지 않습니다. 초안 폴더를 열려고 할 때까지 해당 링크에서 코드를 구현했지만 GetProps의 매개 변수는 호환되지 않습니다. 누구든지 PC 용 비슷한 코드 예제를 어디에서 찾을 수 있는지 알고 있습니까? C++을 선호합니다.

+0

전체 MAPI는 Outlook 또는 다른 MAPI 클라이언트가 설치된 경우 Windows 컴퓨터에만 제공됩니다. Windows는 간단한 MAPI 만 제공됩니다. Outlook이 설치되어 있다는 것을 알고 있다면 Outlook의 API를 사용하여 이메일을 보내지 않는 이유는 무엇입니까? –

+0

아이디어는 그들이 가지고있는 MAPI 클라이언트를 사용하는 것입니다. 사람들이 특정 전자 메일 클라이언트를 사용하도록 강요하지는 않을 것입니다. 그러나 호기심에서 Outlook API는 정확히 무엇입니까? VBA인가요? – Lundin

+0

사람이 특정 전자 메일 클라이언트를 사용하도록 강요하고 싶지 않으면 단순한 mapi로 인해 어려움을 겪을 수 있습니다. 웹 메일을 사용하면 작동하지 않지만 대부분의 이메일 클라이언트는 간단한 MAPI를 지원합니다. Outlook의 api에 대한 정보는 http://msdn.microsoft.com/en-us/library/gg608200.aspx에서 확인하십시오. –

답변

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 : I 등 다양한 인터넷 소스의 도움으로, 내 자신에 의해이 문제를 해결 한

#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)는 엄청납니다. 불행히도, 귀하의 코드는 Simple MAPI를 사용하므로 더 이상 쓸모가 없을 수도 있습니다. – Lundin

관련 문제