前言
本人编程基础很薄弱,单纯的学习语法的过程也让人觉得十分枯燥。所以试图利用python做一些实际的操作来激励自己往下深入学习。并且根据大多数人的经验,基于实际的项目来学习编程是最快最有效的方式。
正文
Python有两个内置库:smtplib和email,能够实现邮件功能,smtplib库负责发送邮件,email库负责构造邮件格式和内容。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
import smtplib
import email
# 负责构造文本
from email.mime.text import MIMEText
# 负责构造图片
from email.mime.image import MIMEImage
# 负责将多个对象集合起来
from email.mime.multipart import MIMEMultipart
from email.header import Header
# SMTP服务器,这里使用163邮箱
mail_host = "smtp.163.com"
# 发件人邮箱
mail_sender = "13161*****@163.com"
# 邮箱授权码,注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程
mail_license = "TQZJOEZ********"
# 收件人邮箱,可以为多个收件人
mail_receivers = ["32608****@qq.com"]
# 邮箱密码
mail_pass = "*********"
mm = MIMEMultipart('related')
# 邮件主题
subject_content = """Python邮件测试"""
# 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱
mm["From"] = "sender_name<13161609939@163.com>"
#mm["From"] = Header("菜鸟教程", 'utf-8')
# 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱
mm["To"] = "receiver_1_name<326084642@qq.com>"
#mm['To'] = Header("测试", 'utf-8')
# 设置邮件主题
mm["Subject"] = Header(subject_content,'utf-8')
msgAlternative = MIMEMultipart('alternative')
mm.attach(msgAlternative)
# 邮件正文内容
body_content = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.runoob.com">这是一个链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
# 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式
message_text = MIMEText(body_content,"html","utf-8")
# 向MIMEMultipart对象中添加文本对象
msgAlternative.attach(message_text)
# 指定图片为当前目录
fp = open('D:\\deng\\6.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
mm.attach(msgImage)
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('D:\\deng\\123.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="123.txt"'
mm.attach(att1)
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.set_debuglevel(1)
smtpObj.login(mail_sender,mail_license)
smtpObj.sendmail(mail_sender, mail_receivers, mm.as_string())
print("邮件发送成功")
smtpObj.quit()
except smtplib.SMTPException:
print("Error: 无法发送邮件")
效果如下图
如何获取邮箱授权码?
以163为例,点击设置->POP3/SMTP/IMAP。可以看到“开启服务”的状态。先点击关闭,然后再重新开启SMTP服务,就能获得邮箱授权码。
参考
python菜鸟教程干货 | 解放双手,用Python实现自动发送邮件