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支持的通訊協定有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
(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>