libcurl 发送邮件_libcurl发送邮件C++类 (转)

/*

* File:   CSendMail.cpp

* Author: root

*

* Created on January 16, 2012, 6:14 PM

*/

#include "CSendMail.h"

CSendMail::CSendMail()

{

m_strUser = "";

m_strPsw = "";

m_strSmtpServer = "";

m_iPort = -1;

m_RecipientList.clear();

m_strMailFrom = "";

m_MailContent.clear();

m_iMailContentPos = 0;

}

CSendMail::CSendMail(  //create sendmail object with paremeter;

const std::string & strUser,

const std::string & strPsw,

const std::string & strSmtpServer,

int iPort,

const std::string & strMailFrom

)

{

m_strUser = strUser;

m_strPsw = strPsw;

m_strSmtpServer = strSmtpServer;

m_iPort = iPort;

m_RecipientList.clear();

m_strMailFrom = strMailFrom;

m_MailContent.clear();

m_iMailContentPos = 0;

}

CSendMail::CSendMail(const CSendMail& orig) {

}

CSendMail::~CSendMail() {

}

size_t CSendMail::read_callback(void* ptr, size_t size, size_t nmemb, void* userp)

{

CSendMail * pSm = (CSendMail *)userp;

if(size*nmemb 

return 0;

if(pSm->m_iMailContentPos m_MailContent.size())

{

size_t len;

len = pSm->m_MailContent[pSm->m_iMailContentPos].length();

memcpy(ptr, pSm->m_MailContent[pSm->m_iMailContentPos].c_str(), pSm->m_MailContent[pSm->m_iMailContentPos].length());

pSm->m_iMailContentPos++; /* advance pointer */

return len;

}

return 0;

}

struct timeval CSendMail::tvnow()

{

/*

** time() returns the value of time in seconds since the Epoch.

*/

struct timeval now;

now.tv_sec = (long)time(NULL);

now.tv_usec = 0;

return now;

}

long CSendMail::tvdiff(timeval newer, timeval older)

{

return (newer.tv_sec-older.tv_sec)*1000+

(newer.tv_usec-older.tv_usec)/1000;

}

bool CSendMail::ConstructHead(const std::string & strSubject, const std::string & strContent)

{

m_MailContent.push_back("MIME-Versioin: 1.0\n");

std::string strTemp = "To: ";

for(std::list<:string>::iterator it = m_RecipientList.begin(); it != m_RecipientList.end();)

{

strTemp += *it;

it++;

if(it != m_RecipientList.end())

strTemp += ",";

}

strTemp += "\n";

m_MailContent.push_back(strTemp);

if(strSubject != "")

{

strTemp = "Subject: ";

strTemp += strSubject;

strTemp += "\n";

m_MailContent.push_back(strTemp);

}

m_MailContent.push_back("Content-Transfer-Encoding: 8bit\n");

m_MailContent.push_back("Content-Type: text/html; \n Charset=\"UTF-8\"\n\n");

if(strContent != "")

{

m_MailContent.push_back(strContent);

}

return true;

}

bool CSendMail::SendMail(const std::string& strSubject, const std::string& strMailBody)

{

m_MailContent.clear();

m_iMailContentPos = 0;

ConstructHead(strSubject, strMailBody);

bool bRet = true;

CURL *curl;

CURLM *mcurl;

int still_running = 1;

struct timeval mp_start;

char mp_timedout = 0;

struct curl_slist* rcpt_list = NULL;

curl_global_init(CURL_GLOBAL_DEFAULT);

curl = curl_easy_init();

if (!curl)

{

printf("Init curl failed!\n");

return false;

}

mcurl = curl_multi_init();

if (!mcurl)

{

printf("Init mcurl failed!\n");

return false;

}

for(std::list<:string>::iterator it = m_RecipientList.begin(); it != m_RecipientList.end();it++)

{

rcpt_list = curl_slist_append(rcpt_list, it->c_str());

}

if(m_strSmtpServer == "" || m_iPort <= 0)

{

printf("smtp server couldn't be empty, or port must be large than 0!\n");

curl_slist_free_all(rcpt_list);

curl_multi_cleanup(mcurl);

curl_easy_cleanup(curl);

curl_global_cleanup();

return false;

}

std::string strUrl = "smtp://" + m_strSmtpServer;

strUrl += ":";

char cPort[10];

memset(cPort, 0, 10);

sprintf(cPort, "%d", m_iPort);

strUrl += cPort;

curl_easy_setopt(curl, CURLOPT_URL, strUrl.c_str());

if(m_strUser != "")

{

curl_easy_setopt(curl, CURLOPT_USERNAME, m_strUser.c_str());

}

if(m_strPsw != "")

{

curl_easy_setopt(curl, CURLOPT_PASSWORD, m_strPsw.c_str());

}

curl_easy_setopt(curl, CURLOPT_READFUNCTION, &CSendMail::read_callback);

if(m_strMailFrom == "")

{

printf("Mail from address couldn't be empty!\n");

curl_slist_free_all(rcpt_list);

curl_multi_cleanup(mcurl);

curl_easy_cleanup(curl);

curl_global_cleanup();

return false;

}

curl_easy_setopt(curl, CURLOPT_MAIL_FROM, m_strMailFrom.c_str());

curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt_list);

curl_easy_setopt(curl, CURLOPT_USE_SSL, (long) CURLUSESSL_ALL);

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);

curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);

curl_easy_setopt(curl, CURLOPT_READDATA, this);

curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

curl_easy_setopt(curl, CURLOPT_SSLVERSION, 0L);

curl_easy_setopt(curl, CURLOPT_SSL_SESSIONID_CACHE, 0L);

curl_multi_add_handle(mcurl, curl);

mp_timedout = 0;

mp_start = tvnow();

/* we start some action by calling perform right away */

curl_multi_perform(mcurl, &still_running);

while (still_running) {

struct timeval timeout;

int rc; /* select() return code */

fd_set fdread;

fd_set fdwrite;

fd_set fdexcep;

int maxfd = -1;

long curl_timeo = -1;

FD_ZERO(&fdread);

FD_ZERO(&fdwrite);

FD_ZERO(&fdexcep);

/* set a suitable timeout to play around with */

timeout.tv_sec = 1;

timeout.tv_usec = 0;

curl_multi_timeout(mcurl, &curl_timeo);

if (curl_timeo >= 0) {

timeout.tv_sec = curl_timeo / 1000;

if (timeout.tv_sec > 1)

timeout.tv_sec = 1;

else

timeout.tv_usec = (curl_timeo % 1000) * 1000;

}

/* get file descriptors from the transfers */

curl_multi_fdset(mcurl, &fdread, &fdwrite, &fdexcep, &maxfd);

/* In a real-world program you OF COURSE check the return code of the

function calls.  On success, the value of maxfd is guaranteed to be

greater or equal than -1.  We call select(maxfd + 1, ...), specially in

case of (maxfd == -1), we call select(0, ...), which is basically equal

to sleep. */

rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);

if (tvdiff(tvnow(), mp_start) > MULTI_PERFORM_HANG_TIMEOUT) {

fprintf(stderr, "ABORTING TEST, since it seems "

"that it would have run forever.\n");

bRet = false;

break;

}

switch (rc) {

case -1:

/* select error */

printf("select error\n");

bRet = false;

break;

case 0: /* timeout */

printf("time out, retry again!\n");

curl_multi_perform(mcurl, &still_running);

break;

default: /* action */

curl_multi_perform(mcurl, &still_running);

break;

}

}

curl_multi_remove_handle(mcurl, curl);

curl_slist_free_all(rcpt_list);

curl_multi_cleanup(mcurl);

curl_easy_cleanup(curl);

curl_global_cleanup();

return bRet;

}

bool CSendMail::SendMail(const std::string & strSubject, const char* pMailBody, int len)

{

std::string strMailContent;

strMailContent.append(pMailBody, len);

return SendMail(strSubject, strMailContent);

}

bool CSendMail::SendMail(const std::string& strUser, const std::string& strPsw, const std::string& strSmtpServer, int iPort, std::list<:string>& recipientList, const std::string& strMailFrom, const std::string& strSubject, const std::string& strMailBody)

{

m_strUser = strUser;

m_strPsw = strPsw;

m_strSmtpServer = strSmtpServer;

m_iPort = iPort;

std::copy(recipientList.begin(), recipientList.end(), m_RecipientList.begin());

m_strMailFrom = strMailFrom;

return SendMail(strSubject, strMailBody);

}

bool CSendMail::SendMail(const std::string& strUser, const std::string& strPsw, const std::string& strSmtpServer, int iPort, std::list<:string>& recipientList, const std::string& strMailFrom, const std::string& strSubject, const char* pMailBody, int len)

{

std::string strMailContent;

strMailContent.append(pMailBody, len);

return SendMail(strUser, strPsw, strSmtpServer, iPort, recipientList, strMailFrom, strSubject, strMailContent);

}

bool CSendMail::SendMail(const std::string& strUser, const std::string& strPsw, const std::string& strSmtpServer, int iPort, const std::string& strMailTo, const std::string& strMailFrom, const std::string& strSubject, const std::string& strMailBody)

{

std::list<:string> recipientList;

recipientList.push_back(strMailTo);

return SendMail(strUser, strPsw, strSmtpServer, iPort, recipientList, strMailFrom, strSubject, strMailBody);

}

bool CSendMail::SendMail(const std::string& strUser, const std::string& strPsw, const std::string& strSmtpServer, int iPort, const std::string& strMailTo, const std::string& strMailFrom, const std::string& strSubject, const char* pMailBody, int len)

{

std::string strMailContent;

strMailContent.append(pMailBody, len);

return SendMail(strUser, strPsw, strSmtpServer, iPort, strMailTo, strMailFrom, strSubject, strMailContent);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"C 发送邮件 QQ" 是指使用 C 语言编写程序来实现通过 QQ 邮箱发送邮件的功能。以下是一个简单的解释: QQ 邮箱是腾讯公司提供的一种电子邮件服务。要通过 C 语言发送 QQ 邮件,需要使用一些相关的库和协议来进行邮件发送和接收操作。 C 语言本身并不直接支持邮件发送功能,但可以利用第三方库来实现。一个常用的库是 libcurl,它是一个强大且广泛使用的网络传输库,可以用来发送 HTTP 请求。在 C 语言中,可以使用 libcurl 提供的接口来发送 HTTP 请求来执行发送邮件的操作。 首先,需要在 C 代码中包含 libcurl 的头文件,并链接对应的库文件。然后,通过初始化 libcurl 的函数来创建一个会话,设置相应的选项,如收件人、发件人、主题、正文内容等。接下来,使用 libcurl 提供的函数发送 HTTP POST 请求,将邮件内容以及相关的身份验证参数传递给 QQ 邮箱的服务器地址。最后,根据 QQ 邮箱服务器的响应,判断邮件发送是否成功,并进行相应的处理。 需要注意的是,发送邮箱是一个涉及到网络传输和身份验证的操作,需要保证网络连接的稳定性、合法的身份验证信息以及可信的邮件内容,以避免被视为垃圾邮件或滥用邮件发送功能。 综上所述,通过使用 C 语言编写包含 libcurl 库的程序,可以实现通过 QQ 邮箱发送邮件的功能。但这只是一个简单的示例,实际开发中需要考虑更多的细节和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值