C++发送邮件实现代码分享!

本文实例为大家分享了C++发送邮件的具体代码,供大家参考,具体内容如下

首先,别忘了要设置发送邮箱的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 = '';      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:%dn",      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-PCrn");    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 LOGINrn");    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, "%srn", 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, "%srn", 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>rn"); //此处要和发邮件的邮箱保持一致    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>rn", 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, "DATArn");    send(sockfd, buf, strlen(buf), 0);    memset(rbuf, 0, 1500);    recv(sockfd, rbuf, 1500, 0);    cout << "Send Mail Prepare Receive: " << rbuf << endl;      // 发送邮件内容,rn.rn内容结束标记    sprintf_s(buf, 1500, "%srn.rn", 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, "QUITrn");    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;  }

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/482347.html

(0)
上一篇 2020年11月9日
下一篇 2020年11月9日

精彩推荐