1、邮件协议介绍
SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol version 3)和 IMAP(Internet Message Access Protocol)是电子邮件系统中使用的三种主要协议。它们各自承担着邮件服务中的不同职责,并且在使用场景和底层原理上有所不同。
-
SMTP 主要是用于发送邮件。
-
POP3 适合那些希望将邮件保存到本地而不占用服务器空间的用户。
-
IMAP 则更适合那些需要在多台设备间保持一致性的用户,因为它允许用户在服务器上管理和检索邮件。
2、邮件相关库
smptlib库:标准库,是互联网上传输电子邮件的标准协议。Python内置的smtplib
模块提供了与SMTP服务器交互的功能,从而实现邮件的发送。
email.mime库:smtplib模块邮件内容主体的扩展,从原先默认只支持纯文本格式扩展到HTML,同时支持附件、音频、图像等格式,smtplib只负责邮件的投递即可。
from email.mime.text import MIMEText #构造一个MIMEText,表示文本邮件对象 #MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码。 from email.mime.image import MIMEImage #构造一个MIMEImage,表示附件的图片邮件对象 from email.mime.multipart import MIMEMultipart #构造一个MIMEMultipart,表示整个邮件
yagmail库:yagmail 是一个 Python 包,旨在简化电子邮件的发送和接收。它建立在 Python 的 smtplib、email 和 keyring 模块之上,提供了一个高级的接口,使电子邮件操作更加容易。yagmail 的设计目标是使电子邮件发送和附件处理变得尽可能简单,同时保持灵活性。
3、smplib
python发送邮件存在以下步骤:登录邮件,编辑邮件内容,发送邮件。流程图参考网上:
(1)smtplib常用方法
-
smtplib.SMTP():初始化 SMTP 对象, 创建一个 SMTP 连接,也可以带上server和port连接到指定邮箱服务器。smtplib.SMTP(host, port)
-
smtplib.SMTP_SSL():初始化 SMTP 对象, 创建一个带有 SSL 加密的 SMTP 连接,也可以带上server和port连接到指定邮箱服务器。smtplib.SMTP_SSL(host, port)
-
SMTP.connect([host[,port]]):smtp对象没有连接到指定服务器可以用connect连接到指定服务器
-
obj.login(user,password):登录 SMTP 服务器。163和qq的password为授权码
-
obj.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]):发送邮件,其中 from_addr 是发件人地址,to_addrs 是收件人地址,msg是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式就是smtp协议中定义的格式。
-
obj.quit():断开与 SMTP 服务器的连接。
-
obj.starttls():启用 TLS 安全传输协议,增加安全性。
-
obj.set_debuglevel(level):设置调试等级,输出调试信息。
通常情况下会使用smtplib.SMTP来实例化,但是有些邮件服务器好多企业邮件是支持安全邮件的,认为它是不安全的而报错,所以需要使用加密过的SMTP_SSL来实例化或者obj.starttls()启动安全传输协议,不可以同时开启ssl和tls。
SMTP邮件服务器常用端口
25:最古老的一个SMTP端口,通过明文传输数据,经常被用来恶意发送垃圾邮件,现在大多数云服务器都会禁用掉25出口。
465:是为SMTPS(SMTP-over-SS)协议开放的,使用SSL加密信息,可以防止黑客截取邮件,但并未得到IETF机构的认证,SMTP/SMTPS之间关系类似于HTTP/HTTPS。
587:TLS/STARTTLS,基于身份验证的,使用该端口的SMTP服务 客户端必须要登录验证身份才能发送邮件,有效的避免垃圾邮件。
邮箱 | SMTP服务器 | 登录口令 | 支持加密方式 | 对应端口号 |
---|---|---|---|---|
163 | smtp.163.com | 个人设置授权码 | 明文/SSL加密 | 25/465 |
126 | smtp.126.com | 个人设置授权码 | 明文/SSL加密 | 25/465 |
smtp.qq.com | 系统分配授权码 | 明文/SSL加密/TLS加密 | 25/465/587 | |
Gmail | smtp.gmail.com | 邮箱登录密码 | TLS加密 | 587 |
4、email.mime
一封Email邮件,不仅仅是有一些字符串组成的内容,它是一个结构,有收件人,发件人,抄送名单,邮件主题等等。要组织好这样一个结构,我们才能发送邮件。而组织Email邮件内容结构的任务,不属于smtplib模块范围,我们需要用到email模块(标准库中的模块)提供的一些工具。
(1)email.mime常用方法
在python中,MIME的这些对象的继承关系如下:
MIMEBase |-- MIMENonMultipart |-- MIMEApplication |-- MIMEAudio |-- MIMEImage |-- MIMEText |-- MIMEMultipart
一般不会用到MIMEBase,而是直接使用它的继承类。MIMEMultipart有attach方法,而MIMENonMultipart没有,只能被attach。MIME有很多种类型,这个略麻烦,如果附件是图片格式,我要用MIMEImage,如果是音频,要用MIMEAudio,如果是word、excel,我都不知道该用哪种MIME类型了,得上google去查。
最懒的方法就是,不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。application/octet-stream表明“这是个二进制的文件,希望你们那边知道怎么处理”,然后客户端,比如qq邮箱,收到这个声明后,会根据文件扩展名来猜测。
-
email.mime.MIMEText()
构造一个文本邮件对象,有三个参数
_text:邮件正文内容,可以是纯文本或HTML格式。
_subtype:邮件正文内容的类型,"plain"(纯文本)、“html”(HTML格式),默认为plain。
_charset:邮件正文内容的编码方式,常用的有"utf-8"、"gbk"等。
-
email.mime.MIMEImage()
MIME