利用Python的smtp和email模块发送邮件
最近,开始学习python,因为从未接触过python,所以这几天抽时间看了一下基础知识,然后就看到了python邮件这一块。
因为使用qq邮箱发送,所以也碰到了一些问题。所以,在此对使用python,利用qq邮箱发送邮件做一个总结,希望能够帮助到大家。
准备工作
进入qq邮箱
进入设置 - 账户
开启POP3/SMTP (这里一步一步来就行了)
在开启SMTP服务的时候,一定要记住系统所提供的授权码。如果忘记了可以点击 生成授权码 重新获取。
具体我们可以查看:什么是授权码?
代码实现
Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。
- 构件一封纯文本的邮件
# 导入email模块
from email.mime.text import MIMEText
# 创建邮件
message = MIMEText('hello, send by Python...', 'plain', 'utf-8')
"""
构建MIMEText时,我们要注意:
1. 第一个参数就是邮件正文
2. 第二个参数是MIME的subtype,传入'plain',最终的MIME就是'text/plain'。
3. 最后一定要用utf-8编码保证多语言兼容性。
"""
- 通过SMTP发送邮件
# 导入smtplib模块
import stmplib
# smtp server
smtp_server = "smtp.qq.com"
# dmtp 端口号
smtp_port = 465
"""
这里我们要注意几点:
1. QQ邮箱的smtp server为:smtp.qq.com
2. smtp端口号通常为25,但是qq要求为465
"""
# 发件人地址
from_address = "xxxxxxxxx@qq.com"
# 发件人密码(注意,这里的密码就是上面我们提到的 授权码 )
password = "xxxxxxxx"
# 收件人地址
receiver_address = "xxxxxxxx@qq.com"
# 普通的,我们使用SMTP即可,而QQ要求SMTP_SSL
smtpObject = smtplib.SMTP_SSL(smtp_server, smtp_port)
# set_debuglevel(1)打印出和SMTP服务器交互的所有信息
smtpObject.set_debuglevel(1)
# 登录到SMTP服务器
smtpObject.login(from_address, password)
# 发送邮件(一次可以发送给多个人,所以传入一个list)
smtpObject.sendmail(from_address, [receiver_address], message.as_string()) # as_string()把MIMEText对象变成str
smtpObject.quit()
发送成功
源码
我们可以看到,发送邮件时对发件人、收件人、主题都 没有设置。
因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件。
# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
import smtplib
# smtp基本信息
smtp_server = "smtp.qq.com"
smtp_port = 465
# 邮件基本信息
from_address = "xxxxxxxx@qq.com"
password = "xxxxxxxx"
receiver_address = "xxxxxx@qq.com"
# 邮件构造
message = MIMEText("Hello, I am sending email by python", "plain", "utf-8")
message["From"] = Header("Python小白", "utf-8")
message["To"] = Header(receiver_address, "utf-8")
message["Subject"] = Header("来自Python SMTP的问候...", "utf-8")
# 发送邮件
smtpObject = smtplib.SMTP_SSL(smtp_server, smtp_port)
smtpObject.set_debuglevel(1)
smtpObject.login(from_address, password)
smtpObject.sendmail(from_address, [receiver_address], message.as_string())
smtpObject.quit()
最后,通过以上部分,不出什么以外的话,我们就可以通过Python发送一封完整的邮件啦。
重点就是QQ邮箱的特殊性了,SSL的要求以及端口号的不同都是我们需要注意的问题。