嗨,大家好發送電子郵件,代碼爲C++
我知道有外部庫有像jwsmtp和vmime或POCO,幫助您在C發送電子郵件++。但是,我無法配置它們並鏈接它們。因此,我想知道是否有人通過我的gmail帳戶擁有用C++(windows 7 os)發送電子郵件的源代碼。
嗨,大家好發送電子郵件,代碼爲C++
我知道有外部庫有像jwsmtp和vmime或POCO,幫助您在C發送電子郵件++。但是,我無法配置它們並鏈接它們。因此,我想知道是否有人通過我的gmail帳戶擁有用C++(windows 7 os)發送電子郵件的源代碼。
如果您確實想要這麼做,您必須使用TLS庫(如OpenSSL或Windows Schannel API)與服務器建立TLS連接。這樣做的一個例子可以在這裏找到:http://www.coastrd.com/c-schannel-smtp
但是,我認爲這將是更容易得到這些外部庫的工作。
我一直有與波科建立運氣。唯一的技巧是首先你必須構建OpenSSL並將Poco構建腳本更改爲它的位置。
如果對任何人都有用,下面是一些C++代碼,它們基本上在Microsoft Windows上製作了帶有附件,主題和正文文本的電子郵件消息。它啓動默認的EMail(MAPI)客戶端,其中添加了附件並填充了其他屬性。它不直接與SMTP服務器交互。我在我們的產品中使用它來讓用戶向我發送調試跟蹤信息,而不是。
如果您想使用下面的代碼,您需要替換ptiString和ptiStringArray,這些只是用於管理字符串和字符串數組的內部類。 TObjList只是一個類容器管理模板。給出一系列的結果。
希望這有助於...
的.H
//---------------------------------------------------------------------------
// Only for Microsoft Windows
// uses Mapi32.dll
// uses MAPI to launch the EMail client, add attachments and message body
// to whatever client is in use. It doesn't seem to work with Windows Live Mail
// see this link: http://msdn.microsoft.com/en-us/library/windows/desktop/dd296721(v=vs.85).aspx
// and be aware of UAC crap-o-la:
// http://social.msdn.microsoft.com/Forums/office/en-US/63e9f5b2-f5f2-4cf8-bdc2-ca1fad88ebe5/problem-with-outlook-and-mapisendmail-returns-mapiefailure-when-outlook-is-running
//
#ifndef emailsenderH
#define emailsenderH
#include <windows.h>
#include <mapi.h>
#include "ptiString/ptiStringArray.h"
#include "ptiString/TObjList.h"
//---------------------------------------------------------------------------
class EMailSender
{
private:
HWND m_hLib;
ptiString Subject;
ptiStringArray Body;
TObjList<MapiFileDesc> Attachments;
// don't copy this.
EMailSender(const EMailSender &rhs);
EMailSender &operator =(const EMailSender &rhs);
public:
EMailSender();
~EMailSender();
void AddAttachment(ptiString &filename);
void AddAttachments(ptiStringArray &filename);
void SetMessage(const ptiStringArray &);
void SetMessage(const wchar_t *);
void SetSubject(const ptiString &subj);
void SetSubject(const wchar_t *subj);
bool isEMailSupported();
bool Send(HWND hWndParent);
};
#endif
在.cpp
#include "emailsender.h"
//---------------------------------------------------------------------------
EMailSender::EMailSender():m_hLib(0)
{
m_hLib = LoadLibrary("mapi32.dll");
}
EMailSender::~EMailSender()
{
if(m_hLib)
FreeLibrary(m_hLib);
}
bool EMailSender::isEMailSupported()
{
if(m_hLib)
return(true);
return(false);
}
void EMailSender::AddAttachment(ptiString &filename)
{
MapiFileDesc *pFile = Attachments.Add();
ZeroMemory(pFile, sizeof(MapiFileDesc));
pFile->nPosition = (unsigned long)-1;
char *fname = const_cast<char *>(filename.toUTF8());
// convert filename to full path filename
long length = MAX_PATH;
char *Buffer = new char[length];
int retval = GetFullPathName(fname, length, Buffer, 0);
if(length && length>retval)
{
filename = Buffer;
fname = const_cast<char *>(filename.toUTF8());
pFile->lpszPathName = fname;
}
delete [] Buffer;
}
void EMailSender::SetSubject(const wchar_t *subj)
{
Subject = subj;
}
void EMailSender::SetSubject(const ptiString &subj)
{
Subject = subj;
}
void EMailSender::SetMessage(const wchar_t *msg)
{
Body = msg;
}
void EMailSender::SetMessage(const ptiStringArray &msg)
{
Body = msg;
}
void EMailSender::AddAttachments(ptiStringArray &filename)
{
for(int i=0; i<filename.Count(); i++)
AddAttachment(filename[i]);
}
bool EMailSender::Send(HWND hWndParent)
{
if (!m_hLib)
return false;
LPMAPISENDMAIL SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, "MAPISendMail");
if (!SendMail)
return false;
MapiMessage message;
ZeroMemory(&message, sizeof(MapiMessage));
message.lpszSubject = (LPSTR) Subject.toUTF8();
MapiFileDesc *pFile = 0;
int fcnt = Attachments.Count();
message.nFileCount = fcnt;
if(fcnt)
{
pFile = new MapiFileDesc[fcnt];
for(int i=0; i<fcnt; i++)
memcpy(&pFile[i], Attachments[i], sizeof(MapiFileDesc));
message.lpFiles = pFile;
}
ptiString note(Body.GetText());
char *cnote = const_cast<char *>(note.toUTF8());
message.lpszNoteText = cnote;
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;
if(pFile)
delete [] pFile;
return true;
}