效果图
main.cpp
1 #include <iostream> 2 #include "SendMail.h" 3 #include <string> 4 using namespace std; 5 6 int main() 7 { 8 char EmailContents[255]="From: \"名字\"<xxxxxxx@163.com>\r\nTo:"; 9 char EmailTo[50]; 10 char subject[50]; 11 char content[50]; 12 printf("要发送的邮箱账号:"); 13 scanf("%s",EmailTo); 14 printf("你的标题:"); 15 scanf("%s",subject); 16 printf("你的内容:"); 17 scanf("%s",content); 18 19 strcat(EmailContents,EmailTo); 20 strcat(EmailContents,"\n"); 21 strcat(EmailContents, "subject:"); 22 strcat(EmailContents, subject); 23 strcat(EmailContents, "\r\n\r\n"); 24 strcat(EmailContents, content); 25 strcat(EmailContents, "\r\n.\r\n\0"); 26 SendMail(EmailTo, EmailContents); 27 return 0; 28 }
SendMail.cpp
1 #include "SendMail.h" 2 3 #pragma comment(lib, "ws2_32.lib") 4 #include <string.h> 5 struct Base64Date6 6 { 7 unsigned int d4 : 6; 8 unsigned int d3 : 6; 9 unsigned int d2 : 6; 10 unsigned int d1 : 6; 11 }; 12 13 char ConvertToBase64(char uc) 14 { 15 if (uc < 26) 16 { 17 return 'A' + uc; 18 } 19 if (uc < 52) 20 { 21 return 'a' + (uc - 26); 22 } 23 if (uc < 62) 24 { 25 return '0' + (uc - 52); 26 } 27 if (uc == 62) 28 { 29 return '+'; 30 } 31 return '/'; 32 } 33 34 // base64的实现 35 void EncodeBase64(char *dbuf, char *buf128, int len) 36 { 37 struct Base64Date6 *ddd = NULL; 38 int i = 0; 39 char buf[256] = { 0 }; 40 char *tmp = NULL; 41 char cc = '\0'; 42 43 memset(buf, 0, 256); 44 strcpy(buf,buf128); 45 for (i = 1; i <= len / 3; i++) 46 { 47 tmp = buf + (i - 1) * 3; 48 cc = tmp[2]; 49 tmp[2] = tmp[0]; 50 tmp[0] = cc; 51 ddd = (struct Base64Date6 *)tmp; 52 dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); 53 dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); 54 dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3); 55 dbuf[(i - 1) * 4 + 3] = ConvertToBase64((unsigned int)ddd->d4); 56 } 57 if (len % 3 == 1) 58 { 59 tmp = buf + (i - 1) * 3; 60 cc = tmp[2]; 61 tmp[2] = tmp[0]; 62 tmp[0] = cc; 63 ddd = (struct Base64Date6 *)tmp; 64 dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); 65 dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); 66 dbuf[(i - 1) * 4 + 2] = '='; 67 dbuf[(i - 1) * 4 + 3] = '='; 68 } 69 if (len % 3 == 2) 70 { 71 tmp = buf + (i - 1) * 3; 72 cc = tmp[2]; 73 tmp[2] = tmp[0]; 74 tmp[0] = cc; 75 ddd = (struct Base64Date6 *)tmp; 76 dbuf[(i - 1) * 4 + 0] = ConvertToBase64((unsigned int)ddd->d1); 77 dbuf[(i - 1) * 4 + 1] = ConvertToBase64((unsigned int)ddd->d2); 78 dbuf[(i - 1) * 4 + 2] = ConvertToBase64((unsigned int)ddd->d3); 79 dbuf[(i - 1) * 4 + 3] = '='; 80 } 81 return; 82 } 83 // 发送邮件 84 void SendMail(char *email, const char *body) 85 { 86 int sockfd = { 0 }; 87 char buf[1500] = { 0 }; 88 char rbuf[1500] = { 0 }; 89 char login[128] = { 0 }; 90 char pass[128] = { 0 }; 91 WSADATA WSAData; 92 struct sockaddr_in their_addr = { 0 }; 93 WSAStartup(MAKEWORD(2, 2), &WSAData); 94 memset(&their_addr, 0, sizeof(their_addr)); 95 96 their_addr.sin_family = AF_INET; 97 their_addr.sin_port = htons(25); // 一般是25端口不需要改 98 hostent* hptr = gethostbyname("smtp.163.com"); // 端口和服务器 99 memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length); 100 printf("IP of smtp.163.com is : %d:%d:%d:%d\n", 101 their_addr.sin_addr.S_un.S_un_b.s_b1, 102 their_addr.sin_addr.S_un.S_un_b.s_b2, 103 their_addr.sin_addr.S_un.S_un_b.s_b3, 104 their_addr.sin_addr.S_un.S_un_b.s_b4); 105 106 // 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接 107 sockfd = OpenSocket((struct sockaddr *)&their_addr); 108 memset(rbuf, 0, 1500); 109 while (recv(sockfd, rbuf, 1500, 0) == 0) 110 { 111 cout << "reconnect..." << endl; 112 Sleep(2); 113 sockfd = OpenSocket((struct sockaddr *)&their_addr); 114 memset(rbuf, 0, 1500); 115 } 116 117 cout << rbuf << endl; 118 119 // EHLO 120 memset(buf, 0, 1500); 121 sprintf(buf,"%s", "EHLO HYL-PC\r\n"); 122 send(sockfd, buf, strlen(buf), 0); 123 memset(rbuf, 0, 1500); 124 recv(sockfd, rbuf, 1500, 0); 125 cout << "EHLO REceive: " << rbuf << endl; 126 127 // AUTH LOGIN 128 memset(buf, 0, 1500); 129 sprintf(buf, "%s", "AUTH LOGIN\r\n"); 130 send(sockfd, buf, strlen(buf), 0); 131 memset(rbuf, 0, 1500); 132 recv(sockfd, rbuf, 1500, 0); 133 cout << "Auth Login Receive: " << rbuf << endl; 134 135 // USER 136 memset(buf, 0, 1500); 137 sprintf(buf,"%s", "xxxxxxx@163.com");//你的邮箱账号 138 memset(login, 0, 128); 139 EncodeBase64(login, buf, strlen(buf)); 140 sprintf(buf,"%s\r\n", login); 141 send(sockfd, buf, strlen(buf), 0); 142 cout << "Base64 UserName: " << buf << endl; 143 memset(rbuf, 0, 1500); 144 recv(sockfd, rbuf, 1500, 0); 145 cout << "User Login Receive: " << rbuf << endl; 146 147 // PASSWORD 148 sprintf(buf,"%s", "xxxxxx");//你的邮箱密码 149 memset(pass, 0, 128); 150 EncodeBase64(pass, buf, strlen(buf)); 151 sprintf(buf,"%s\r\n", pass); 152 send(sockfd, buf, strlen(buf), 0); 153 cout << "Base64 Password: " << buf << endl; 154 155 memset(rbuf, 0, 1500); 156 recv(sockfd, rbuf, 1500, 0); 157 cout << "Send Password Receive: " << rbuf << endl; 158 159 // MAIL FROM 160 memset(buf, 0, 1500); 161 sprintf(buf,"%s", "MAIL FROM: <xxxxxxxx@163.com>\r\n"); //此处要和发邮件的邮箱保持一致 162 send(sockfd, buf, strlen(buf), 0); 163 memset(rbuf, 0, 1500); 164 recv(sockfd, rbuf, 1500, 0); 165 cout << "set Mail From Receive: " << rbuf << endl; 166 167 // RCPT TO 第一个收件人 168 sprintf(buf, "RCPT TO:<%s>\r\n", email); 169 send(sockfd, buf, strlen(buf), 0); 170 memset(rbuf, 0, 1500); 171 recv(sockfd, rbuf, 1500, 0); 172 cout << "Tell Sendto Receive: " << rbuf << endl; 173 174 // DATA 准备开始发送邮件内容 175 sprintf(buf, "%s", "DATA\r\n"); 176 send(sockfd, buf, strlen(buf), 0); 177 memset(rbuf, 0, 1500); 178 recv(sockfd, rbuf, 1500, 0); 179 cout << "Send Mail Prepare Receive: " << rbuf << endl; 180 181 // 发送邮件内容,\r\n.\r\n内容结束标记 182 sprintf(buf,"%s\r\n.\r\n", body); 183 send(sockfd, buf, strlen(buf), 0); 184 memset(rbuf, 0, 1500); 185 recv(sockfd, rbuf, 1500, 0); 186 cout << "Send Mail Receive: " << rbuf << endl; 187 188 // QUIT 189 sprintf(buf,"%s", "QUIT\r\n"); 190 send(sockfd, buf, strlen(buf), 0); 191 memset(rbuf, 0, 1500); 192 recv(sockfd, rbuf, 1500, 0); 193 cout << "Quit Receive: " << rbuf << endl; 194 195 //清理工作 196 closesocket(sockfd); 197 WSACleanup(); 198 return; 199 } 200 // 打开TCP Socket连接 201 int OpenSocket(struct sockaddr *addr) 202 { 203 int sockfd = 0; 204 sockfd = socket(PF_INET, SOCK_STREAM, 0); 205 if (sockfd < 0) 206 { 207 cout << "Open sockfd(TCP) error!" << endl; 208 exit(-1); 209 } 210 if (connect(sockfd, addr, sizeof(struct sockaddr)) < 0) 211 { 212 cout << "Connect sockfd(TCP) error!" << endl; 213 exit(-1); 214 } 215 return sockfd; 216 }
SendMail.h
1 #ifndef SENDMAIL_H_INCLUDED 2 #define SENDMAIL_H_INCLUDED 3 4 #include <windows.h> 5 #include <stdio.h> 6 #include <WinSock.h> 7 #include <iostream> 8 using namespace std; 9 10 // 协议中加密部分使用的是base64方法 11 char ConvertToBase64(char c6); 12 void EncodeBase64(char *dbuf, char *buf128, int len); 13 void SendMail(char *email, const char *body); 14 int OpenSocket(struct sockaddr *addr); 15 16 #endif // SENDMAIL_H_INCLUDED
来源:https://www.cnblogs.com/tangdingkang/p/12298383.html