几乎所有编程语言都支持发送和接收电子邮件,Python也不例外。本节我们将学习使用Python来发送邮件。
一、电子邮件发送流程
假设我们自己的电子邮件地址是xxx@163.com,对方的电子邮件地址是xxx@qq.com,现在我们用邮件客户端软件(如
Outlook
或者Foxmail
)写好邮件,填上对方Email地址,点击“发送”,电子邮件就发送出去了。邮件客户端软件被称为MUA(Mail User Agent——邮件用户代理),Email从邮件用户代理(MUA)发送出去,不是直接到达对方电脑,而是发到MTA(Mail Transfer Agent——邮件传输代理),就是那些Email服务提供商,如网易、新浪等等。由于我们自己的电子邮件是
163.com
,所以,Email首先被投递到网易提供的MTA,再由网易的MTA发到对方服务商,也就是腾讯的MTA。这个过程中间可能还会经过别的MTA,但是我们不关心具体路线,我们只关心速度。Email到达腾讯的MTA后,由于对方使用的是qq.com的邮箱,因此,腾讯的MTA会把Email投递到邮件的最终目的地MDA(Mail Delivery Agent——邮件投递代理)。Email到达MDA后,就静静地躺在腾讯的某个服务器上,存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为电子邮箱。对方要取到邮件,必须通过MUA从MDA上把邮件取到自己的电脑上。简单总结上述内容,一封电子邮件的旅程就是:
发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人
有了上述基本概念,要编写程序来发送和接收邮件,本质上就是:
1.编写MUA把邮件发到MTA;
2.编写MUA从MDA上收邮件。
发邮件时,MUA和MTA使用的协议就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一个MTA也是用SMTP协议。
收邮件时,MUA和MDA使用的协议有两种:①POP:Post Office Protocol,目前版本是3,俗称POP3;②IMAP:Internet Message Access Protocol,目前版本是4,优点是不但能取邮件,还可以直接操作MDA上存储的邮件,比如从收件箱移到垃圾箱,等等。
二、开通邮箱授权码
1. QQ邮箱授权码获取(QQ邮箱-->其他邮箱)
用第三方客户端登录QQ邮箱时不是用QQ邮箱密码,而是要使用授权码,那么如何获取QQ邮箱授权码呢?这个授权码获取步骤为:QQ邮箱网页版进入设置—>账户—>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务—>点击POP3/SMTP服务后边的开启按钮—>进入验证密保页面,可以选择使用密保手机发短信“配置邮件客户端”到1069 0700 69,发送完成后,点击我已发送—>验证通过后生成一组16位授权码,页面弹窗显示验证码,注意保存。
在第三方邮箱客户端上设置QQ邮箱时就拿它当邮箱密码输入,但QQ邮箱的真正密码并没有改变,还是原来的密码。不用每一次登录都要重新生成授权码,已经使用的授权码可一直使用,直到更改QQ密码或邮箱密码,才会使旧的授权码过期,需要重新获取。
2.网易邮箱获取授权码(网易邮箱-->其他邮箱)
网易邮箱开启POP3协议获得授权码步骤为:登录网易邮箱—>设置—>POP3/SMTP/IMAP—>在弹出的页面中勾选POP3/SMTP服务—>勾选之后系统会立刻弹出一个提醒界面,选择“确定”即可!—>在新弹出的授权界面中将授权码设置为“开启”模式—>由于获取授权码需要接收手机验证,因此建议大家在操作之前先将手机绑定一下!—>获取验证码之后我们将验证码输入就可以开始设置授权码—>进入授权码设置界面,自定义授权码之后使用“确定”按钮保存即可—>授权码设置好之后会出现提示界面,在这里直接使用“确定”按钮进行关闭,不用点击别的项目!
注:验证码每天好像只能输入3次,请在确定手机能收取短信的情况下获取验证码!
三、SMTP发送邮件
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。Python对SMTP支持有smtplib
和email
两个模块,email
负责构造邮件,smtplib
负责发送邮件。
1.纯文本邮件
#构造最简单的纯文本邮件:QQ邮箱 —>网易邮箱 ''' 控制台输入参数说明: from_addr:用户qq邮箱名,xxx@qq.com passwoed:16位qq邮箱授权码 to_addr:用户163邮箱名,xxx@163.com smtp_server:qq SMTP服务器地址(即要发到哪个MTA上):smtp.qq.com,如果是网易邮箱—>QQ邮箱,改为smtp.163.com ''' from email.mime.text import MIMEText #1.构造纯文本文件 #构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示