发送邮件

来源:互联网 发布:linux ctrl alt f2 编辑:程序博客网 时间:2024/05/16 18:49
vs2013编译通过
/************************************************************************发送邮件模块头文件*可以发送文本和附件(支持多个附件一起发送)*************************************************************************/#pragma once#include <afxtempl.h>#include<WinSock2.h>#pragma comment(lib, "ws2_32.lib")struct sMailInfo //邮件信息{char*m_pcUserName;//用户登录邮箱的名称char*m_pcUserPassWord;//用户登录邮箱的密码char*m_pcSenderName;//用户发送时显示的名称char*m_pcSender;//发送者的邮箱地址char*m_pcReceiver;//接收者的邮箱地址char*m_pcTitle;//邮箱标题charm_pcBody[200];//邮件文本正文char*m_pcIPAddr;//服务器的IPchar*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);//从附件的路径中获取文件名称int Char2Base64(char *buf, char*text,int size);//把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();}int CSendMail::Char2Base64(char *buf, char*text,int size) { static char *base64_encoding = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";int buflen = 0; while(size>0){*buf++ = base64_encoding[ (text[0] >> 2 ) & 0x3f];if(size>2){*buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)];*buf++ = base64_encoding[((text[1] & 0xF) << 2) | (text[2] >> 6)];*buf++ = base64_encoding[text[2] & 0x3F];}else{switch(size){case 1:*buf++ = base64_encoding[(text[0] & 3) << 4 ];*buf++ = '=';*buf++ = '=';break;case 2: *buf++ = base64_encoding[((text[0] & 3) << 4) | (text[1] >> 4)]; *buf++ = base64_encoding[((text[1] & 0x0F) << 2) | (text[2] >> 6)]; *buf++ = '='; break; } } text +=3; size -=3; buflen +=4; } *buf = 0; return buflen; } 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(W2T(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);}struct linger lig;int iLen;lig.l_onoff = 1;lig.l_linger = 1;iLen = sizeof(struct   linger);setsockopt(sock, SOL_SOCKET, SO_LINGER, (char *)&lig, iLen);int ret = connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));//建立连接printf("%d", errno);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));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;}

{sMailInfo user;user.m_pcUserName = "******@163.com";user.m_pcUserPassWord = "********";user.m_pcIPName = "smtp.163.com";user.m_pcSender ="***@163.com";user.m_pcReceiver = "******@163.com";user.m_pcSenderName = "****@163.com";user.m_pcTitle = "测试";char str[20] = "测试测试";memcpy(user.m_pcBody, str, sizeof(str));CSendMail* mail = new CSendMail();if (true == mail->SendMail(user))printf("发送成功");elseprintf("发送失败");getchar();return 0;}

0 0
原创粉丝点击