2010-10-06 65 views
1

我正在使用VS2008 & C + +我试图创建一个命令行程序发送电子邮件。
我看了一下,发现了一些示例程序,但没有人会为我编译。
有没有人有我的例子程序? 感谢命令行C++程序发送电子邮件

+0

你想发送什么样的电子邮件? IMAP?本地Exchange? POP3? – 2010-10-06 13:06:54

+0

我试图在邮件正文中发送简单的文本消息,我不想发送附件或类似的东西。我在一个交换电子邮件服务器的局域网上,所以我会用它来发送电子邮件。 – Rossini 2010-10-07 12:16:52

+1

@Steve Townsend:没有“种类”的电子邮件。电子邮件几乎总是通过SMTP发送。您列出的协议是*接收*电子邮件的方式。 – casablanca 2010-10-09 18:36:14

回答

2

此代码编译&运行我 - 找出正确的标题等。还有需要命令行操作,并使用MAPI库已过时,但后你想要什么免费的?从codeproject.com

#include "windows.h" 
#include "tchar.h" 

#include "mapi.h" 
#include "assert.h" 
#define ASSERT assert 
#define VERIFY assert 

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; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    SendMail("[email protected]_daddy.com","[email protected]","Test subject","New Message"); 
    return 0; 
} 
+0

这工作!不过,它确实提醒我允许程序发送电子邮件。我通过安装来解决这个问题点击是http://www.contextmagic.com/express-clickyes/由于我的程序将在内部PC上运行,所以安装此软件不会有问题。 – Rossini 2010-10-11 12:01:27

+0

是的 - 这是因为这是使用MAPI服务器在PC上发送邮件。有一些不使用MAPI的替代解决方案,所以您可以稍后查看 - – Jeff 2010-10-11 14:43:05

+0

@Jeff你知道为什么我在ASSERT(bFunctionsLoaded)行中得到“assert is not defined”吗? ? 谢谢 – CMS 2014-02-18 09:33:34

0

原始代码,因为你的服务器是兑换,你最方便的方法来编写程序的电子邮件将使用C#和System.Net.Mail作为证明here发送。这里是C++/CLI代码:

static void CreateTestMessage2(String^ server) 
    { 
     String^ to = L"[email protected]"; 
     String^ from = L"[email protected]"; 
     MailMessage^ message = gcnew MailMessage(from,to); 
     message->Subject = L"Using the new SMTP client."; 
     message->Body = L"Using this new feature, you can send an e-mail message from an application very easily."; 
     SmtpClient^ client = gcnew SmtpClient(server); 

     // Credentials are necessary if the server requires the client 
     // to authenticate before it will send e-mail on the client's behalf. 
     client->UseDefaultCredentials = true; 
     client->Send(message); 
     client->~SmtpClient(); 
    } 

如果你真的想用本地C++,那么你被卡住的原生API中的一个描述here(也就是不通过C++/CLI访问System.Net.Mail。) 。

但是,您可以使用MapiSend或blat,如here所述。

+0

我同意c#会更容易,但是我需要整合发送电子邮件与现有的C++命令行程序。 – Rossini 2010-10-11 12:01:09