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