C++的SMTP类发送邮件

时间:2023.10.20

C++的SMTP类发送邮件

int CMail::sendmail()

{

int crecv;

if(smtplogin()==0)

{

return 0;

}

//发送mail from 返回250

sprintf(m_sendbuff,"%s%s%s","mail from:<",m_user,"@163.com>\r\n"); if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"250",3)!=NULL)

{

m_error=MAIL_FROM_ERROR;

return 0;

}

//发送rcpt to 返回250

sprintf(m_sendbuff,"%s%s%s","rcpt to:<",m_rcptto,">\r\n");

if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"250",3)!=NULL)

{

m_error=RCPT_TO_ERROR;

return 0;

}

//发送data\r\n 返回354

sprintf(m_sendbuff,"%s","data\r\n"); if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"354",3)!=NULL) {

m_error=DATA_ERROR;

return 0;

}

//信头

if(!SetMailHeader(m_sendbuff)) {

m_error=MAILHEADER_ERROR; return 0;

}

if(senddata()==0)

{

return 0;

}

//发送空行

sprintf(m_sendbuff,"%s","\r\n\r\n"); if(senddata()==0)

{

return 0;

}

//发送邮件body

sprintf(m_sendbuff,"%s%s",m_data,"\r\n"); if(senddata()==0)

{

return 0;

}

if(m_attachment!=NULL)

{

char **pp;

for(pp=m_attachment;*pp!=0;pp++)

{

FILE* fp;

char *buf;

//准备发送附件,首先发送分界线,必须!

sprintf(m_sendbuff,"%s%s%s","--",BOUNDARY_TEXT,"\r\n");

if(senddata()==0)

{

return 0;

}

sprintf(m_sendbuff,"%s%s%s","Content-Type: application/x-msdownload; name=\"",strrchr(*pp,'\\')+1,"\"\r\n");

if(senddata()==0)

{

return 0;

}

sprintf(m_sendbuff,"%s","Content-Transfer-Encoding: base64\r\n"); if(senddata()==0)

{

return 0;

}

sprintf(m_sendbuff,"%s%s%s","Content-Disposition: attachment; filename=\"",strrchr(*pp,'\\')+1,"\"\r\n\r\n");

if(senddata()==0)

{

return 0;

}

//将文件base64编码后发送

fp=fopen(*pp,"rb");

if(fp==NULL)

{

m_error=OPEN_FILE_ERROR;

return 0;

}

buf=new char[BUFFERSIZE+1];

memset(buf,0,BUFFERSIZE+1);

int readcount=0;

while(!feof(fp))

{

readcount=fread(buf,1,BUFFERSIZE,fp);

if(readcount>0)

{

*(buf+readcount)='\0';

sprintf(m_sendbuff,"%s%s",base64(buf,ENCODE,readcount),"\r\n"); if(senddata()==0)

{

return 0;

}

memset(buf,0,BUFFERSIZE+1);

}

}

sprintf(m_sendbuff,"%s","\r\n");

if(senddata()==0)

{

return 0;

}

delete[] buf;

fclose(fp);

}

}

if(m_attachment!=NULL)

{

//附件发送完毕,发送分界线

sprintf(m_sendbuff,"%s%s%s","--",BOUNDARY_TEXT,"--\r\n"); if(senddata()==0)

{

return 0;

}

}

//发送.\r\n 结束 返回250

sprintf(m_sendbuff,"%s",".\r\n");

if(senddata()==0)

{

return 0;

}

crecv=recv(s,m_recvbuff,MAX_LENGTH,0);

if(strncmp(m_recvbuff,"250",3)!=NULL)

{

m_error=END_DATA_ERROR;

return 0;

}

else

{

showmessage(NULL,"邮件发送成功","",NULL); }

//退出

sprintf(m_sendbuff,"%s","quit\r\n");

if(senddata()==0)

{

return 0;

}

if(closesocket(s)!=0)

{

m_error=CLOSE_SOCKET_ERROR; return 0;

}

if(WSACleanup()!=0)

{

m_error=CLEANUP_WSA_ERROR; return 0;

}

return 1;

}

int CMail::smtplogin()

{

//调用成员函数connect

if(connect()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strstr(m_recvbuff,"220")==NULL)//220 {

m_error=UNKNOWEN_ERROR;

return 0;

}

//发送helo 返回250

sprintf(m_sendbuff,"%s","helo 543880135\r\n");

if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"250",3)!=NULL)

{

m_error=HELO_ERROR;

return 0;

}

//发送auth login 返回334

sprintf(m_sendbuff,"%s","auth login\r\n");

if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"334",3)!=NULL)

{

m_error=AUTH_LOGIN_ERROR;

return 0;

}

//发送经过base64编码后的用户名,返回334

sprintf(m_sendbuff,"%s%s",base64(m_user,ENCODE,strlen(m_user)),"\r\n"); if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"334",3)!=NULL)

{

m_error=USER_ERROR;

return 0;

}

//发送经过base64编码后的密码 返回235

sprintf(m_sendbuff,"%s%s",base64(m_pass,ENCODE,strlen(m_pass)),"\r\n"); if(senddata()==0)

{

return 0;

}

if(recvdata()==0)

{

return 0;

}

if(strncmp(m_recvbuff,"235",3)!=NULL)

{

m_error=PASS_ERROR;

return 0;

}

return 1;

}

int CMail::connect()

{

WSADATA wsadata;

struct sockaddr_in sock_addr;

HOSTENT *phostent;

struct in_addr inaddr;

if(WSAStartup(MAKEWORD(1,1),&wsadata)<0)

{

m_error=WSA_INIT_ERROR;

return 0;

}

/*---------------根据域名获取网络地址,存放在struct in_addr中----------------*/ phostent=gethostbyname(m_server);//

if(phostent!=NULL)

{

// lpAddr=phostent->h_addr_list[0];

memmove(&inaddr,phostent->h_addr_list[0],4);//220.181.12.101

}

else

{

m_error=CONNECTSERVER_ERROR;

return 0;

}

/*---------------根据域名获取网络地址,存放在struct in_addr中----------------*/

s=socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);//SOCK_STREAM SOCK_DGRAM

sock_addr.sin_family=AF_INET;

sock_addr.sin_port=htons(m_port);

sock_addr.sin_addr=inaddr;//直接结构体赋值给结构体,或者写成:sock_addr.sin_addr.s_addr=inaddr.S_un.S_addr;

if(::connect(s,(struct sockaddr *)&sock_addr,sizeof(sock_addr))) {

m_error=CONNECT_ERROR;

return 0;

}

return 1;

}

int CMail::senddata()

{

int idx = 0;

int csend;

int count=strlen(m_sendbuff);

while(count>0)

{

if((csend=send(s,m_sendbuff+idx,count,0))==SOCKET_ERROR) {

m_error =WSA_SEND_ERROR;

return 0;

}

if(csend==0)

{

break;

}

count-=csend;

idx+=csend;

}

return 1;

}

int CMail::recvdata()

{

int crecv;

crecv=recv(s,m_recvbuff,MAX_LENGTH,0);

if(crecv==SOCKET_ERROR)

{

m_error =WSA_RECV_ERROR;

return 0;

}

else if(crecv==0)

{

m_error=WSA_RECV_ERROR;

return 0;

}

else

{

}

return 1;

}

char* CMail::base64(char *byte,enum codeflag flag,int size)/*base64编码函数*/ {//必须有参数size,因为编码的字节可能包括'\0',尤其是二进制文件

static BYTE encodingTable[]={//index为64的'='是自己定义的

'A', 'B', 'C', 'D', 'E',

'F', 'G', 'H', 'I', 'J',

'K', 'L', 'M', 'N', 'O',

'P', 'Q', 'R', 'S', 'T',

'U', 'V', 'W', 'X', 'Y',

'Z', 'a', 'b', 'c', 'd',

'e', 'f', 'g', 'h', 'i',

'j', 'k', 'l', 'm', 'n',

'o', 'p', 'q', 'r', 's',

't', 'u', 'v', 'w', 'x',

'y', 'z', '0', '1', '2',

'3', '4', '5', '6', '7',

'8', '9', '+', '/'

};

int i;

char a,b,c,d;

char *coderesult;

char *decoderesult;

char *pa,*pb;

if(byte==NULL)

{

m_error=ARGUMENT_ERROR;

return 0;

}

if(size==NULL)

{

m_error=ARGUMENT_ERROR;

return 0;

}

pa=byte;

if(flag==ENCODE)//如果flag为ENCODE 1,用base64编码 {

coderesult=(char*)LocalAlloc(LPTR,(size+2)/3*4+1); int status=1;

for(pb=coderesult,i=0;i<size;pa++,pb++,i++)

{

switch(status)

{

case 1:

*pb=encodingTable[*pa>>2&63];

status=2;

break;

case 2:

*pb=encodingTable[(*(pa-1)<<4&48)+(*pa>>4&15)]; status=3;

break;

case 3:

*(pb++)=encodingTable[(*(pa-1)<<2&60)+(*pa>>6&3)]; *pb=encodingTable[*pa&63];

status=1;

break;

default:

break;

}

}

if(status==2)//size%3=1时

{

*(pb++)=encodingTable[*(pa-1)<<4&48]; *(pb++)='=';

*(pb++)='=';

}

else if(status==3)//size%3=2时

{

*(pb++)=encodingTable[*(pa-1)<<2&60]; *(pb++)='=';

}

*pb='\0';//最后一个字节置0,字符串结束 return coderesult;

}

else//flag为DECODE,解码

{

decoderesult=(char*)LocalAlloc(LPTR,size/4); memset(decoderesult,0,size/4);

if(size%4!=0)

{

m_error=ARGUMENT_ERROR;

return 0;

}

for(pb=decoderesult;*pa;)

{

a=*(pa++);

b=*(pa++);

c=*(pa++);

d=*(pa++);

a=chartoindex(a);

b=chartoindex(b);

c=chartoindex(c);

d=chartoindex(d);

*(pb++)=(a<<2)+(b>>4&3);

*(pb++)=(b<<4)+(c>>2&15);//15为00001111 *(pb++)=(c<<6)+d;

}

*pb='\0';//最后一个字节置0,字符串结束 return decoderesult;

}

}

更多相关推荐:
发邮件的格式汇总

发邮件的礼仪汇总让优秀成为习惯一关于主题主题要提纲挈领添加邮件主题是电子邮件和信笺的主要不同之处在主题栏里用短短的几个字概括出整个邮件的内容便于收件人权衡邮件的轻重缓急分别处理1一定不要空白标题这是最失礼的2标...

发邮件的礼仪及其格式

发邮件的礼仪及格式让优秀成为习惯一主题与签名1一定不要空白标题这是最失礼的2标题要简短明了让对方一看就知道你发的是什么邮件3最好把你的邮箱设好一个签名以便对方一目了然又便于留存比如李桂梅luciey总经理助理M...

发送邮件传作文

十一发送邮件传作文年级四年级教材小学信息技术教材编写组编电子工业出版社出版小学信息技术第三册第三单

职场新人秘笈_关于工作中发送邮件的注意事项

职场新人秘笈关于邮件1公司邮箱不是私人邮箱每个人工作之前基本上都有电子邮箱比如说我基本上大网站的邮箱我都有从163到yahoo从sina到tom一应俱全但是工作之后分到的个人邮箱不能拿来当私人邮箱用比如在注册一...

关于发送邮件通知开会人员及邮件发送版本

尊敬的各位领导:晚上好!3月x日晚上19时,在行政办公楼5楼2号会议室召开会议;会议主题:总经理管理工作部署会议内容:1、明确下一步的各部门工作部署;2、梳理各部门的工作不足及提出改善意见和建议;会议主持:公司…

怎么发送电子邮件

怎么发送电子邮件1请登录邮箱请点击页面左侧写信按钮2输入收件人地址若多个地址地址间用半角隔开也可在通讯录中选择一位或多位联系人选中的联系人地址将会自动填写在收件人一栏中3若您想抄送信件请点击添加抄送将会出现抄送...

邮件发送格式设置

关于RTF文件格式答疑遇到收到一封很大的邮件实际上发件方发送时是有正常附件的但收件方在WEBMAIL上查看这封邮件时确发现附件变成了Winmaildat通过客户端OEOutlookExpress简称接收下来这封...

关于发送邮件通知开会人员及邮件发送版本 (1)

尊敬的各位领导晚上好3月3日晚上19时在行政办公楼5楼2号会议室召开会议会议主题总经理管理工作部署会议内容1明确下一步的各部门工作部署2梳理各部门的工作不足及提出改善意见和建议会议主持公司执行董事周博士参会人员...

发送邮件应注意事项

各位同事以下整理一些邮件注意事项尤其请注意加粗红色字段有需要的同事可以自我检查提高邮件处理能力尤其是注意邮件泄密和基本礼仪方面的一主题1尽量不要空白标题2标题要简短不宜冗长能真反映文章的内容和重要性3一封信尽可...

邮件发送简历

为什么要用Email正文来发送简历很多公司的邮箱容量比较小且为了防止电脑病毒传播很多公司的邮件系统是不允许邮件中带附件的如果是这种情况带附件的邮件要么是被直接删除要么就是附件被删除正是基于这个原因很多公司的HR...

发送邮件传作文

20xx素质教育开放周四年级教学设计发送邮件传作文北塘小学谢军一教学目标1知识性目标了解电子信箱地址的组成部分复习书写信件的格式学会在电子邮件中插入附件成功发送电子邮件2技能性目标回忆三年级所学习的因特网功能引...

《发送邮件传作文》教学案例

发送邮件传作文教学案例四年级第三单元发送邮件传作文教学案例蚌埠市淮上实验小学李学舜宋倩130xxxxxxxxctqfoxmailcom一教材分析1教材选用本节课是电子工业出版社信息技术第五册第三单元第11课发送...

发送邮件的(14篇)