smtp协议简介及C实现邮件发送

上传人:陈** 文档编号:102244564 上传时间:2022-06-06 格式:DOC 页数:29 大小:671.50KB
收藏 版权申诉 举报 下载
smtp协议简介及C实现邮件发送_第1页
第1页 / 共29页
smtp协议简介及C实现邮件发送_第2页
第2页 / 共29页
smtp协议简介及C实现邮件发送_第3页
第3页 / 共29页
资源描述:

《smtp协议简介及C实现邮件发送》由会员分享,可在线阅读,更多相关《smtp协议简介及C实现邮件发送(29页珍藏版)》请在装配图网上搜索。

1、精品范文模板 可修改删除撰写人:_日 期:_SMTP协议分析及实验一:SMTP简介SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是一种提供可靠且有效电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要

2、为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。 SMTP协议发展在20世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP在发送和接收的机器始终都联网的情况下工作得最好。 SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。通常,一个网络可以由公用因特网上TCP可相互间访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP传输层协议组成。

3、使用SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关是实现某处理机与其他网络之间的邮件传输。 在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳IP地址。 Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP 实现为一个客户端(消息的发送者)或一个服务器(消息的接受者)。一些其他的流行的SMTP服务器包括Philip Hazel 的exim,IBM的Postfix,D.J.Bernstein的Qmail,以及Microsoft Exch

4、ange Server. 由于这个协议开始是基于纯ASC文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。 ( 注意:SMTP是一个推的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3或IMAP上。另一个,SMTP服务器可以使用ETRN(Extended Turn,扩展回车)命令在SMTP上触发一个发送。) 垃圾邮件仍然是个重要的问题。原始的SMTP协议的局限之一在于它没有为发送方进行认证的功能。因此

5、定义了SMTP-AUTH 扩展。由于SMTP 巨大安装基础的网络效应,广阔地修改SMTP或者完全替代它被认为是不现实的。Internet Mail 2000 就是这样一个为替换而做的建议。IRTF 的反垃圾邮件研究小组正在研究一些提供简单、灵活、轻量级的、可升级的源端认证的建议。最有可能被接受的建议是Sender Policy Framework 协议。二:协议的工作原理SMTP在邮件通信中的位置如下图所示:1、工作机制:SMTP通常有两种工作模式:发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查

6、询远端邮件服务器的MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。命令和响应都是基于ASC文本,并以CR和LF符结束。响应包括一个表示返回状态的

7、三位数字代码。SMTP在TCP协议25号端口监听连续请求。 2、连接和发送过程如下: (1)建立TCP 连接。 (2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。 (3)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。 (4)协商结束,发送邮件,用命令DATA发送。 (5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。 3、SMTP协议的邮件路由过程:SMTP服务器基于域名服务DNS中计划收件人的域名来路由电子邮件。SMTP服

8、务器基于DNS中的MX记录来路由电子邮件,MX记录注册了域名和相关的SMTP中继主机,属于该域的电子邮件都应向该主机发送。若SMTP服务器 收到一封信要发到shuer,则执行以下过程: (1)Sendmail 请求DNS给出主机的CNAME 记录,如有,假若CNAME(别名记录)到,则再次请求的CNAME记录,直到没有为止。 (2)假定被CNAME到,然后sendmail请求 域的DNS给出的MX记录(邮件路由及记录),shmail MX 5 10 。 (3)Sendmail组合请求DNS给出的A记录(主机名(或域名)对应的IP地址记录),即IP地址,若返回值为1.2.3.4(假设值)。 (4

9、)Sendmail与1.2.3.4连接,传送这封给shuser 的信到1.2.3.4 这台服务器的SMTP后台程序。 三:SMTP的协议命令及常用应用码格式说明命令描述DATA开始信息写作EXPN验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用HELO向服务器标识用户身份,返回邮件服务器身份HELP查询服务器支持什么命令,返回命令中的信息MAIL FROM在主机上初始化一个邮件会话NOOP无操作,服务器应响应OKQUIT终止邮件会话RCPT TO标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to:RSET重置会话,当前传输被取消SAML FROM发送邮件到用户终端和邮箱SEN

10、D FROM发送邮件到用户终端SOML FROM发送邮件到用户终端或邮箱TURN接收端和发送端交换角色VRFY用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令应用码格式说明501参数格式错误502命令不可实现503错误的命令序列504命令参数不可实现211系统状态或系统帮助响应214帮助信息220服务就绪221domain服务关闭421domain服务未就绪,关闭传输信道250要求的邮件操作完成251用户非本地,将转发向forward-path450要求的邮件操作未完成,邮箱不可用550要求的邮件操作未完成,邮箱不可用451放弃要求的操作;处理过程中出错551用户非本地

11、,请尝试forward-path452系统存储不足,要求的操作未执行四:实验分析1、程序运行分析将程序执行后会得到如下图所示结果:上图黄线部分有三层信息:l 220是邮件服务器返回给客户的响应状态码,它表示邮件服务器准备就绪(service ready)。l 表示当前进行的响应的邮件服务器的主机名。l Esmtp表示当前邮件服务器支持扩展SMTP协议。SMTP发送者程序与SMTP接收者程序建立连接后,然后向SMTP接收程序发送问候信息,得到的邮件服务器返回结果如下图:接着输入如下一行命令:auth login得到如下结果:其中,SMTP服务器返回的响应状态码为334,它表示SMTP服务器正在等

12、待客户端输入认证信息。然后,将命令行窗口中,选中经过BASE64编码后得到的用户名,复制过来,然后将BASE64编码的密码复制过来,完成认证后的结果如下图所示:接着将邮件发送者的填写为邮箱地址,得到如下效果图:其中返回一个250的响应状态码,代表当前操作执行成功。而SMTP协议不要求SMTP邮件接收服务器对mail from命令后面输入的邮件地址进行验证,也就是说,mail from命令后面的邮件地址可以不是发件人的真实邮箱地址,而可以是其他人的邮箱地址。将邮件接收者的地址填写完整,得到如下结果:邮件服务器返回一个250的响应状态码,代表当前操作执行成功。而事实上SMTP协议允许在一个连接通道

13、中连接多个收件人完成余下工作得:接着输入data命令,表示后面将传送邮件内容。邮件服务器返回354的响应状态码,并等待客户端输入邮件内容。接着输入邮件内容。最后在单独的一行上输入一个“.”作为邮件内容的结束标记.而最后输入quit命令,结束整个邮件的传输过程。SMTP服务器接收到客户端发送的quit命令后,将断开与客户端的网络连接,Telnet程序结束运行,windows命令行窗口退回到DOS提示符状态。2、数据包分析:下图为实验过程中抓取的SMTP数据包总体截图:1) 建立连接:2) MUA根据提示做出的响应,把本地计算机名发送到SMTP服务器:3)SMTP服务器告诉MUA所支持的功能范围:

14、4) 查询是否支持本域的转发即高速服务器邮件来自QQ,询问是否支持该域的转发:5) 返回通告,如下图,表示支持该域转发。6) 询问是够支持传到该域即QQ:7) 返回通告,表示支持,可以进行下一步。8) 告诉SMTP服务器开始穿数据:9) 通告信息结束控制符是什么。10) 发送邮件:以下是在QQ邮箱里收到的邮件截图:11) 告诉MUA,信息已经接收到,接着返回该邮件在服务器中的队列号:12) 告诉SMTP服务器本次传输结束:13) 服务器给予的回应:至此,整个发送过程结束。五: 附录(发送程序)#ifdef WIN32 #include #include #else #include #incl

15、ude #include #include #include #include #include #endif struct data6 unsigned int d4:6; unsigned int d3:6; unsigned int d2:6; unsigned int d1:6; ; / 协议中加密部分使用的是base64方法 char con628(char c6); void base64(char *dbuf,char *buf128,int len); void sendemail(char *email,char *body); int open_socket(struct

16、sockaddr *addr); int main() char email = 1259705717; char body = From: lucyrn To: dasiyrn Subject: Hellornrn Hello World, Hello Email!; sendemail(email, body); return 0; char con628(char c6) char rtn = 0; if (c6 26) rtn = c6 + 65; else if (c6 52) rtn = c6 + 71; else if (c6 62) rtn = c6 - 4; else if

17、(c6 = 62) rtn = 43; else rtn = 47; return rtn; / base64的实现 void base64(char *dbuf, char *buf128, int len) struct data6 *ddd = NULL; int i = 0; char buf256 = 0; char *tmp = NULL; char cc = 0; memset(buf, 0, 256); strcpy(buf, buf128); for(i = 1; i d1); dbuf(i-1)*4+1 = con628(unsigned int)ddd-d2); dbuf

18、(i-1)*4+2 = con628(unsigned int)ddd-d3); dbuf(i-1)*4+3 = con628(unsigned int)ddd-d4); if(len%3 = 1) tmp = buf+(i-1)*3; cc = tmp2; tmp2 = tmp0; tmp0 = cc; ddd = (struct data6 *)tmp; dbuf(i-1)*4+0 = con628(unsigned int)ddd-d1); dbuf(i-1)*4+1 = con628(unsigned int)ddd-d2); dbuf(i-1)*4+2 = =; dbuf(i-1)*

19、4+3 = =; if(len%3 = 2) tmp = buf+(i-1)*3; cc = tmp2; tmp2 = tmp0; tmp0 = cc; ddd = (struct data6 *)tmp; dbuf(i-1)*4+0 = con628(unsigned int)ddd-d1); dbuf(i-1)*4+1 = con628(unsigned int)ddd-d2); dbuf(i-1)*4+2 = con628(unsigned int)ddd-d3); dbuf(i-1)*4+3 = =; return; / 发送邮件 void sendemail(char *email,

20、 char *body) int sockfd = 0; struct sockaddr_in their_addr = 0; char buf1500 = 0; char rbuf1500 = 0; char login128 = 0; char pass128 = 0; #ifdef WIN32 WSADATA WSAData; WSAStartup(MAKEWORD(2, 2), &WSAData); #endif memset(&their_addr, 0, sizeof(their_addr); their_addr.sin_family = AF_INET; their_addr.

21、sin_port = htons(25); their_addr.sin_addr.s_addr = inet_addr(119.147.74.45);/qq smtp 服务器 / 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接 sockfd = open_socket(struct sockaddr *)&their_addr); memset(rbuf,0,1500); while(recv(sockfd, rbuf, 1500, 0) = 0) printf(reconnect.n); Sleep(2); /close(sockfd); sockfd = open_socket(

22、struct sockaddr *)&their_addr); memset(rbuf,0,1500); printf(%sn, rbuf); / EHLO memset(buf, 0, 1500); sprintf(buf, EHLO abcdefg-PCrn); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / AUTH LOGIN memset(buf, 0, 1500); sprintf(buf, AUTH LOGINrn

23、); send(sockfd, buf, strlen(buf), 0); printf(%sn, buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / USER memset(buf, 0, 1500); sprintf(buf,1259705717);/你的qq号 memset(login, 0, 128); base64(login, buf, strlen(buf); sprintf(buf, %srn, login); send(sockfd, buf, strlen(buf),

24、0); printf(%sn, buf); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / PASSWORD sprintf(buf, *);/你的qq密码,未保密起见,已经密码省去memset(pass, 0, 128); base64(pass, buf, strlen(buf); sprintf(buf, %srn, pass); send(sockfd, buf, strlen(buf), 0); printf(%sn, buf); memset(rbuf, 0, 1500); recv(

25、sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / MAIL FROM memset(buf, 0, 1500); sprintf(buf, MAIL FROM: rn); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / RCPT TO 第一个收件人 sprintf(buf, RCPT TO:rn, email); send(sockfd, buf, strlen(buf), 0); mem

26、set(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / DATA 准备开始发送邮件内容 sprintf(buf, DATArn); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / 发送邮件内容,rn.rn内容结束标记 sprintf(buf, %srn.rn, body); send(sockfd, buf, strlen(buf), 0); m

27、emset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / QUIT sprintf(buf, QUITrn); send(sockfd, buf, strlen(buf), 0); memset(rbuf, 0, 1500); recv(sockfd, rbuf, 1500, 0); printf(%sn, rbuf); / close(sockfd); #ifdef WIN32 WSACleanup(); #endif return; / 打开TCP Socket连接 int open_socket(str

28、uct sockaddr *addr) int sockfd = 0; sockfd=socket(PF_INET, SOCK_STREAM, 0); if(sockfd 0) fprintf(stderr, Open sockfd(TCP) error!n); exit(-1); if(connect(sockfd, addr, sizeof(struct sockaddr) 0) fprintf(stderr, Connect sockfd(TCP) error!n); exit(-1); return sockfd; 当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我

29、要做一个伟大的世人皆知的人。于是,我降临在了人间。我出生在一个官僚知识分子之家,父亲在朝中做官,精读诗书,母亲知书答礼,温柔体贴,父母给我去了一个好听的名字:李清照。小时侯,受父母影响的我饱读诗书,聪明伶俐,在朝中享有“神童”的称号。小时候的我天真活泼,才思敏捷,小河畔,花丛边撒满了我的诗我的笑,无可置疑,小时侯的我快乐无虑。“兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。”青春的我如同一只小鸟,自由自在,没有约束,少女纯净的心灵常在朝阳小,流水也被自然洗礼,纤细的手指拈一束花,轻抛入水,随波荡漾,发髻上沾着晶莹的露水,双脚任水流轻抚。身影轻飘而过,留下一阵清风。可是晚年的我却生活在一片

30、黑暗之中,家庭的衰败,社会的改变,消磨着我那柔弱的心。我几乎对生活绝望,每天在痛苦中消磨时光,一切都好象是灰暗的。“寻寻觅觅冷冷清清凄凄惨惨戚戚”这千古叠词句就是我当时心情的写照。最后,香消玉殒,我在痛苦和哀怨中凄凉的死去。在天堂里,我又见到了上帝。上帝问我过的怎么样,我摇摇头又点点头,我的一生有欢乐也有坎坷,有笑声也有泪水,有鼎盛也有衰落。我始终无法客观的评价我的一生。我原以为做一个着名的人,一生应该是被欢乐荣誉所包围,可我发现我错了。于是在下一轮回中,我选择做一个平凡的人。我来到人间,我是一个平凡的人,我既不着名也不出众,但我拥有一切的幸福:我有温馨的家,我有可亲可爱的同学和老师,我每天平

31、凡而快乐的活着,这就够了。天儿蓝蓝风儿轻轻,暖和的春风带着春的气息吹进明亮的教室,我坐在教室的窗前,望着我拥有的一切,我甜甜的笑了。我拿起手中的笔,不禁想起曾经作诗的李清照,我虽然没有横溢的才华,但我还是拿起手中的笔,用最朴实的语言,写下了一时的感受:人生并不总是完美的,每个人都会有不如意的地方。这就需要我们静下心来阅读自己的人生,体会其中无尽的快乐和与众不同。当我被上帝造出来时,上帝问我想在人间当一个怎样的人,我不假思索的说,我要做一个伟大的世人皆知的人。于是,我降临在了人间。我出生在一个官僚知识分子之家,父亲在朝中做官,精读诗书,母亲知书答礼,温柔体贴,父母给我去了一个好听的名字:李清照。

32、小时侯,受父母影响的我饱读诗书,聪明伶俐,在朝中享有“神童”的称号。小时候的我天真活泼,才思敏捷,小河畔,花丛边撒满了我的诗我的笑,无可置疑,小时侯的我快乐无虑。“兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。”青春的我如同一只小鸟,自由自在,没有约束,少女纯净的心灵常在朝阳小,流水也被自然洗礼,纤细的手指拈一束花,轻抛入水,随波荡漾,发髻上沾着晶莹的露水,双脚任水流轻抚。身影轻飘而过,留下一阵清风。可是晚年的我却生活在一片黑暗之中,家庭的衰败,社会的改变,消磨着我那柔弱的心。我几乎对生活绝望,每天在痛苦中消磨时光,一切都好象是灰暗的。“寻寻觅觅冷冷清清凄凄惨惨戚戚”这千古叠词句就是我当

33、时心情的写照。最后,香消玉殒,我在痛苦和哀怨中凄凉的死去。在天堂里,我又见到了上帝。上帝问我过的怎么样,我摇摇头又点点头,我的一生有欢乐也有坎坷,有笑声也有泪水,有鼎盛也有衰落。我始终无法客观的评价我的一生。我原以为做一个着名的人,一生应该是被欢乐荣誉所包围,可我发现我错了。于是在下一轮回中,我选择做一个平凡的人。我来到人间,我是一个平凡的人,我既不着名也不出众,但我拥有一切的幸福:我有温馨的家,我有可亲可爱的同学和老师,我每天平凡而快乐的活着,这就够了。天儿蓝蓝风儿轻轻,暖和的春风带着春的气息吹进明亮的教室,我坐在教室的窗前,望着我拥有的一切,我甜甜的笑了。我拿起手中的笔,不禁想起曾经作诗的李清照,我虽然没有横溢的才华,但我还是拿起手中的笔,用最朴实的语言,写下了一时的感受:人生并不总是完美的,每个人都会有不如意的地方。这就需要我们静下心来阅读自己的人生,体会其中无尽的快乐和与众不同。第 29 页 共 29 页免责声明:图文来源于网络搜集,版权归原作者所以若侵犯了您的合法权益,请作者与本上传人联系,我们将及时更正删除。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!