Python 发送邮件
1. 简介
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 它是一组用于传送邮件的规则,由它来控制信件的中转方式。
Python 的 smtplib 模块对 smtp 协议进行了简单的封装,提供了一种方便的途径发送电子邮件。
2. 配置发送服务器
2.1 简介
在本节的例子中,使用 QQ 邮箱的 SMTP 服务发送邮件,需要对 QQ 邮件发送进行配置。
本节的例子中,假设用户的信息如下:
用户邮件地址,假设为 zhangsan@qq.com
使用 SMTP 服务的密码,需要对 QQ 邮件进行配置后获取,注意:不是登录 QQ 邮箱的密码
2.2 进入设置界面
需要在 PC 端通过浏览器登录 QQ 邮箱:
点击设置,进入邮箱设置
在邮箱设置中,点击账户
2.2 设置 POP3/SMTP 发送服务器
在账户设置的 TAB 页面中,选择 “开启服务:POP3/SMTP 服务”。
2.3 通过短信开启 POP3/SMTP 服务
选择 开启服务:POP3/SMTP 服务后,系统提示通过发送短信开启 POP3/SMTP 服务
2.4 获取 SMTP 服务密码
按照系统提示操作后,系统会给出使用 SMTP 服务的密码,请记住该服务密码,在后续的小节中会使用该密码。
3. 发送文本格式的邮件
import smtplibfrom email.header import Headerfrom email.mime.text import MIMEText
导入 smtplib 用于发送邮件
导入类 Header 和 MIMEText 用于构造邮件
fromAddr ='zhangsan@qq.com'password = 'password for smtp'toAddr ='zhangsan@qq.com'subject = 'hello world'content = '你好,世界'
fromAddr 为发送邮件地址
toAddr 为目的邮件地址,设置成与发送邮件地址相同,表示向自己发送一封邮件
password 是使用 SMTP 服务的密码,不是 QQ 邮箱的登录密码,请查看第 2 小节
subject 是邮件标题
content 是邮件内容
def makeMail():mail = MIMEText(content, 'plain', 'utf-8') mail['From'] = Header(fromAddr, 'utf-8')mail['To'] = Header(toAddr, 'utf-8')mail['Subject'] = Header(subject, 'utf-8')return mail
在第 1 行,函数 makeMail() 根据 fromAddr、toAddr、subject、content 构造一封邮件
在第 2 行,使用 MIMEText 构造一个文本格式的邮件
MIMEText 的第二个参数 plain,表示邮件的内容是文本格式
在第 3 行,构造邮件头 From
在第 4 行,构造邮件头 To
在第 5 行,构造邮件头 Subject
def sendMail(mail):server = smtplib.SMTP_SSL(smtp.qq.com)server.login(fromAddr, password)server.sendmail(fromAddr, toAddr, mail.as_string()) server.quit()
在第 1 行,函数 sendMail 调用 SMTP 服务发送邮件 mail
在第 2 行,获取 SMTP 服务器,使用 QQ 发送服务
在第 3 行,登录 SMTP 服务
在第 4 行,通过 SMTP 服务器发送服务
mail = makeMail()sendMail(mail)print('发送邮件成功')
运行程序,在 QQ 邮箱中收到邮件:
4. 发送 html 格式的邮件
import smtplibfrom email.header import Headerfrom email.mime.text import MIMEText
导入 smtplib 用于发送邮件
导入类 Header 和 MIMEText 用于构造邮件
fromAddr ='zhangsan@qq.com'password = 'password for smtp'toAddr ='zhangsan@qq.com'subject = 'hello with html content'content = '<b>Please click</b> <a href=https://www.imooc.com>imooc</a>'
fromAddr 为发送邮件地址
toAddr 为目的邮件地址,设置成与发送邮件地址相同,表示向自己发送一封邮件
password 是使用 SMTP 服务的密码,不是 QQ 邮箱的登录密码,请查看第 2 小节
subject 是邮件标题
content 是邮件内容,例子中使用 HTML 格式的文本
def makeMail():mail = MIMEText(content, 'html', 'utf-8') mail['From'] = Header(fromAddr, 'utf-8')mail['To'] = Header(toAddr, 'utf-8')mail['Subject'] = Header(subject, 'utf-8')return mail
在第 1 行,函数 makeMail() 根据 fromAddr、toAddr、subject、content 构造一封邮件
在第 2 行,使用 MIMEText 构造一个文本格式的邮件
MIMEText 的第二个参数 html,表示邮件的内容是 HTML 格式
在第 3 行,构造邮件头 From
在第 4 行,构造邮件头 To
在第 5 行,构造邮件头 Subject
def sendMail(mail):server = smtplib.SMTP_SSL(smtp.qq.com)server.login(fromAddr, password)server.sendmail(fromAddr, toAddr, mail.as_string()) server.quit()
在第 1 行,函数 sendMail 调用 SMTP 服务发送邮件 mail
在第 2 行,获取 SMTP 服务器,使用 QQ 发送服务
在第 3 行,登录 SMTP 服务
在第 4 行,通过 SMTP 服务器发送服务
mail = makeMail()sendMail(mail)print('发送邮件成功')
运行程序,在 QQ 邮箱中收到邮件:
5. 发送带有附件的邮件
5.1 附件 hello.c
在当前目录下,创造文件 hello.c,内容如下:
#include <stdio.h>int main(){printf(hello\n);return ;}
5.2 发送带有附件的邮件
import smtplibfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart
导入 smtplib 用于发送邮件
导入类 Header 和 MIMEText 用于构造邮件
导入类 MIMEMultipart 用于构造带有附件的邮件
fromAddr ='zhangsan@qq.com'password = 'password for smtp'toAddr ='zhangsan@qq.com'subject = 'hello with attachment'content = '你好,请查收附件'
fromAddr 为发送邮件地址
toAddr 为目的邮件地址,设置成与发送邮件地址相同,表示向自己发送一封邮件
password 是使用 SMTP 服务的密码,不是 QQ 邮箱的登录密码,请查看第 2 小节
subject 是邮件标题
content 是邮件内容
def makeAttachment(filename):file = open(filename, 'rb')blob = file.read()attachment = MIMEText(blob, 'base64', 'utf-8')attachment[Content-Type] = 'application/octet-stream'attachment[Content-Disposition] = 'attachment; filename=%s' % filenamereturn attachment
在第 1 行,函数 makeAttachment 构造一个附件
在第 2 行到第 3 行,读取当前目录下的文件 filename 的内容
在第 3 行,构造附件对象 attachment
在第 4 行到第 5 行,设置附件属性
def makeMail():mail = MIMEMultipart()mail['From'] = Header(fromAddr, 'utf-8')mail['To'] = Header(toAddr, 'utf-8')mail['Subject'] = Header(subject, 'utf-8')mail.attach(MIMEText(content, 'plain', 'utf-8'))return mail
在第 1 行,函数 makeMail() 根据 fromAddr、toAddr、subject、content 构造一封邮件
在第 2 行,使用 MIMEMultipart 构造一个带有附件的邮件
在第 3 行,构造邮件头 From
在第 4 行,构造邮件头 To
在第 5 行,构造邮件头 Subject
在第 6 行,设置邮件的正文 content
def sendMail(mail):server = smtplib.SMTP_SSL(smtp.qq.com)server.login(fromAddr, password)server.sendmail(fromAddr, toAddr, mail.as_string()) server.quit()
在第 1 行,函数 sendMail 调用 SMTP 服务发送邮件 mail
在第 2 行,获取 SMTP 服务器,使用 QQ 发送服务
在第 3 行,登录 SMTP 服务
在第 4 行,通过 SMTP 服务器发送服务
mail = makeMail()attachment = makeAttachment('hello.c')mail.attach(attachment)sendMail(mail)print('发送邮件成功')
在第 2 行,构造一个附件 hello.c
在第 3 行,将附件加入到邮件中
运行程序,在 QQ 邮箱中收到邮件: