亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++實現發送郵件和附件功能

2020-05-23 13:26:38
字體:
來源:轉載
供稿:網友

本文實例為大家分享了C++實現發送郵件和附件的具體代碼,供大家參考,具體內容如下

頭文件

/**************************發送郵件模塊頭文件 *可以發送文本和附件(支持多個附件一起發送) **************************/ #pragma once struct sMailInfo //郵件信息 {  char* m_pcUserName;//用戶登錄郵箱的名稱  char* m_pcUserPassWord;//用戶登錄郵箱的密碼  char* m_pcSenderName;//用戶發送時顯示的名稱  char* m_pcSender;//發送者的郵箱地址  char* m_pcReceiver;//接收者的郵箱地址  char* m_pcTitle;//郵箱標題  char* m_pcBody;//郵件文本正文  char* m_pcIPAddr;//服務器的IP  char* m_pcIPName;//服務器的名稱(IP與名稱二選一,優先取名稱)  sMailInfo(){memset(this,0,sizeof(sMailInfo));} }; class CSendMail { public:  CSendMail(void);  ~CSendMail(void);  public:  bool SendMail(sMailInfo &smailInfo);//發送郵件,需要在發送的時候初始化郵件信息  void AddFilePath(char * pcFilePath);//添加附件的決定路徑到附件列表中  void DeleteFilePath(char* pcFilePath);//刪除附件路徑,如果有的話  void DeleteAllPath(void);//刪除全部附件的路徑  protected:  void GetFileName(char* fileName,char* filePath);//從附件的路徑中獲取文件名稱  void Char2Base64(char* pBuff64,char* pSrcBuff,int iLen);//把char類型轉換成Base64類型  bool CReateSocket(SOCKET &sock);//建立socket連接  bool Logon(SOCKET &sock);//登錄郵箱,主要進行發郵件前的準備工作  int GetFileData(char* FilePath);//由文件路徑獲取附件內容   bool SendHead(SOCKET &sock);//發送郵件頭  bool SendTextBody(SOCKET &sock);//發送郵件文本正文  bool SendFileBody(SOCKET &sock);//發送郵件附件  bool SendEnd(SOCKET &sock);//發送郵件結尾 protected:  CList<char*,char*> m_pcFilePathList;//記錄附件路徑   char m_cSendBuff[4096];//發送緩沖區  char m_cReceiveBuff[1024];  char* m_pcFileBuff;//指向附件內容  sMailInfo m_sMailInfo; }; 

模塊實現文件

/***************************** 發送郵件模塊 *可以發送文本和附件(支持多個附件一起發送) *Date:2011-12-01 ******************************/ #include "StdAfx.h" #include "SendMail.h" #include "winsock2.h" #pragma comment(lib,"WSOCK32")  CSendMail::CSendMail(void) {  m_pcFileBuff=NULL;  memset(m_cSendBuff,0,sizeof(m_cSendBuff));  memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff)); }   CSendMail::~CSendMail(void) {  DeleteAllPath(); }   void CSendMail::Char2Base64(char* pBuff64,char* pSrcBuff,int iLen) {  //1 1 1 1 1 1 1 1  // 分配給pBuff64 ↑ 分配給pBuff64+1  //   point所在的位置  static char Base64Encode[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//base64所映射的字符表  int point;//每一個源字符拆分的位置,可取2,4,6;初始為2  point=2;  int i;  int iIndex;//base64字符的索引  char n=0;//上一個源字符的殘留值  for(i=0;i<iLen;i++)  {   if(point==2)   {    iIndex=((*pSrcBuff)>>point)&0x3f;//取得pSrcBuff的高point位   }   else if (point==4)   {    iIndex=((*pSrcBuff)>>point)&0xf;//取得pSrcBuff的高point位   }   else if(point==6)   {    iIndex=((*pSrcBuff)>>point)&0x3;//取得pSrcBuff的高point位   }   iIndex+=n;//與pSrcBuff-1的低point結合組成Base64的索引   *pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64   n=((*pSrcBuff)<<(6-point));//計算源字符中的殘留值   n=n&0x3f;//確保n的最高兩位為0   point+=2;//源字符的拆分位置上升2   if(point==8)//如果拆分位置為8說明pSrcBuff有6位殘留,可以組成一個完整的Base64字符,所以直接再組合一次   {    iIndex=(*pSrcBuff)&0x3f;//提取低6位,這就是索引了    *pBuff64++=Base64Encode[iIndex];//    n=0;//殘留值為0    point=2;//拆分位置設為2   }   pSrcBuff++;   }  if(n!=0)  {   *pBuff64++=Base64Encode[n];  }  if(iLen%3==2)//如果源字符串長度不是3的倍數要用'='補全  {   *pBuff64='=';  }  else if(iLen%3==1)  {   *pBuff64++='=';   *pBuff64='=';  } }  void CSendMail::AddFilePath(char * pcFilePath)//添加附件路徑 {  if(pcFilePath==NULL)  {   return;  }  int i;  char* temp;  for(i=0;i<m_pcFilePathList.GetCount();i++)  {   temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));   if(strcmp(pcFilePath,temp)==0)//如果已經存在就不用再添加了   {    return;   }  }  m_pcFilePathList.AddTail(pcFilePath); }  void CSendMail::DeleteFilePath(char* pcFilePath)//刪除附件路徑 {  int i;  char* temp;  for(i=0;i<m_pcFilePathList.GetCount();i++)  {   temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));   if(strcmp(temp,pcFilePath)==0)//找到并刪除它,如果沒找到就算了   {    m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i));    delete[] temp;    return;   }  } }   void CSendMail::DeleteAllPath(void) {  m_pcFilePathList.RemoveAll(); }  int CSendMail::GetFileData(char* FilePath) {  m_pcFileBuff=NULL;  if(FilePath==NULL)  {   return 0;  }  CFile f;  int len;      USES_CONVERSION;  if(!f.Open(A2W(FilePath),CFile::modeRead|CFile::modeNoTruncate|CFile::typeBinary))  {   return 0;  }  len=(int)f.GetLength();  m_pcFileBuff=new char[len+1];  memset(m_pcFileBuff,0,len+1);  f.Read(m_pcFileBuff,len);   f.Close();  return len; }  void CSendMail::GetFileName(char* fileName,char* filePath) {  if(filePath==NULL || fileName==NULL)  {   return;  }  int i;  for(i=0;i<(int)strlen(filePath);i++)  {   if(filePath[strlen(filePath)-1-i]=='//')   {    memcpy(fileName,&filePath[strlen(filePath)-i],i);    return;   }  } }  bool CSendMail::CReateSocket(SOCKET &sock) {  WORD wVersionRequested;  WSADATA wsaData;  int err;  wVersionRequested = MAKEWORD( 2, 2 );  err = WSAStartup( wVersionRequested, &wsaData );  if ( err != 0 )  {   return false;  }  if ( LOBYTE( wsaData.wVersion ) != 2 ||   HIBYTE( wsaData.wVersion ) != 2 )  {   WSACleanup( );   return false;  }  sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);  if (sock == INVALID_SOCKET)  {   return false;  }   sockaddr_in servaddr;  memset(&servaddr,0,sizeof(sockaddr_in));  servaddr.sin_family = AF_INET;  servaddr.sin_port = htons(25);//發郵件一般都是25端口  if(m_sMailInfo.m_pcIPName=="")  {   servaddr.sin_addr.s_addr = inet_addr(m_sMailInfo.m_pcIPAddr);//直接使用IP地址  }  else  {   struct hostent *hp=gethostbyname(m_sMailInfo.m_pcIPName);//使用名稱   servaddr.sin_addr.s_addr=*(int*)(*hp->h_addr_list);  }    int ret = connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));//建立連接  if (ret == SOCKET_ERROR)  {   return false;  }   return true; }   bool CSendMail::Logon(SOCKET &sock) {  recv(sock,m_cReceiveBuff,1024,0);   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"HELO []/r/n");  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//開始會話  recv(sock,m_cReceiveBuff,1024,0);  if(m_cReceiveBuff[0]!='2' || m_cReceiveBuff[1]!='5' || m_cReceiveBuff[2]!='0')  {   return false;  }   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"AUTH LOGIN/r/n");  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//請求登錄  recv(sock,m_cReceiveBuff,1024,0);  if(m_cReceiveBuff[0]!='3' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='4')  {   return false;  }   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserName,strlen(m_sMailInfo.m_pcUserName));  m_cSendBuff[strlen(m_cSendBuff)]='/r';  m_cSendBuff[strlen(m_cSendBuff)]='/n';  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//發送用戶名  recv(sock,m_cReceiveBuff,1024,0);  if(m_cReceiveBuff[0]!='3' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='4')  {   return false;  }   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserPassWord,strlen(m_sMailInfo.m_pcUserPassWord));  m_cSendBuff[strlen(m_cSendBuff)]='/r';  m_cSendBuff[strlen(m_cSendBuff)]='/n';  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);//發送用戶密碼  recv(sock,m_cReceiveBuff,1024,0);  if(m_cReceiveBuff[0]!='2' || m_cReceiveBuff[1]!='3' || m_cReceiveBuff[2]!='5')  {   return false;  }  return true;//登錄成功 }   bool CSendMail::SendHead(SOCKET &sock) {  int rt;  memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"MAIL FROM:<%s>/r/n",m_sMailInfo.m_pcSender);  rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);    if(rt!=strlen(m_cSendBuff))  {   return false;  }  recv(sock,m_cReceiveBuff,1024,0);   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"RCPT TO:<%s>/r/n",m_sMailInfo.m_pcReceiver);  rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);  if(rt!=strlen(m_cSendBuff))  {   return false;  }  recv(sock,m_cReceiveBuff,1024,0);   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  memcpy(m_cSendBuff,"DATA/r/n",strlen("DATA/r/n"));  rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);  if(rt!=strlen(m_cSendBuff))  {   return false;  }  recv(sock,m_cReceiveBuff,1024,0);   memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"From:/"%s/"<%s>/r/n",m_sMailInfo.m_pcSenderName,m_sMailInfo.m_pcSender);  sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,"To:/"INVT.COM.CN/"<%s>/r/n",m_sMailInfo.m_pcReceiver);  sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,"Subject:%s/r/nMime-Version: 1.0/r/nContent-Type: multipart/mixed; boundary=/"INVT/"/r/n/r/n",m_sMailInfo.m_pcTitle);  rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);  if(rt!=strlen(m_cSendBuff))  {   return false;  }   return true; }  bool CSendMail::SendTextBody(SOCKET &sock) {  int rt;  memset(m_cSendBuff,0,sizeof(m_cSendBuff));  sprintf_s(m_cSendBuff,"--INVT/r/nContent-Type: text/plain;/r/n charset=/"gb2312/"/r/n/r/n%s/r/n/r/n",m_sMailInfo.m_pcBody);  rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);  if(rt!=strlen(m_cSendBuff))  {   return false;  }  else  {   return true;  } }  bool CSendMail::SendFileBody(SOCKET &sock) {  int i;  char* filePath;  int rt;  int len;  int pt=0;  char fileName[128];  for(i=0;i<m_pcFilePathList.GetCount();i++)  {   pt=0;   memset(fileName,0,128);   filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));   len=GetFileData(filePath);   GetFileName(fileName,filePath);    sprintf_s(m_cSendBuff,"--INVT/r/nContent-Type: application/octet-stream;/r/n name=/"%s/"/r/nContent-Transfer-Encoding: base64/r/nContent-Disposition: attachment;/r/n filename=/"%s/"/r/n/r/n",fileName,fileName);   send(sock,m_cSendBuff,strlen(m_cSendBuff),0);   while (pt<len)   {    memset(m_cSendBuff,0,sizeof(m_cSendBuff));    Char2Base64(m_cSendBuff,&m_pcFileBuff[pt],min(len-pt,3000));    m_cSendBuff[strlen(m_cSendBuff)]='/r';    m_cSendBuff[strlen(m_cSendBuff)]='/n';    rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0);    pt+=min(len-pt,3000);    if(rt!=strlen(m_cSendBuff))    {     return false;    }   }   if(len!=0)   {    delete [] m_pcFileBuff;   }  }   return true; }  bool CSendMail::SendEnd(SOCKET &sock) {  sprintf_s(m_cSendBuff,"--INVT--/r/n./r/n");  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);   sprintf_s(m_cSendBuff,"QUIT/r/n");  send(sock,m_cSendBuff,strlen(m_cSendBuff),0);  closesocket(sock);  WSACleanup();  return true; }   bool CSendMail::SendMail(sMailInfo &smailInfo) {  memcpy(&m_sMailInfo,&smailInfo,sizeof(smailInfo));  if(m_sMailInfo.m_pcBody==NULL   || m_sMailInfo.m_pcIPAddr==NULL   || m_sMailInfo.m_pcIPName==NULL   || m_sMailInfo.m_pcReceiver==NULL   || m_sMailInfo.m_pcSender==NULL   || m_sMailInfo.m_pcSenderName==NULL   || m_sMailInfo.m_pcTitle==NULL   || m_sMailInfo.m_pcUserName==NULL   || m_sMailInfo.m_pcUserPassWord==NULL)  {   return false;  }  SOCKET sock;  if(!CReateSocket(sock))//建立連接  {   return false;  }   if(!Logon(sock))//登錄郵箱  {   return false;  }   if(!SendHead(sock))//發送郵件頭  {   return false;  }   if(!SendTextBody(sock))//發送郵件文本部分  {   return false;  }   if(!SendFileBody(sock))//發送附件  {   return false;  }   if(!SendEnd(sock))//結束郵件,并關閉sock  {   return false;  }   return true; } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品中文字幕在线播放| 欧美xxxx14xxxxx性爽| 欧美精品videosex极品1| 欧美色图在线视频| 亚洲影视九九影院在线观看| 亚洲xxx大片| 色婷婷综合成人av| 亚洲最大的免费| 欧美日韩免费观看中文| 日韩免费av一区二区| 亚洲无亚洲人成网站77777| 欧美日韩国产91| 国产精品美女在线观看| 久久国产天堂福利天堂| 国产欧美精品在线| 国产国语videosex另类| 国产精品视频免费在线观看| 久久精品亚洲精品| 国产日韩在线精品av| 日韩三级成人av网| 色偷偷噜噜噜亚洲男人| 成人激情电影一区二区| 日韩亚洲国产中文字幕| 韩国v欧美v日本v亚洲| 亚洲欧美激情精品一区二区| 国产精品午夜视频| 992tv成人免费影院| 成人欧美在线观看| 成人激情av在线| 情事1991在线| 亚洲激情免费观看| 国产精品高潮呻吟久久av野狼| 日本精品免费一区二区三区| 久久免费国产视频| 亚洲白拍色综合图区| 国产精品久久久久久久久粉嫩av| 亚洲精品电影网站| 国产精品久久久久久中文字| 久久久精品电影| 久久久久久久国产| 国产精品6699| 亚州欧美日韩中文视频| www.久久草.com| 日产精品久久久一区二区福利| 亚洲网站在线看| 日韩中文字幕在线免费观看| 亚洲免费av片| 午夜精品久久久99热福利| 黑人巨大精品欧美一区二区免费| 久久影视电视剧免费网站清宫辞电视| 亚洲社区在线观看| 欧美一区二区三区免费观看| 欧美激情亚洲激情| 欧美成人久久久| 欧美专区福利在线| 热99精品里视频精品| 久久99热这里只有精品国产| 久久久国产一区二区三区| 亚洲大胆人体av| 国产成人精品视频| 日韩经典中文字幕| 亚洲视频第一页| 亚洲一区二区三区视频播放| 国产成人亚洲综合91| 8050国产精品久久久久久| 国产亚洲精品久久| 成人激情视频小说免费下载| 亚洲欧洲日产国产网站| 美女扒开尿口让男人操亚洲视频网站| 欧美成人黑人xx视频免费观看| 国产成人一区二区在线| 成人精品久久久| 国产亚洲人成a一在线v站| 中文字幕欧美视频在线| 精品国产乱码久久久久久虫虫漫画| 亚洲日本中文字幕免费在线不卡| 久久6免费高清热精品| 在线成人免费网站| 91美女福利视频高清| 国产精品久久婷婷六月丁香| 午夜精品免费视频| 欧美理论电影网| 91日本视频在线| 亚洲欧美激情另类校园| 5252色成人免费视频| 国产精品av电影| 日韩av在线导航| 国产精品中文久久久久久久| 欧美电影免费观看大全| 亚洲女人被黑人巨大进入al| 伊人亚洲福利一区二区三区| 欧美午夜www高清视频| 欧美激情一区二区三区高清视频| 色综合久久精品亚洲国产| 国产成人涩涩涩视频在线观看| 亚洲人免费视频| 久久久久国产精品一区| 日本亚洲欧洲色α| 成人亚洲综合色就1024| 久久久91精品国产| 日韩中文字幕在线播放| 亚洲网站在线播放| 色先锋久久影院av| 俺去亚洲欧洲欧美日韩| 中文字幕亚洲图片| 亚洲欧美精品suv| 性欧美长视频免费观看不卡| 色先锋久久影院av| 日韩av免费看| 神马国产精品影院av| 亚洲女在线观看| 欧美极品欧美精品欧美视频| 91久久精品美女高潮| 中文字幕日韩欧美精品在线观看| 亚洲精品福利资源站| 日韩免费在线观看视频| 在线视频日韩精品| 日韩中文在线观看| 欧美日韩精品在线观看| 精品久久中文字幕| 国产精品91在线观看| 久久综合国产精品台湾中文娱乐网| 欧美xxxx综合视频| 91av在线视频观看| zzjj国产精品一区二区| 俺也去精品视频在线观看| 久久精品成人动漫| 国产91精品网站| xxx欧美精品| 在线播放精品一区二区三区| 国产精品免费一区二区三区都可以| 国产精品久久久久久久av电影| 国产亚洲视频在线| 国产ts人妖一区二区三区| 亚洲国产日韩欧美在线图片| 日韩在线播放一区| 国产精品91在线观看| 中文字幕亚洲一区二区三区| 国产精品嫩草视频| 日韩一区二区在线视频| www国产精品视频| 欧美性精品220| 午夜精品福利视频| 国内精品美女av在线播放| 欧美专区福利在线| 日韩精品亚洲元码| 日本欧美一二三区| 超碰91人人草人人干| 日韩视频免费中文字幕| 精品国产一区二区三区久久| 91精品视频在线播放| 亚洲直播在线一区| 啊v视频在线一区二区三区| 亚洲精品wwww| 国产精品91在线| 亚洲视频一区二区三区| 欧美激情第1页| 久久久久久久久久久91| 一区国产精品视频| 亚洲精品成人免费| 激情久久av一区av二区av三区| 欧美黑人一级爽快片淫片高清| 日韩精品在线私人| 懂色av中文一区二区三区天美|