本文将使用Python从零实现一个简易的邮件客户端,通过本文你将对SMTP协议有更深入的了解,同时掌握使用Python实现标准协议的经验。
我们将开发一个简单的邮件客户端,将邮件发送给任意收件人。我们的客户端将需要连接到邮件服务器(QQ邮件服务器),使用SMTP协议与邮件服务器进行对话,并向邮件服务器发送电子邮件。
Python提供了一个名为smtplib
的模块,它内置了使用SMTP协议发送邮件的方法。但是我们不会使用此模块,因为它隐藏了SMTP和套接字编程的细节,我们将完全从零开始实现自己的邮件客户端。
1.基本邮件客户端
我们先来了解SMTP客户和SMTP服务器之间交换报文时在客户端需要发送哪些命令,服务器又是如何对每个命令作出回答,其中每个回答含有一个响应码和英文解释。
命令 | 含义 | 响应码及其英文解释 |
---|---|---|
HELO <domain><CRLF> | HELLO的缩写,客户端为标识自己的身份而发送的命令,通常带域名 | 220 <domain> Service ready |
MAIL FROM: <reverse-path><CRLF> | 标识邮件的发件人,<reverse-path>为发送者的地址,此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化 | 250 Requested mail action okay, completed |
RCPT TO: <forward-path><CRLF> | 标识邮件的收件人,<forward-path>为收件人的地址 | 250 Requested mail action okay, completed |
DATA<CRLF> | 标识邮件数据传输的开始,<CRLF>.<CRLF>标识数据的结尾,客户端发送的、用于启动邮件内容传输的命令 | 354 Start mail input; end with <CRLF>.<CRLF> |
QUIT<CRLF> | 表示会话的终止 | 221 <domain> Service closing transmission channel |
注意:<CRLF>中的CR和LF分别表示回车和换行。SMTP响应码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功,为5时表示失败,为3时表示没有完成。
以上命令是正常完成一次邮件传输的必不可少的命令,我们将在后面的代码中用到它们,更多的命令这里不做更多的介绍。下面我们来看代码实现:
from socket import *
from base64 import b64encode
global clientSocket
def init():
global clientSocke