C++发送邮件实现
来源:互联网 发布:淘宝店免费货源怎么找 编辑:程序博客网 时间:2024/05/21 13:04
首先,别忘了要设置发送邮箱的smtp,例如,假设你需要用网易邮箱,你需要去你的163邮箱设置开启smtp(有的邮箱还需要设置授权码)。接着就可以用以下代码发送邮件了:
// SendMail.h#ifndef _SEND_MAIL_H_#define _SEND_MAIL_H_#include <windows.h>#include <stdio.h>#include <WinSock.h>#include <iostream>using namespace std;// 协议中加密部分使用的是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的实现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;}// 发送邮件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"); // 端口和服务器 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); // 连接邮件服务器,如果连接后没有响应,则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"); //此处要和发邮件的邮箱保持一致 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 准备开始发送邮件内容 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; // 发送邮件内容,\r\n.\r\n内容结束标记 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;}
测试例程:
// 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"; //此处是送达的邮箱, 需和EmailContents里的保持一致 SendMail(EmailTo, EmailContents.c_str()); return 0;}
阅读全文
2 0
- C#--中实现邮件发送
- C语言实现SMTP协议发送邮件
- .net中实现发送邮件(C#)
- Jamil+c#—实现邮件的发送
- c#.net发送邮件
- C#邮件发送类
- C#,WinForm发送邮件
- .NET 发送邮件(C#)
- C#smtp发送邮件
- C#.net发送邮件
- [C#] 发送邮件
- C#,WinForm发送邮件
- c语言发送邮件
- C语言发送邮件
- 实现邮件发送(delphi)
- JavaMail 实现邮件发送
- VC实现邮件发送
- javamail实现邮件发送
- flask-bootstrap使用
- File类
- 算法导论读书笔记(19)斐波那契堆
- BME- HBP- Neurorobotics- Knowledge memo
- 欢迎使用CSDN-markdown编辑器
- C++发送邮件实现
- python_字符串拼接四种方法
- this指针 静态成员 友元
- 王爽.汇编.第三版.检测点9.3.答案
- springboot之整合mybatis-annotation(注解方式)
- SuperMap iMobile for Android许可使用和问题解决
- s:checkbox 中对 后台传来的对象的 使用格式
- dg中遇到的12154
- 网络编程