菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
91
0

C++发送邮件代码

原创
05/13 14:22
阅读数 5245

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) 

 

首先,从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>

 

 

 

 

 

发表评论

0/200
91 点赞
0 评论
收藏