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