目录
一、邮件服务器和电子邮箱
要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。
二、邮件传输协议
1、SMTP协议
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP)
用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
2、POP3协议
“邮局协议版本3(Post Office Protocol - Version 3)
同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
三、电子邮件的发送和接收过程
通过一张图来说明一封邮件的发送和接收过程,如下图所示:
简单说一下这个邮件收发过程:
1、xdp@sohu.com 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤①
2、sohu的Smtp服务器开始处理xdp@sohu.com 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人gacl@sina.com 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤②
3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为gacl@sina.com 用户的分配的邮箱空间当中。对应于上图的步骤③。
4、xdp@sohu.com 用户将邮件发出去之后,就通知gacl@sina.com 用户去收取。gacl@sina.com 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。
5、POP3服务器从gacl@sina.com 用户的邮箱空间当中取出Email,对应于步骤⑤。
6、POP3服务器将取出来的Email发给gacl@sina.com 用户,对应于步骤⑥。
四、SMTP 协议详解
1、SMTP 发信方法
SMTP 协议是一个简单的邮件传输协议,利用它您可以将邮件发送给别人。此协议使用命令和应答在客户端与服务器之间传输报文。即客户端发出一个命令,服务器返回一个应答。发送方与接收方进行一问一答的交互,由发送方控制这个对话。
使用 SMTP 协议的邮件服务器分为两种:
- 一种为邮件发送服务器,通常叫做 smtpd,需要发件人进行认证。
- 一种为邮件接收服务器,通常叫做 mx,接收外部运营商用户投递给本地用户的邮件。
2、SMTP 的 8 种命令
H E L O, M A I L, R C P T,D ATA 和 Q U I T 命令用于发送邮件:
我们键入m a i l启动用户代理,然后键入主题(s u b j e c t)的提示;键入后,再键入报文的正文。在一行上键入一个句点结束报文,用户代理把邮件传给 M TA,由M TA进行交付。客户主动打开 T C P端口2 5。返回时,客户等待从服务器来的问候报文(应答代码为 2 2 0)。该服务器的应答必须以服务器的完全合格的域名开始。下一步客户用 H E L O命令标识自己。参数必须是完全合格的的客户主机名。M A I L命令标识出报文的发起人。下一个命令, R C P T,标识接收方。如果有多个接收方,可以发多个R C P T命令。邮件报文的内容由客户通过 D ATA命令发送。报文的末尾由客户指定,是只有一个句点的一行。最后的命令Q U I T,结束邮件的交换。
R S E T 命令异常中止当前的邮件事务并使两端复位。丢掉所有有关发送方、接收方或邮件的存储信息。
V R F Y 命令使客户能够询问发送方以验证接收方地址,而无需向接收方发送邮件。
N O O P 命令除了强迫服务器响应一个 O K应答码(2 0 0)外,不做任何事情。
T U R N 命令使客户和服务器交换角色,无需拆除 T C P连接并建立新的连接就能以相反方向发送邮件。
3、SMTP 发信流程
通过 SMTP 协议发送邮件的整体过程如下:
1、客户端 连接到 SMTP 服务器,建立会话。
clientsocket = new QTcpSocket();
clientsocket->connectToHost("smtp.126.com", 25, QTcpSocket::ReadWrite);2、客户端发送一个 HELO 或 EHLO 命令。
【使用 helo 和连接上的 smtp 服务器打声招呼】
3、客户端发送一个 AUTH 认证命令 及 进行 用户登录(使用 smtpd 方式)。
A> 使用 "auth login" 命令登录到 Smtp 服务器
B> 传入 用户名 和 密码 ,必须经过 Base64 加密
4、客户端发送一个 MAIL 命令指定发件人。
mail from:<gacl@sohu.com>
5、客户端发送一个 RCPT 命令指定收件人。
rcpt to:<xdp_gacl@sina.cn>
6、客户端发送一个 DATA 命令,然后输入 邮件正文。
A> 输入"data"命令
data
B> 邮件内容格式:
from:<gacl@sohu.com> ----邮件头
to:<xdp_gacl@sina.cn> ----邮件头
subject:hello ----邮件头
-----空行
hello gacl ----邮件的具体内容
C> 邮件附件:
从上述的 [subject:hello ----邮件头] 往下开始替换:
MIME-Version: 1.0
Content-Type: multipart/mixed;boundary=@boundary@ ----见下【注1】
-----空行
--@boundary@\r\nContent-Type: text/plain;charset="gb2312"
-----空行
hello gacl ----邮件的具体内容
--@boundary@
Content-Type: application/octet-stream;
name="文件名称"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="文件名称"
-----空行
要上传文件的 Byte 数据流
--@boundary@--End--
7、客户端发送一个 . 命令(点命令)表示 DATA 命令结束。
.
8、客户端发送一个 QUIT 命令结束会话。
quit
【注1】
Content-Type 常见有三种:
multipart/mixed、multipart/related、multipart/alternative;
他们的范围是依次包含关系,mixed 包含 related,related 包含 alternative
+------------------------- multipart/mixed ----------------------------+ | | | +----------------- multipart/related ------------------+ | | | | | | | +----- multipart/alternative ------+ +----------+ | +------+ | | | | | | 内嵌资源 | | | 附件 | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | 纯文本正文 | | 超文本正文 | | | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | | 内嵌资源 | | | 附件 | | | | +----------------------------------+ +----------+ | +------+ | | | | | | +------------------------------------------------------+ | | | +------------------