C++程序中支持SMTP邮件发送的解决方案
- 格式:docx
- 大小:12.65 KB
- 文档页数:1
SMTP〔Simple Mail Transfer Protocol〕即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规那么,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的效劳器,就可以把E-mail寄到收信人的效劳器上了,整个过程只要几分钟。
SMTP效劳器那么是遵循SMTP协议的发送邮件效劳器,用来发送或中转发出的电子邮件。
目录详细简介协议原理个人SMTP效劳器的配置方法工作过程平安和垃圾邮件效劳扩展通讯模型通信平安详细简介协议原理个人SMTP效劳器的配置方法工作过程平安和垃圾邮件效劳扩展通讯模型通信平安展开编辑本段详细简介SMTP 是一种提供可靠且有效电子邮件传输的协议。
SMTP 是建模在 FTP 文件传输效劳上的一种邮件效劳,主要用于传输系统之间的邮件信息并提供来信有关的通知。
SMTP 独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。
SMTP 重要特性之一是其能跨越网络传输邮件,即“ SMTP 邮件中继〞。
通常,SMTP一个网络可以由公用互联网上 TCP 可相互访问的主机、防火墙分隔的TCP/IP 网络上 TCP 可相互访问的主机,及其它 LAN/WAN 中的主机利用非TCP 传输层协议组成。
使用 SMTP ,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关实现某处理机与其它网络之间的邮件传输。
在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。
域名效劳系统〔DNS〕的邮件交换效劳器可以用来识别出传输邮件的下一跳 IP 地址。
在传输文件过程中使用25号端口编辑本段协议原理SMTP-简单邮件传输协议〔SimpleMailTransferProtocol〕,是定义邮件传输的协议,它是基于TCP效劳的应用层协议,由RFC0821所定义。
SMTP协议规定的命令是以明文方式进行的。
C#网络协议题库-简答1. 简答什么是分散式、集中式和分布式通信模型。
答:分散式指用户只负责管理自己的计算机系统,各自独立的系统之间没有资源或信息的交换或共享。
集中式指用一台主计算机保存一个企业组织的全部数据,而用户则通过终端连接到这台主计算机系统并与之通信,从而达到访问数据的目的。
分布式是分散式系统和集中式系统的混合,它由一个又一个连接起来的独立计算机组成。
2.TCP/IP四层模型中各层的主要功能是什么?答:应用层:负责实现一切与应用程序相关的功能,对应OSI参考模型的上三层。
传输层:负责提供可靠的传输服务,对应OSI参考模型的第四层。
网际层:负责网络间的寻址,数据传输,对应OSI参考模型的第三层。
网络接口层:负责实际数据的传输,对应OSI参考模型的下两层。
3. C#中线程优先级有多少种,分别是啥?创建进程时,如果不指定其优先级,则系统默认为什么?答:有5个不同的优先级,由高到低分别是Highest、AboveNormal、Normal、BelowNormal、Lowest。
创建进程时,如果不指定其优先级,则系统默认为Normal。
4.进程和线程有什么区别?答:一个完整的进程拥有自己独立的内存空间和数据,但是线程是共享进程的内存空间和数据。
进程是应用程序的执行实力,线程是执行进程的路径,一个进程可以包含多个线程。
5.在Process类中,Kill方法和CloseMainWindow方法有什么不同?答:Kill方法用于强行终止进程,而CloseMainWindow只是“请求”终止进程。
Kill方法会导致进程非正常终止,因而只在必要时才使用该方法。
CloseMainWindow方法使进程能够有序终止并关闭所有窗口。
如果调用CloseMainWinodw方法失败,则可以使用Kill方法终止进程。
1.网卡的主要工作原理是什么?答:整理计算机上发往网线上的数据,并将数据分解为适当大小的数据包之后向网络上上传。
5分钟!教你⽤C语⾔发送邮件:附送源码+教学!前⾔相信⼤家都有过被C语⾔⽹络编程所⽀配的恐惧吧?其实,⼩编在刚刚学习这⽅⾯的知识的时候也有这样的感受,并且所有的资料都是从⽹络寻找的,但是,现在你们不同了,因为这篇⽂章将会带你们⼀步步地,写出你们第⼀个使⽤SMTP协议来发送邮件的C语⾔程序,这个和⼩编刚学习的时候可不同呀!⽂章末尾有总结,这是精髓哦⾔归正传,代码写起来!⾸先,这篇⽂章不是讲理论的⽂章,⽽是让你们动⼿实践的⽂章,⽬的在于让各位看官能动⼿写出能编译成功、能成功运⾏、能成功发送邮件的C语⾔程序,这篇⽂章不会涉及太多的理论知识,并且代码也没有经过特别的封装,旨在让各位看官能编写出这个程序,所以看官跟着⽂章动⼿做就可以了。
第⼀步⾸先,引⽤stdio.h、winsock2.h、windows.h(可有可⽆,下⽂讲到),注意,这⾥有⼀个地⽅有很多⼈会出错,如果你要引⽤windows.h的话,就得在引⽤winsock2.h之后才能引⽤windows.h,否则会出现“未定义标识符”的情况,如下图↓这是正确写法错误写法按照错误写法进⾏调试的话,会出现以下错误提⽰↓错误提⽰然后我们再声明⼀个变量和两个函数,变量是⽤来储存服务器返回的数据的,两个函数分别是⽤来创建套接字(socket)和接收服务器返回数据的,这⾥我们声明了⼀个字符型数组,数组⼤⼩我们⽤BUFSIZ代替,这⾥有⼈就会问了:“为什么⽤BUFSIZ作为数组⼤⼩呢?”,答案是:“减轻系统负担”,不理解?没关系,先把代码运⾏起来,然后再慢慢研究。
除了以上步骤,我们还需要写⼊以下两⾏代码,加⼊两个库⽂件,其中User32.lib是可有可⽆的,加⼊User32.lib只是为了能够调⽤MessageBox()函数⽽已。
到这⾥,我们的第⼀步完成了!接下来是第⼆步第⼆步初始化前期的准备⼯作做好了,我们现在开始编写我们要⽤到的函数——socket_connect_server(void),从字⾯的意思上来看,⼤家都应该明⽩这个函数是⼲嘛的吧?没错,它是⽤来创建套接字并连接SMTP服务器的。
实验三 SMTP 邮件发送程序一、实验目的电子邮件 E-Mail 是 Internet 中广泛使用的服务之一,在 Internet 电子邮件系 统中,邮件服务器之间通信采用 SMTP 协议。
理解 SMTP 协议的工作原理 掌握 SMTP 邮件发送程序的编程方法 掌握邮件消息的格式二、实验内容利用 WinSock 编程接口编写 SMTP 邮件发送程序,在用户界面中给出必要 的邮件信息:收件人、标题、内容等,通过 SMTP 协议将邮件发送给指定的接 收人。
通过给自己的邮箱发送邮件的方式,可以登录自己的邮箱,验证发送程序 运行是否正确。
三、实验环境程序运行环境为以太网, 采用 TCP/IP 协议栈, 网络操作系统为 Windows 8, 具有 Internet 连接能力。
程序开发环境为 vs2012。
四、程序设计与实现步骤 1 需求分析 SMTP 发送程序功能为: (1) 具有编写简单文本邮件的界面,包括:收件人、发件人、发送日期、邮件 标题和邮件文本内容。
(2) 具有将界面内容封装成 RFC822 邮件消息格式的能力。
RFC822(Request For Comment)邮件消息由信封、首部、正文三部分组成。
(3) 将邮件消息通过 SMTP 协议发送给目地邮箱。
(4) 登录目的邮箱,检测发送结果是否正确。
步骤 2 SMTP 发送程序开发 用 Visual C++编写 SMTP 发送程序,利用 WinSock 编程接口实现 SMTP 通 信。
发送程序首先显示用户界面使用户可以编辑邮件。
点击发送按钮后,向目标服务器的 TCP 25 号端口建立 TCP 连接,采用 WinSock 编程方式实现。
然后发送 SMTP 命令, DATA 命令后发送邮件消息。
在 SMTP 常用命令如下:命令 HELO/EHLO MAIL FROM RCPT TO 描述 向服务器标识用户身份 开始一个邮递处理,指出邮件发送者 指出邮件接收者DATA RSET SEND QUIT接收程序将 DATA 命令后面的数据作为邮件内容处理,以.结束 中止邮件发送处理 处理邮件发送 结束会话 最后以单独的“.”行作为结束,发送 QUIT 命令,释放 TCP 连接。
C++的SMTP类发送邮件int CMail::sendmail(){int crecv;if(smtplogin()==0){return 0;}//发送mail from 返回250sprintf(m_sendbuff,"%s%s%s","mail from:<",m_user,"@>\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 返回250sprintf(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 返回354sprintf(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;}//发送邮件bodysprintf(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 结束返回250sprintf(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(){//调用成员函数connectif(connect()==0){return 0;}if(recvdata()==0){return 0;}if(strstr(m_recvbuff,"220")==NULL)//220{m_error=UNKNOWEN_ERROR;return 0;}//发送helo 返回250sprintf(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 返回334sprintf(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编码后的用户名,返回334sprintf(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编码后的密码返回235sprintf(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_DGRAMsock_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;}}。
欢迎随意转载:不过请注明出处前言:在网上找了很长时间如何发电子邮件的教程,发现大多数都是不能用的很黑心,要不就是有问题的,烦人,,,所以决定自己写一个C+WinSock+SMTP,不敢藏私,拿出来与大家分享先对协议和端口进行一下说明25端口:25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。
109、110端口:109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端口是为POP3(邮局协议3)服务开放的,POP2、POP3都是主要用于接收邮件的。
实现原理:假设由发件人********************发到****************邮箱,发送过程如下:1.连接smtp服务器, 主机返回:220 Anti-spam GT for Coremail System (126com[20101010])32 32 30 20 31 32 36 2E 63 6F 6D 20 41 6E 74 692D 73 70 61 6D 20 47 54 20 66 6F 72 20 43 6F 7265 6D 61 69 6C 20 53 79 73 74 65 6D 20 28 31 3236 63 6F 6D 5B 32 30 31 30 31 30 31 30 5D 29 0D0A2.查询支持什么指令(注意:有的教程上写的是HELO 其实是不对的。
)发送命令:************************\r\n(发送的命令要以"\r\n"作为结束标识符)返回数据:250-mail250-PIPELINING250-AUTH LOGIN PLAIN250-AUTH=LOGIN PLAIN250-coremail1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UroXVjYUCa0xDr UUUUj250-STARTTLS250 8BITMIME32 35 30 2D 6D 61 69 6C 0D 0A 32 35 30 2D 50 4950 45 4C 49 4E 49 4E 47 0D 0A 32 35 30 2D 41 5554 48 20 4C 4F 47 49 4E 20 50 4C 41 49 4E 0D 0A32 35 30 2D 41 55 54 48 3D 4C 4F 47 49 4E 20 504C 41 49 4E 0D 0A 32 35 30 2D 63 6F 72 65 6D 6169 6C 20 31 55 78 72 32 78 4B 6A 37 6B 47 30 786B 49 31 37 78 47 72 55 37 49 30 73 38 46 59 3255 33 55 6A 38 43 7A 32 38 78 31 55 55 55 55 5537 49 63 32 49 30 59 32 55 72 6F 58 56 6A 59 5543 61 30 78 44 72 55 55 55 55 6A 0D 0A 32 35 302D 53 54 41 52 54 54 4C 53 0D 0A 32 35 30 20 3842 49 54 4D 49 4D 45 0D 0A3.用户登录发送命令:AUTH LOGIN\r\n返回数据:334 dXNlcm5hbWU6 (这是username的base64编码)33 33 34 20 64 58 4E 6C 63 6D 35 68 62 57 55 360D 0A发送帐号:emhhb3J1bnplMTIz (这是zhaorunze123的base64编码)返回数据:334 UGFzc3dvcmQ6 (这是password的base64编码)33 33 34 20 55 47 46 7A 63 33 64 76 63 6D 51 360D 0A发送密码:XXXXXXXXX (这里是zhaorunze123这个帐号的密码的base64编码)返回数据:235 Authentication successful (登录成功)32 33 35 20 41 75 74 68 65 6E 74 69 63 61 74 696F 6E 20 73 75 63 63 65 73 73 66 75 6C 0D 0A4:发送邮箱说明发送命令:MAILFROM:<********************>\r\n返回数据:250 Mail OK32 35 30 20 4D 61 69 6C 20 4F 4B 0D 0A5.目的邮箱说明发送命令:RCPTTO:<****************>\r\n返回数据:250 Mail OK32 35 30 20 4D 61 69 6C 20 4F 4B 0D 0A6.请求发送邮件发送命令:DATA\r\n返回命令:354 End data with <CR><LF>.<CR><LF>33 35 34 20 45 6E 64 20 64 61 74 61 20 77 69 7468 20 3C 43 52 3E 3C 4C 46 3E 2E 3C 43 52 3E 3C4C 46 3E 0D 0A7.发送邮件头和邮件体发送数据:(数据以“<CR><LF>.<CR><LF>”结束)From:********************To:****************Subject: 我是标题MIME-Version: 1.0Have A Test \r\n.\r\n返回数据:250 Mail OK queued as smtp4,jdKowLC7f6SfgapNAfJMBw--.4939S2 1303019935 32 35 30 20 4D 61 69 6C 20 4F 4B 20 71 75 65 7565 64 20 61 73 20 73 6D 74 70 34 2C 6A 64 4B 6F77 4C 43 37 66 36 53 66 67 61 70 4E 41 66 4A 4D42 77 2D 2D 2E 34 39 33 39 53 32 20 31 33 30 3330 31 39 39 33 35 0D 0A8.结束发送数据发送命令:QUIT\r\n接收数据:221 Bye32 32 31 20 42 79 65 0D 0A9.断开连接代码部分:///////////////////////////////////////////////////////////////////// // stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>#include<WinSock2.h>#include<Windows.h>#pragma comment (lib,"Ws2_32.lib")SOCKET CreateConnection(char* pWebsite,int iPort); //创建连接//int DoWhat=0,先发送后接收,1,只发送,2只接收bool SendAndRecvMsg(SOCKET sockClient,char* lpMessage,int Messagelen,int DoWhat,char* recvBuf,int recvBufLen);//发送消息接收消息void CloseSock(SOCKET sockClient);void InitializeWSA();char* WebsiteToIPAddress(char* pWebsite);//网址转IPchar* StringToBase64(char* bString,int len); //asc2字符串转base64bool FormatEmail(char* pFrom,char* pTo,char* pSubject,char* pMessage,__out char* Email);//格式化Emailvoid WINAPI SendEmail( //发送邮件char* pUserNameToSendEmail, //发件箱char* pPassWordToSendEmail, //发件箱的密码char* SMTPService, //发件箱的SMTP服务器char* pTargetEmail, //目标邮箱char* pEmailTitle, //邮件的标题char* pContent //邮件的内容);int GetAsc2Len(char* pString);// TODO: 在此处引用程序需要的其他头文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // stdafx.cpp : 只包括标准包含文件的源文件// 发送邮件的测试.pch 将作为预编译头// stdafx.obj 将包含预编译类型信息#include "stdafx.h"// TODO: 在 STDAFX.H 中// 引用任何所需的附加头文件,而不是在此文件中引用void InitializeWSA(){WSAData wsadata;WSAStartup(MAKEWORD(2,2),&wsadata);}char* WebsiteToIPAddress(char* pWebsite){hostent* ht=gethostbyname( pWebsite);char* IpAddress=(char*)HeapAlloc(GetProcessHeap(),0,32);memset(IpAddress,0,32);sprintf(IpAddress,"%d.%d.%d.%d",*(byte*)(ht->h_addr_list[0]),*(by te*)(ht->h_addr_list[0]+1),*(byte*)(ht->h_addr_list[0]+2),*(byte*)(ht ->h_addr_list[0]+3));return IpAddress;}SOCKET CreateConnection(char* pWebsite,int iPort){//为建立socket对象做准备,初始化环境SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //建立socket对象SOCKADDR_IN addrSrv;char* IpAddress= WebsiteToIPAddress(pWebsite);//printf("%s\n",IpAddress);addrSrv.sin_addr.S_un.S_addr=inet_addr(IpAddress);//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(iPort);int tf = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //向服务器发送请求if(tf!=0){return 0;//printf("链接失败\n");}return sockClient;}bool SendAndRecvMsg(SOCKET sockClient,char* pMessage,int Messagelen,int DoWhat,char* recvBuf,int recvBufLen)//int DoWhat是否接受数据{char lpMessage[256]={0};memcpy(lpMessage,pMessage,Messagelen);printf("\n\n%s \n",lpMessage);if (DoWhat==0){send(sockClient,lpMessage,Messagelen,0);memset(recvBuf,0,recvBufLen);DWORD num=recv(sockClient,recvBuf,recvBufLen,0); //接收数据printf("%s \n",recvBuf);int i=0;while(i!=num){printf("%02X ",recvBuf[i++]);if((i)%16==0){printf("\n");}}printf("\n");}else if (DoWhat==1){send(sockClient,lpMessage,Messagelen,0);}else if (DoWhat==2){memset(recvBuf,0,recvBufLen);DWORD num=recv(sockClient,recvBuf,recvBufLen,0); //接收数据printf("%s \n",recvBuf);int i=0;while(i<num){printf("%02X ",(byte)recvBuf[i++]);if((i)%16==0){printf("\n");}}printf("\n");}return recvBuf;}void CloseSock(SOCKET sockClient){//关闭套接字closesocket(sockClient);WSACleanup();}char* StringToBase64(char* bString,int len)//len是bString的长度,不算结束符\0{int Index=0;byte data[3]={0};char* Base64=(char*)HeapAlloc(GetProcessHeap(),0,(len*4)/3+12);memset(Base64,0,(len*4)/3+12);char* tmp=(char*)HeapAlloc(GetProcessHeap(),0,5);while((Index+3)<=len){memset(data,0,3);memcpy(data,bString+Index,3);memset(tmp,0,5);tmp[0]=(data[0]>>2)&0x3F;tmp[1]=((data[0]<<4)+(data[1]>>4))&0x3F;tmp[2]=((data[1]<<2)+(data[2]>>6))&0x3F;tmp[3]=data[2]&0x3F;lstrcat(Base64,tmp);Index+=3;}memset(tmp,0,5);Index=len%3;if(Index!=0){memset(data,0,3);memcpy(data,bString+len-Index,Index);memset(tmp,0,5);tmp[0]=(data[0]>>2)&0x3F;tmp[1]=((data[0]<<4)+(data[1]>>4))&0x3F;tmp[2]=((data[1]<<2)+(data[2]>>6))&0x3F;tmp[3]=data[2]&0x3F;lstrcat(Base64,tmp);memset(tmp,0,5);Index=3-Index;while(Index--){lstrcat(tmp,"=");}}Index=0;while(Base64[Index]!=0){// //printf("%02d=",Base64[Index]);if(Base64[Index]<=25 && Base64[Index]>=0){Base64[Index]+='A';}else if(Base64[Index]<=51 && Base64[Index]>=26){Base64[Index]-=26;Base64[Index]+='a';}else if(Base64[Index]<=61 && Base64[Index]>=52){Base64[Index]-=4;}else if(Base64[Index]==62){Base64[Index]='+';}else if(Base64[Index]==63){Base64[Index]='/';}else{// MessageBox(0,"转换成Base64出错",&Base64[Index],0);//printf("%02d\n",Base64[Index]);}// //printf("%c\n",Base64[Index]);Index++;}lstrcat(Base64,tmp);HeapFree(GetProcessHeap(),0,tmp);return Base64;}bool FormatEmail(char* pFrom,char* pTo,char* pSubject,char* pMessage,__out char* Email){lstrcat(Email,"From: ");lstrcat(Email,pFrom);lstrcat(Email,"\r\n");lstrcat(Email,"To: ");lstrcat(Email,pTo);lstrcat(Email,"\r\n");lstrcat(Email,"Subject: ");lstrcat(Email,pSubject);lstrcat(Email,"\r\n");lstrcat(Email,"MIME-Version: 1.0");lstrcat(Email,"\r\n");lstrcat(Email,"\r\n");lstrcat(Email,pMessage);lstrcat(Email,"\r\n.\r\n");return 1;}void WINAPI SendEmail(char* pUserNameToSendEmail, //发件箱char* pPassWordToSendEmail, //发件箱的密码char* SMTPService, //发件箱的SMTP服务器char* pTargetEmail, //目标邮箱char* pEmailTitle, //邮件的标题char* pContent //邮件的内容){char* base;char str[1024];InitializeWSA();;SOCKET sockClient=CreateConnection(SMTPService,25);char recvBuf[1024];memset(recvBuf,0,1024);bool tf = SendAndRecvMsg(sockClient,0,0,2,recvBuf,1024);char UserNameToSendEmail[256]={0};sprintf(UserNameToSendEmail,"EHLO %s",pUserNameToSendEmail);lstrcat(UserNameToSendEmail,"\r\n\0");tf = SendAndRecvMsg(sockClient,UserNameToSendEmail,GetAsc2Len(UserNameToSe ndEmail),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0,recvBuf,1024);char pUerName[256]={0};DWORD p=strstr(pUserNameToSendEmail,"@")-pUserNameToSendEmail;memcpy(pUerName,pUserNameToSendEmail,p);base=StringToBase64(pUerName,lstrlen(pUerName));memset(str,0,1024);sprintf(str,"%s\r\n",base);tf = SendAndRecvMsg(sockClient,str,lstrlen(str),0,recvBuf,1024);base=StringToBase64(pPassWordToSendEmail,lstrlen(pPassWordToSendE mail));memset(str,0,1024);sprintf(str,"%s\r\n",base);tf = SendAndRecvMsg(sockClient,str,lstrlen(str),0,recvBuf,1024);char MailFrom[256]={0};sprintf(MailFrom,"MAIL FROM: <%s>\r\n",pUserNameToSendEmail);tf = SendAndRecvMsg(sockClient,MailFrom,lstrlen(MailFrom),0,recvBuf,1024);char RcptTo[256]={0};sprintf(RcptTo,"RCPT TO: <%s>\r\n",pTargetEmail);tf = SendAndRecvMsg(sockClient,RcptTo,lstrlen(RcptTo),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"DATA\r\n",lstrlen("DATA\r\n"),0,recvBuf,10 24);char Email[1024]={0};FormatEmail(pUserNameToSendEmail,pTargetEmail,pEmailTitle,pConten t,Email);tf = SendAndRecvMsg(sockClient,Email,lstrlen(Email),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"QUIT\r\n",lstrlen("QUIT\r\n"),0,recvBuf,10 24);CloseSock(sockClient);return ;}int GetAsc2Len(char* pString){int i=0;while(pString[i++]!=0);return i-1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 发送邮件的测试.cpp : 定义控制台应用程序的入口点。
信息安全基础(习题卷5)第1部分:单项选择题,共152题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]中国电信安全网关最大的差异化是什么?A)云端安全服务B)功能C)性能答案:A解析:2.[单选题]安全网关-审计版本地核心能力是那三个?A)下一代防火墙、入侵防御和防病毒B)流量控制、上网审计溯源、业务级故障定位C)威胁事件回溯、远程人工运维、情报关联分析答案:B解析:3.[单选题]下列说法中属于ISO/OSI七层协议中应用层功能的是( )。
A)拥塞控制B)电子邮件C)防止高速的发送方的数据把低速的接收方淹没D)电子邮件和目录查询答案:D解析:4.[单选题]办理信息工作票延期手续,应在信息工作票的有效期内,由工作负责人向( )提出申请,得到同意后给予办理。
A)业务管理单位B)信息运维单位C)工作票签发人D)工作许可人答案:D解析:5.[单选题]下列( )不属于Linux常用的shell:A)bashB)shC)ashD)bach答案:D解析:6.[单选题]网络中用交换机连接各计算机的这种结构属于( )A)总线结构7.[单选题]Spark的RDD有()个主要的属性。
A)2B)3C)4D)5答案:D解析:8.[单选题]对于发现的不符合项,下列活动哪个不是认证机构必须要做的( )A)要求受审核方在规定期限内进行原因分析B)要求收审核方为消除不符合而采取的必要纠正C)要求收审核方建立纠正措施D)对不符合项的纠正和纠正措施进行现场验证。
答案:D解析:9.[单选题]回应请求与应答ICMP报文的主要功能是A)获取本网络使用的子网掩码B)报告IP数据报中的出错参数C)测试目的主机或路由器的可达性D)将IP数据报进行重新定向答案:C解析:10.[单选题]下列对于路径遍历漏洞说法错误的是()A)路径遍历漏洞的威胁在于web根目录所在的分区,无法跨越分区读取文件。
B)通过任意更改文件名,而服务器支持“~/”,“/..”等特殊符号的目录回溯,从而使攻击者越权访问或者覆盖敏感数据,就是路径遍历漏洞C)路径遍历漏洞主要是存在于Web应用程序的文件读取交互的功能块D)URL,http://127.0.0.1/getfile=image.jpg,当服务器处理传送过来的image.jpg文件名后,Web应用程序即会自动添加完整路径,形如“d://site/images/image.jpg”,将读取的内容返回给访问者答案:A解析:11.[单选题]下列措施中,哪些是风险管理的内容: ( )A)识别风险B)风险优先级评价C)风险化解D)以上都是答案:D解析:12.[单选题]我国在哪一年第一次修订刑法时增加了计算机犯罪的罪名。
C++程序中支持SMTP邮件发送的解决方案荟萃
(1)jwSMTP
C++开发,支持Linux,BSD,Windows,支持附件、多个收件人、抄送密送、MX记录查询或直接发送到SMTP服务器。
支持LOGIN和PLAIN认证,支持Html和纯文本格式。
到2007年后,该项目未做更新。
/projects/jwsmtp/
(2)CPJNSMTPConnection v2.92
这是一个基于MFC的SMTP协议封装类。
支持附件发送、多个收件人、抄送密送,支持HTML邮件。
支持通过SSL发送邮件,支持Gmail。
支持多种认证协议 "AUTH CRAM-MD5", "AUTH LOGIN", "AUTH PLAIN" 和 "AUTH NTLM"。
支持DSN,MDN,STARTTLS
CPJNSMTPConnection需要VC 2005及以上版本编译。
/smtp.html
(3)POCO C++库
POCO C++库提供了网络、加密、数据库、内存管理、文件系统、多线程支持一系列封装,
在网络部分,提供了SMTP支持。
/
(4)Email C++库
这个库功能非常强大,支持POP3和SMTP,除了一般的附件、抄送密送、HTML邮件外,还支持HTTP代理、SOCKS4,SOCKS5代理。
但该库不开源,需要收费,价格在100美元左右。
/email-library.asp
(5)支持SSL/TLS的SMTP封装类
/KB/IP/smtp_ssl.aspx
(6)一个简单的SMTP封装类
/KB/IP/CSmtp.aspx
在VC6下可以编译。