最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++發(fā)送郵件實現(xiàn)代碼

 更新時間:2018年05月28日 10:03:16   作者:Yetongfff  
這篇文章主要為大家詳細介紹了C++發(fā)送郵件的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C++發(fā)送郵件的具體代碼,供大家參考,具體內(nèi)容如下

首先,別忘了要設置發(fā)送郵箱的smtp,例如,假設你需要用網(wǎng)易郵箱,你需要去你的163郵箱設置開啟smtp(有的郵箱還需要設置授權碼)。接著就可以用以下代碼發(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");     // 端口和服務器
  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"); //此處要和發(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 準備開始發(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é)束標記
  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;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Qt多版本共存使用實現(xiàn)組件增刪

    Qt多版本共存使用實現(xiàn)組件增刪

    本文主要介紹了Qt多版本共存使用實現(xiàn)組件增刪,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C語言中settimeofday函數(shù)和gettimeofday函數(shù)的使用

    C語言中settimeofday函數(shù)和gettimeofday函數(shù)的使用

    這篇文章主要介紹了C語言中的settimeofday函數(shù)和gettimeofday函數(shù)的使用,注意settimeofday()函數(shù)只返回0和-1,需要的朋友可以參考下
    2015-08-08
  • C語言實現(xiàn)漢諾塔(圖文詳解)

    C語言實現(xiàn)漢諾塔(圖文詳解)

    個人覺得漢諾塔這個遞歸算法比電子老鼠的難了一些,不過一旦理解了也還是可以的,其實網(wǎng)上也有很多代碼,可以直接參考。記得大一開始時就做過漢諾塔的習題,但是那時代碼寫得很長很長,也是不理解遞歸的結(jié)果。今天重新來實現(xiàn)一下
    2021-08-08
  • VC++實現(xiàn)的OpenGL線性漸變色繪制操作示例

    VC++實現(xiàn)的OpenGL線性漸變色繪制操作示例

    這篇文章主要介紹了VC++實現(xiàn)的OpenGL線性漸變色繪制操作,結(jié)合實例形式分析了VC++基于OpenGL進行圖形繪制的相關操作技巧,需要的朋友可以參考下
    2017-07-07
  • c++ STL常用遍歷算法

    c++ STL常用遍歷算法

    這篇文章主要介紹了c++ STL常用遍歷算法的實現(xiàn),幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • C++中的整型

    C++中的整型

    這篇文章我們來聊聊C++中的整型,整型即整數(shù),與小數(shù)對應。許多語言只能表示一種整型(如Python),而在C++當中根據(jù)整數(shù)的范圍提供了好幾種不同的整型,下面文章我們就來看看具體是哪幾種,需要的朋友也可以參考一下
    2021-11-11
  • 用純C語言實現(xiàn)貪吃蛇游戲

    用純C語言實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細介紹了用純C語言實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言中循環(huán)語句練習實例

    C語言中循環(huán)語句練習實例

    大家好,本篇文章主要講的是C語言中循環(huán)語句練習實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 四個例子說明C語言?全局變量

    四個例子說明C語言?全局變量

    這篇文章主要介紹了四個例子說明C語言?全局變量,全局變量是C語言語法和語義中一個很重要的知識點,首先它的存在意義需要從三個不同角度去理解,下面來看看這三個不同的內(nèi)容分別是什么吧
    2022-04-04
  • C語言判斷回文數(shù)的小例子

    C語言判斷回文數(shù)的小例子

    這篇文章主要介紹了C語言判斷回文數(shù)的小例子,有需要的朋友可以參考一下
    2014-01-01

最新評論

平谷区| 大新县| 双牌县| 钦州市| 崇礼县| 九台市| 仙游县| 临朐县| 峨边| 平阴县| 红桥区| 岗巴县| 班戈县| 仁寿县| 进贤县| 永康市| 梨树县| 张家界市| 濮阳市| 奈曼旗| 商城县| 积石山| 株洲市| 伊宁市| 剑阁县| 偏关县| 四子王旗| 九龙城区| 洮南市| 澄迈县| 德昌县| 高邮市| 渭源县| 南京市| 沅江市| 上饶市| 长兴县| 城市| 英超| 壶关县| 乌什县|