C++發(fā)送郵件實現(xiàn)代碼
本文實例為大家分享了C++發(fā)送郵件的具體代碼,供大家參考,具體內(nèi)容如下
首先,別忘了要設(shè)置發(fā)送郵箱的smtp,例如,假設(shè)你需要用網(wǎng)易郵箱,你需要去你的163郵箱設(shè)置開啟smtp(有的郵箱還需要設(shè)置授權(quán)碼)。接著就可以用以下代碼發(fā)送郵件了:
// SendMail.h #ifndef _SEND_MAIL_H_ #define _SEND_MAIL_H_ #include <windows.h> #include <stdio.h> #include <WinSock.h> #include <iostream> using namespace std; // 協(xié)議中加密部分使用的是base64方法 char ConvertToBase64(char c6); void EncodeBase64(char *dbuf, char *buf128, int len); void SendMail(char *email, const char *body); int OpenSocket(struct sockaddr *addr); #endif
// SendMail.cpp #include "SendMail.h" #pragma comment(lib, "ws2_32.lib") struct Base64Date6 { unsigned int d4 : 6; unsigned int d3 : 6; unsigned int d2 : 6; unsigned int d1 : 6; }; char ConvertToBase64(char uc) { if (uc < 26) { return 'A' + uc; } if (uc < 52) { return 'a' + (uc - 26); } if (uc < 62) { return '0' + (uc - 52); } if (uc == 62) { return '+'; } return '/'; } // base64的實現(xiàn) void EncodeBase64(char *dbuf, char *buf128, int len) { struct Base64Date6 *ddd = NULL; int i = 0; char buf[256] = { 0 }; char *tmp = NULL; char cc = '\0'; memset(buf, 0, 256); strcpy_s(buf, 256, buf128); for (i = 1; i <= len / 3; i++) { tmp = buf + (i - 1) * 3; cc = tmp[2]; tmp[2] = tmp[0]; tmp[0] = cc; ddd = (struct Base64Date6 *)tmp; dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3); dbuf[(i - 1) * 4 + 3] = ConvertToBase64((unsigned int)ddd->d4); } if (len % 3 == 1) { tmp = buf + (i - 1) * 3; cc = tmp[2]; tmp[2] = tmp[0]; tmp[0] = cc; ddd = (struct Base64Date6 *)tmp; dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); dbuf[(i - 1) * 4 + 2] = '='; dbuf[(i - 1) * 4 + 3] = '='; } if (len % 3 == 2) { tmp = buf + (i - 1) * 3; cc = tmp[2]; tmp[2] = tmp[0]; tmp[0] = cc; ddd = (struct Base64Date6 *)tmp; dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3); dbuf[(i - 1) * 4 + 3] = '='; } return; } // 發(fā)送郵件 void SendMail(char *email, const char *body) { int sockfd = { 0 }; char buf[1500] = { 0 }; char rbuf[1500] = { 0 }; char login[128] = { 0 }; char pass[128] = { 0 }; WSADATA WSAData; struct sockaddr_in their_addr = { 0 }; WSAStartup(MAKEWORD(2, 2), &WSAData); memset(&their_addr, 0, sizeof(their_addr)); their_addr.sin_family = AF_INET; their_addr.sin_port = htons(25); // 一般是25端口不需要改 hostent* hptr = gethostbyname("smtp.126.com"); // 端口和服務(wù)器 memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length); printf("IP of smpt.163.com is : %d:%d:%d:%d\n", their_addr.sin_addr.S_un.S_un_b.s_b1, their_addr.sin_addr.S_un.S_un_b.s_b2, their_addr.sin_addr.S_un.S_un_b.s_b3, their_addr.sin_addr.S_un.S_un_b.s_b4); // 連接郵件服務(wù)器,如果連接后沒有響應(yīng),則2 秒后重新連接 sockfd = OpenSocket((struct sockaddr *)&their_addr); memset(rbuf, 0, 1500); while (recv(sockfd, rbuf, 1500, 0) == 0) { cout << "reconnect..." << endl; Sleep(2); sockfd = OpenSocket((struct sockaddr *)&their_addr); memset(rbuf, 0, 1500); } cout << rbuf << endl; // EHLO memset(buf, 0, 1500); sprintf_s(buf, 1500, "EHLO HYL-PC\r\n"); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "EHLO REceive: " << rbuf << endl; // AUTH LOGIN memset(buf, 0, 1500); sprintf_s(buf, 1500, "AUTH LOGIN\r\n"); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Auth Login Receive: " << rbuf << endl; // USER memset(buf, 0, 1500); sprintf_s(buf, 1500, "xxxxxx@126.com");//你的郵箱賬號 memset(login, 0, 128); EncodeBase64(login, buf, strlen(buf)); sprintf_s(buf, 1500, "%s\r\n", login); send(sockfd, buf, strlen(buf), 0); cout << "Base64 UserName: " << buf << endl; memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "User Login Receive: " << rbuf << endl; // PASSWORD sprintf_s(buf, 1500, "********");//你的郵箱密碼 memset(pass, 0, 128); EncodeBase64(pass, buf, strlen(buf)); sprintf_s(buf, 1500, "%s\r\n", pass); send(sockfd, buf, strlen(buf), 0); cout << "Base64 Password: " << buf << endl; memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Send Password Receive: " << rbuf << endl; // MAIL FROM memset(buf, 0, 1500); sprintf_s(buf, 1500, "MAIL FROM: <xxxx@126.com>\r\n"); //此處要和發(fā)郵件的郵箱保持一致 send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "set Mail From Receive: " << rbuf << endl; // RCPT TO 第一個收件人 sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Tell Sendto Receive: " << rbuf << endl; // DATA 準(zhǔn)備開始發(fā)送郵件內(nèi)容 sprintf_s(buf, 1500, "DATA\r\n"); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Send Mail Prepare Receive: " << rbuf << endl; // 發(fā)送郵件內(nèi)容,\r\n.\r\n內(nèi)容結(jié)束標(biāo)記 sprintf_s(buf, 1500, "%s\r\n.\r\n", body); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Send Mail Receive: " << rbuf << endl; // QUIT sprintf_s(buf, 1500, "QUIT\r\n"); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); cout << "Quit Receive: " << rbuf << endl; //清理工作 closesocket(sockfd); WSACleanup(); return; } // 打開TCP Socket連接 int OpenSocket(struct sockaddr *addr) { int sockfd = 0; sockfd = socket(PF_INET, SOCK_STREAM, 0); if (sockfd < 0) { cout << "Open sockfd(TCP) error!" << endl; exit(-1); } if (connect(sockfd, addr, sizeof(struct sockaddr)) < 0) { cout << "Connect sockfd(TCP) error!" << endl; exit(-1); } return sockfd; }
測試?yán)蹋?/p>
// SendMailTest.cpp #include "SendMail.h" int main() { int num = 100; string EmailContents = "From: \"lucy\"<xxxx@126.com>\r\n" + string("To: \"dasiy\"<yyyy@126.com>\r\n") + "Subject: Hello\r\n\r\n" + "test sending variable" + to_string(num) + "\n"; char EmailTo[] = "yyyy@126.com"; //此處是送達(dá)的郵箱, 需和EmailContents里的保持一致 SendMail(EmailTo, EmailContents.c_str()); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
欄 目:C語言
下一篇:C++根據(jù)傳入的函數(shù)指針來解析需要的參數(shù)(推薦)
本文標(biāo)題:C++發(fā)送郵件實現(xiàn)代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/788.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?