您的位置:首页 > 编程语言 > C语言/C++

C++发送邮件代码

2014-02-17 19:57 267 查看

C++发送邮件和附件

http://wenku.baidu.com/view/69f20f747fd5360cba1adb5c.html
http://blog.csdn.net/ybjx111/article/details/7031055 http://download.csdn.net/download/okpfsje123/5304296      (Qt)

用C++发邮件

http://hi.baidu.com/sparkho/item/51f927cf7379300cc710b290 (libcurl)【整个 http://hi.baidu.com/sparkho/archive/tag/libcurl 都值得看一下】

{http://blog.csdn.net/jaylong35/article/details/7210291     (libcurl,其中sendMail这个函数的核心代码与上面的是差不多的)
http://www.cnblogs.com/FengYan/archive/2013/01/01/2840982.html}
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。

cURL支持的通讯协定有FTPFTPSHTTPHTTPSTFTPSFTPGopherSCPTelnetDICTFILELDAP、LDAPS、IMAPPOP3SMTPRTSP

http://baike.baidu.com/view/1326315.htm

C++ 发邮件(QQ邮箱)

首先,从QQ邮箱的帮助中心,我们可以了解一些基本信息:
1)QQ邮箱 POP3 和 SMTP 服务器地址设置如下:
pop.qq.com
smtp.qq.com(SMTP服务器需要身份验证)
如果是设置POP3和SMTP的SSL加密方式,则端口如下:
POP3服务器(端口995)
SMTP服务器(端口465或587)。

2)一封邮件能够发送给多少收件人?
可以将一封邮件最多发送给20个收件人。他们的电子邮件地址可以分布在“发给”、“抄送”和“密送”地址中。
呵呵,这点很重要:如果你的收件人超过20个,必遭QQ邮件服务器的拒绝--信件将发不出去,估计你还会傻乎乎的调试半天,以为是编程的问题...另外,多次测试后你才会知道:QQ邮箱服务器还有另一个不公开的限制,邮址列表(收件方)里面的QQ邮箱不能超过8个,否则信件也发不出去。此举,估计是想阻止某些恶意用户群发垃圾邮件吧,于是乎,要发邮件给8个以上的QQ用户,你就必须发2次或以上;呵呵,对于C++编程者来说,亦非难事,也就是多几行代码而已。

下文给出c++利用libcurl发邮件的一个简单范例,源于俺自己程序的简化...

1)我们可以把发件人的帐号和密码,放到一个txt文件里,然后通过下面的函数读出来:
int getsender(char * strUser,char * strSrv,char * strPass)
{
char sbuf[100],*token;
ifstream _sfile("D:\\SparkHo\\sender.txt"); //从sender.txt里读取发件人资料
if(!_sfile)
{
_sfile.close();
return -1;
}
_sfile.seekg(0, ios::beg);
_sfile.getline(sbuf,100); //读取第一行,如sparkho@qq.com
token = strtok(sbuf,"@");
strcpy(strUser, token);
token = strtok(NULL,"@");
strcpy(strSrv, token);
_sfile.getline(sbuf,100); //读取第二行,密码:如1234567890
strcpy(strPass, sbuf);
_sfile.close();
return 1;
}

2)回调函数,读取发件内容,供libcurl调用:
size_t read_data(void *ptr, size_t size, size_t nmemb, void *data)
{
FILE *fp = (FILE *)data;
size_t return_size = fread(ptr, size, nmemb, fp);
return return_size;
}

3)libcurl发邮件的主函数:
int curlMail()
{
char strUser[100],strPass[100],strSrv[100];
char ebuf[100],RevList[100];

getsender(strUser, strSrv, strPass); //从sender.txt里读取发件人资料
string strfrom = (string)strUser+"@"+(string)strSrv; //发送人邮址
string SrvAdd = "smtp://smtp."+(string)strSrv; //邮件服务器地址
FILE *fp = fopen("D:\\SparkHo\\etmp.txt", "rb"); //读取发件内容
if (fp == NULL) return -1;

// 初始化libcurl
CURL *curl;
CURLcode return_code,res;
return_code = curl_global_init(CURL_GLOBAL_WIN32);  //CURL_GLOBAL_WIN32只用于Windows平台下,告诉libcurl初始化winsock库。详见Here
if (CURLE_OK != return_code) return -1;

struct curl_slist *slist=NULL;
ifstream _efile("D:\\SparkHo\\email.txt"); //读取收件人email地址的列表
if(!_efile)
{
_efile.close();
}
else
{
while(_efile.getline(ebuf,100))
{
sprintf(RevList,"<%s>",ebuf);
slist = curl_slist_append(slist, RevList); //邮件接收列表
}
_efile.close();
}
curl = curl_easy_init();
if(curl)
{
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_HEADER, 1L);
curl_easy_setopt(curl, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL); //无此句QQ邮箱没问题,但其他邮箱可能被系统认为垃圾邮件而退信
curl_easy_setopt(curl, CURLOPT_URL, SrvAdd.c_str()); //邮件服务器地址
curl_easy_setopt(curl, CURLOPT_MAIL_FROM, strfrom.c_str()); //发送人邮址
curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, slist); //收件人列表
curl_easy_setopt(curl, CURLOPT_USERNAME, strUser); //用户帐号
curl_easy_setopt(curl, CURLOPT_PASSWORD, strPass); //用户密码
curl_easy_setopt(curl, CURLOPT_READDATA, fp);
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data); //回调函数,用于读发送内容
}
res = curl_easy_perform(curl);
fclose(fp);
curl_slist_free_all(slist);
curl_easy_cleanup(curl);
curl_global_cleanup();
return 1;
}

4)附件:

发件人信息,二行,存放于sender.txt:
sparkho@qq.com
1234567890

收件邮址列表,多行,存放于email.txt:
sparkho@msn.com
sparkho@qq.com
sparkho@139.com

信件正文,存放于etmp.txt:
From: <sparkho@qq.com>
To: <群友>
Content-Type: text/html
Subject: 600141 周五的预警 复盘测试1
<DIV>巅峰飞越--预警通知,由sparkho.dll自动发送...</DIV>
<DIV>08/27/11 08:14:03</DIV>
<DIV><IMG src="http://image.sinajs.cn/newchart/min/n/sh600141.gif"></DIV>
<DIV><IMG src="http://image.sinajs.cn/newchart/daily/n/sh600141.gif"></DIV>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: