使用python内置包、模块smtplib、email实现自动化、集群式发邮件,其中email负责构造邮件,smtplib负责发送邮件。
1、smtplib模块函数及参数详解
import smtplib
server = smtplib.SMTP()
server.connect(host, port)
server.login(username, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
注意;在本地新建.py文件时候,不能命名为email.py,而且你存放这个py文件的文件夹里,也不能email.py。这是由于我们后面要调用email模块,如果将文件也命名为email,会造成报错。
1.1、smtplib.SMTP.方法
SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协议”的意思,SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。可以简单理解为:我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
在模块smtplib中,SMTP为定义的一个类:
class SMTP_SSL(SMTP):
default_port = SMTP_SSL_PORT
def __init__(self, host='', port=0, local_hostname=None,
keyfile=None, certfile=None,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
source_address=None, context=None):
1.2、connect(host, port)方法
host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
端口也可在邮箱端进行设置,并查看IMAP/SMTP服务是否开启。
1.3、login(username, password) 方法
在开启SMTP服务后,会生成授权码保存使用,此处的passwrd即为此码,非邮箱登录密码
username = 'xxx@qq.com'
password = '你的授权码数字'
server.login(username, password)
#username:登录邮箱的用户名
#password:登录密码/授权码
1.4、sendmail(sender, to_addr, msg.as_string()) 方法
sendmail是“发送邮件”的意思,是发送邮件用的,sendmail()方法需要三个参数:发件人,收件人和邮件内容。
server.sendmail(from_addr, to_addr, msg.as_string())
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型
2、email包函数及参数详解
from email.mime.text import MIMEText #内容形式为纯文本、HTML页面。
from email.mime.image import MIMEImage # 内容形式为图片。
from email.mime.multipart import MIMEMultipart #多形式组合,可包含文本和附件。
2.1、构建邮件头Header()
标准邮件需要三个头部信息:From , To 和 Subject ,第三到五行代码就提供了这三个信息。
from email.header import Header
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
2.2、构建邮件内容MIMEText()
MIMEText(msg,type,chartset) #MIMEText()方法需要输入三个参数:
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
from email.mime.text import MIMEText
msg = MIMEText('send by python','plain','utf-8')
3、代码结构组织、封装
#1.导入模块
import smtplib from email.mime.text import MIMEText
#2.定义变量
from_addr='xxx@qq.com!
password='你的授权码数字’
to_addr=lxxx@qq.com!
smtp_server='smtp.qq.com’
msg=MIMEText('send by Python','plain','utf-81)
#3.使用方法
server =smtplib.SMTP(smtp_server,465)
server.login(from_addr,password)
server.sendmail(from_addr,to_addr,msg.as_string()
server.quit()
采用模块+变量+方法可以使代码结构更为清晰、可读。
完整代码如下:增加了利用csv模块实现读取邮箱信息。
# 1、引入模块------------------------------
import smtplib# smtplib 用于邮件的发信动作
from email.mime.text import MIMEText# email 用于构建邮件内容
from email.header import Header# 用于构建邮件头
import csv# 引用csv模块,用于读取邮箱信息
# 2、定义变量------------------------------
from_addr = input('请输入登录邮箱:')# 发信方的信息:发信邮箱,邮箱授权码
password = input('请输入邮箱授权码:')
smtp_server = 'smtp.qq.com'# 发信服务器
text='人生不易,在线学技;人生苦短,我用Python!'# 邮件正文
data = [['liaoxuefeng ', 'liaoxuefeng@qq.com'],['kaxi', 'kaxi@qq.com']]# 待写入csv文件的收件人数据
#3、使用方法------------------------------
# 写入收件人数据
with open('to_addrs.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
# 读取收件人数据,并启动写信和发信流程
with open('to_addrs.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
to_addrs=row[1]
msg = MIMEText(text,'plain','utf-8')
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addrs)
msg['Subject'] = Header('python test')
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs, msg.as_string())
server.quit()# 关闭服务器
3.1、可能存在的报错
# ValueError: server_hostname cannot be an empty string or start with a leading dot.
# 因为Python 3.7修改了ssl.py,导致smtplib.SMTP_SSL也连带产生了问题。
# 在括号内加入host参数
server = smtplib.SMTP_SSL(smtp_server)
# smtplib.SMTPException: No suitable authentication method found
# 在登录(login)之前调用starttls()方法就可以了。
server.starttls()