C++发送邮件和附件

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 m_pcFilePathList;//记录附件路径



 char m_cSendBuff[4096];//发送缓冲区

 char m_cReceiveBuff[1024];

 char* m_pcFileBuff;//指向附件内容

 sMailInfo m_sMailInfo;

 };

模块实现文件

 /************************************************************************  * 发送邮件模块

 *可以发送文本和附件(支持多个附件一起发送)

 *Date:2011-12-01

 ************************************************************************/  #include

 #include

 #include

 #pragma comment(lib,



 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[] =

 int point;//每一个源字符拆分的位置,可取2,4,6;初始为2

 point=2;

 int i;

 int iIndex;//base64字符的索引

 char n=0;//上一个源字符的残留值

 for(i=0;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)

 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

 {

 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

 {

 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

 {

 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,

 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,

 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,



 if(rt!=strlen(m_cSendBuff))

 {

 return false;

 }

 recv(sock,m_cReceiveBuff,1024,0);



 memset(m_cSendBuff,0,sizeof(m_cSendBuff));

 sprintf_s(m_cSendBuff,

 if(rt!=strlen(m_cSendBuff))

 {

 return false;

 }

 recv(sock,m_cReceiveBuff,1024,0);



 memset(m_cSendBuff,0,sizeof(m_cSendBuff));

 memcpy(m_cSendBuff,

 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,



sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,



sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,

boundary=\

 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,

 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

 {

 pt=0;

 memset(fileName,0,128);

 filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));  len=GetFileData(filePath);

 GetFileName(fileName,filePath);



 sprintf_s(m_cSendBuff,

application/octet-stream;\r\n name=\

filename=\

 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

 while (pt

 {

 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,

 sprintf_s(m_cSendBuff,

 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;

 }

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 m_pcFilePathList;//记录附件路径



 char m_cSendBuff[4096];//发送缓冲区

 char m_cReceiveBuff[1024];

 char* m_pcFileBuff;//指向附件内容

 sMailInfo m_sMailInfo;

 };

模块实现文件

 /************************************************************************  * 发送邮件模块

 *可以发送文本和附件(支持多个附件一起发送)

 *Date:2011-12-01

 ************************************************************************/  #include

 #include

 #include

 #pragma comment(lib,



 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[] =

 int point;//每一个源字符拆分的位置,可取2,4,6;初始为2

 point=2;

 int i;

 int iIndex;//base64字符的索引

 char n=0;//上一个源字符的残留值

 for(i=0;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)

 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

 {

 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

 {

 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

 {

 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,

 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,

 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,



 if(rt!=strlen(m_cSendBuff))

 {

 return false;

 }

 recv(sock,m_cReceiveBuff,1024,0);



 memset(m_cSendBuff,0,sizeof(m_cSendBuff));

 sprintf_s(m_cSendBuff,

 if(rt!=strlen(m_cSendBuff))

 {

 return false;

 }

 recv(sock,m_cReceiveBuff,1024,0);



 memset(m_cSendBuff,0,sizeof(m_cSendBuff));

 memcpy(m_cSendBuff,

 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,



sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,



sprintf_s(&m_cSendBuff[strlen(m_cSendBuff)],150,

boundary=\

 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,

 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

 {

 pt=0;

 memset(fileName,0,128);

 filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));  len=GetFileData(filePath);

 GetFileName(fileName,filePath);



 sprintf_s(m_cSendBuff,

application/octet-stream;\r\n name=\

filename=\

 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);

 while (pt

 {

 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,

 sprintf_s(m_cSendBuff,

 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;

 }


相关内容

  • 电子邮件系统的设计与开发
  • 山东农业大学 毕业论文 题目: 二○○八年六月 中英文摘要 第一章 电子邮件的发展背景和意义 电子邮件翻译自英文的E-mail ,它表示通过电子通讯系统进行信件的书写.发送和接收. 30多年前,人们发明了电子邮件这种便捷的信息传递方式,这是人类通信历史上的一次革命. 电子邮件的兴起是在20世纪80年 ...

  • 计算机网络课程作业
  • <计算机网络>课程作业 一. 编程实现mail client 1. 开发环境工具 (1)使用编程工具:Eclipse (2)使用的语言:Java (3)使用的开发包:javamail-1_4版 (4)开发平台:window7 2. 所需要的知识 (1)计算机网络的基本知识 (2)了解SM ...

  • 计算机编码
  • 字符,字节和编码 [原创文章,转载请保留或注明出处:http://www.regexlab.com/zh/encoding.htm ] 级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解.举例说明了一些实际应用中,编码的实现方法.然后,本文讲述了通常对字符与编码的几种误解,由于这些 ...

  • 短信收发管理系统开题报告
  • 天津理工大学中环信息学院 本科毕业设计开题报告 届:2012系:计算机工程专业:软件工程2011年11月8日毕业设计 短信收发管理系统 题目 学生姓名 指导教师 一.课题研究背景 随着移动通信技术的迅速发展,作为移动通信的一种重要增值业务的SMS也得到了迅速的发展.随着使用SMS短信息业务的人越来越 ...

  • 01信息部入职笔试题库
  • 包头市时代广场商业管理有限公司 目录 1.单项选择题 ........................................................... 1 2.多项选择题 ..................................................... ...

  • Email投递简历时用正文or附件发送
  • Email投递简历时用正文or附件发送?(才知道,之前都白投了,悲剧!!!) 来源: 陈倩的日志 (1)Email投递简历究竟是用正文发送简历还是附件发送简历? 这个问题一直都是Email投递简历争论的交点,各有各的理.就这个问题而已,建议大家视具体情况,灵活处理.在此之前,大家应了解正文发送简历和 ...

  • 用邮件发简历
  • [简历投递] 全文:手把手教你发邮件正文简历(附中文简历模板) 版主/管理员寄语 locust_j (2009年7月24日 16点16分54秒): 该帖已收录至简历版精华置顶贴:中英文简历制作技巧及经验.简历投递技巧精华合集贴(点击查看) 2009年3月3日新增修订内容: 鉴于很多网友提问,使用Ya ...

  • 因特网_87+74
  • 因特网习题98+74 一.选择题 1.计算机网络的最大优点是( ). A. 加快计算速度 B.增大存储容量 C.资源共享 D.节省人力资源 2.因特网上一台主机的IP地址由( )部分组成. A. 若干 B.3 C.4 D.5 3.传输速率的单位是bps,其含义是( ). A.Baud Per Sec ...

  • 电子邮件系统毕业论文
  • 青岛理工大学 毕 业 设 计(论 文) 题目的设计与实现 学生姓名: 许晨祎 指导教师: 马国兵 学院班 年 月 日 青岛理工大学毕业设计(论文) 摘 要 本文主要阐述了基于javamail电子邮件系统的设计与实现,较为系统地介绍了电子邮件用户的登录.收发电子邮件.邮件目录操作.邮件群发.通讯录建立 ...