Smtp协议与Pop3协议的简单实现
前言
本文主要介绍smtp与pop3协议的原理,后面会附上对其的简单封装与实现。
smtp协议对应的RFC文档为:RFC821
smtp协议
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。(摘自百度百科)
下图为SMTP协议发送邮件过程

用户在发送邮件时,会先按照SMTP协议,将邮件发送到发送者的SMTP服务器上,接着再由发送者SMTP服务器将邮件发送到接收者的SMTP邮件服务器上,最后由接收者通过pop3协议从接收服务器上将邮件下载下来。
举个例子,用户A( aaa@126.com)要向用户B( bbb@qq.com)发送一封邮件,那么邮件会先发送到发送SMTP服务器上即smtp.126.com,然后由smtp.126.com投送到smtp.qq.com,最后再到bbb@qq.com上。
通过以上描述,相信大家对邮件的收发过程有了一个大致的了解。那么接下来,我们来分析SMTP协议。
SMTP协议定义了smtp服务器的端口,连接过程以及发送邮件过程,我们只要按照协议规定的步骤来即可。
首先,我们需要使用socket来连接smtp的端口,默认端口为25。我们可以使用telnet来连接测试。我们在命令行中输入telnet smtp.126.com 25 来连接到网易的126邮箱服务器
建立socket连接后,服务器会向我们返回欢迎信息,如下图所示:

接下来我们要向服务器发送用户名与密码信息来登陆到邮箱服务器。这里需要注意一点的是,smtp协议是基于字符串的,所以我们的用户名与密码要通过base64编码转换,这样就不会出现非法字符问题,后面代码中我会给中base64编码与解码的实现代码。
这里给大家一个在线的base64编码转换的网址,大家可以在上面转码后复制转换后的编码(http://tools.jb51.net/tools/base64_decode-gb2312.php)。
登陆邮件服务器的命令为:
EHLO smtp.126.com\r\n (说明:\r\n代表换行回车操作)
AUTH LOGIN\r\n (说明:登录命令)
bACtNT55A==\r\n (说明base64编码后的用户名)
MTIzYWRmYTEy\r\n (说明base64编码后的密码)

接下来我们不使用MAIL FROM:<xxx@xxxx.com>命令来告知邮件来自哪。然后使用RCPT TO:<xxxx1@xx.com>命令来告知发给谁,RCPT TO 后面只可以接多个RCPT TO表示向给多个接收者。最后使用DATA命令来传送编码后的邮件内容。
在smtp协议中,每条命令以\r\n结束,并且长度小于76,超过部分放入向一条命令。在使用DATA发送命令时,每76个字符一行,直到发送完所有数据。当发送完所有邮件数据时,我们需要告知邮件服务器我们发完数据了。smtp协议里规定,我们在发送完数据后,再发送一个\r\n.\r\n来表明数据发送完毕,示意如下:S代表发送者,R代表接收者,其中注意<CRLF>代表\r\n
S: DATA
R: 354 Start mail input; end with <CRLF>.<CRLF>
S: Blah blah blah...
S: ...etc. etc. etc.
S: <CRLF>.<CRLF>
R: 250 OK
Smtp协议与Pop3协议的简单实现的更多相关文章
- SMTP协议及POP3协议-邮件发送和接收原理(转)
本文转自https://blog.csdn.net/qq_15646957/article/details/52544099 感谢作者 一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 ...
- 使用smtp和pop3 协议收发qq邮箱实验
email系统组件:MTA 消息传输代理,负责邮件的路由,队列和发送SMTP 简单邮件传输协议1 连接到服务器2 登陆3 发出服务请求4 退出POP:邮局协议RFC918 "邮局协议的目的是 ...
- 邮件实现详解(二)------手工体验smtp和pop3协议
上篇博客我们简单介绍了电子邮件的发送和接收过程,对参与其中的邮件服务器,邮件客户端软件,邮件传输协议也有简单的介绍.我们知道电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行传递必须 ...
- centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课
centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 ...
- PHP+socket+SMTP、POP3协议发送、接收邮件
.实现SMTP协议的类dsmtp.cls.php:<?php , $webname=).); } } .实现POP3协议的类dpop3.cls.php: <? ...
- 常用电子邮件协议服务POP3/IMAP/SMTP/Exchange
标题: 常用电子邮件协议服务POP3/IMAP/SMTP/Exchange 作者: 梦幻之心星 347369787@QQ.com 标签: [电子邮件, 服务, 协议] 目录: [客户端] 日期: 20 ...
- C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送
最近在用outlook同步邮件.对邮件协议有一点兴趣.于是就去收集了一些资料,学习了一下如何通过.net来实现邮件的收发. 一:SMTP协议 1.什么是SMTP协议: SMTP目前 ...
- POP3协议分析
http://m.blog.csdn.net/bripengandre/article/details/2192111 POP3协议分析 第1章. POP3概述 POP3全称为Post Off ...
- 搞了一宿,弄完了一个POP3协议
POP3协议和SMTP协议都会了,加上PE文件的读写,APIHOOK,以及远程进程注入,我是不是就可以写个简单点的通过邮件传播的蠕虫病毒了,哈哈哈哈哈哈. 感觉POP3协议挺简单的,比那个该死的SMT ...
随机推荐
- poj 3686 The Windy's
http://poj.org/problem?id=3686 #include <cstdio> #include <cstring> #include <algorit ...
- 尽历磨难,搞定OPEN VSWITCH安装
参考贴: http://sudomakeinstall.com/linux-systems/installing-openvswitch-on-centos-6-6-5 yum install ker ...
- POJ2253 Frogger(最短路)
题目链接. 题意: 从0号点,到1号点,找一条能通过的路,使得这条路中的最大的边,比其它所有可能的路中的边都小. 分析: 这题就是按着dijkstra写,写着写着觉得像是prim了. 其中d[n]表示 ...
- POJ2524 Ubiquitous Religions(并查集)
题目链接. 分析: 给定 n 个点和 m 条无项边,求连通分量的数量.用并查集很简单. #include <iostream> #include <cstdio> #inclu ...
- BZOJ 1010 [HNOI2008]玩具装箱toy
1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7184 Solved: 2724[Submit][St ...
- Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. 比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B. t.join ...
- 一个简单的JUnit项目
本人一直很喜欢JAVA,可是真正接触到JUnit也不过半年.由于公司进行网页测试,采用的是 JUnit+selenium的方式搭建的测试框架,然后采用JAVA语言编写,所以本人也好好研究了一下JUni ...
- 百度——LBS.云 v2.0——创建自己的地理云数据
随着云技术和地理信息(GIS)技术的发展,今年终于进入了.地理分享的新纪元.百度提供了LBS的云存储.真是个不错的功能.下面让我们来看看如何使用吧. 1.注册百度开发者账号(此处略去88个字) 2.创 ...
- TsFltMgr.sys系统蓝屏的原因就在于QQ电脑管家!
同事一WindowsXP系统,正常执行,关闭后,第二天无法启动,详细症状为: (1)安全模式以及带网络功能的安全模式都能够进入: (2)正常模式,还没出现WindowXP滚动栏就開始重新启动: (3) ...
- 导出可执行的jar
1.在你要导出的项目上单击右键,在弹出的右键菜单里选择:Export…选项. 2.在弹出的对话框里选择:,然后点击下边的Next; 3.在弹出的对话框里,点击选择导出后的jar存储路径以及文件名.(其 ...