邮件收发的两个模块(module):
- email模块构建邮件
- smtplib模块发送邮件
示意如下:
自学相关模块的本领:网络引擎搜索
- 方式:为使检索精确,我们可以使用+号或者空格连接关键词,也可使用之前学习的and和or来连接。
- 方法:
email模块
用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。
email其实是一个包(package)。模块一般是一个文件,而包是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。Python中的包都必须默认包含一个init.py的文件。
邮件正文对应的导入方式为:
from email.mime.text import MIMEText
# 引入email包中构建文本内容的方法
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
邮件头的写法:
from email.header import Header
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
smtplib模块邮件发送的函数(方法)(来自网络):
总结smtplib发送邮件的函数:
import smtplib
server = smtplib.SMTP()
#server = smtplib.SMTP_SSL()
#如果端口是用SSL加密,请这样写代码。其中server是变量名
server.connect(host, port)
#server.connect('smtp.qq.com', 465) #smtp.qq.com为qq邮箱服务器
#如果出现编码错误UnicodeDecodeError,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')
server.login(username, password)
#username:登录邮箱的用户名
#password:授权码(不是邮箱登录密码)
server.sendmail(sender, to_addr, msg.as_string())
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型
server.quit()
#退出服务器,结束SMTP会话
- host是指定连接的邮箱服务器,你可以指定服务器的域名。通过搜索“xx邮箱服务器地址”,就可以找到;
- port 是“端口”的意思。一般情况下SMTP默认端口号为25。如果25行不通,你可以通过搜索或者去邮箱设置里面查看端口。比如,如果我打算用自己的企业邮箱来发邮件,登录邮箱后,在【设置-选项-POP和IMAP】里面可以看到这些信息;
收发邮件的全流程(邮件正文)
可能的报错信息:
- ValueError: server_hostname cannot be an empty string or start with a leading dot.
将相应代码改为:
# 改动这句代码
server = smtplib.SMTP_SSL()
# 在括号内加入host参数
server = smtplib.SMTP_SSL(smtp_server)
- smtplib.SMTPException: No suitable authentication method found.
在登录(login)之前调用starttls()方法就可以了。即将相应代码改为:
server.starttls()
邮件全文源代码
# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件正文内容
from email.header import Header
# 用于构建邮件头
# 发信方的信息:发信邮箱,QQ邮箱授权码)
from_addr = '[email protected]'
password = '你的授权码数字'
# 收信方邮箱
to_addr = '[email protected]'
# 发信服务器
smtp_server = 'smtp.qq.com'
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
text = '''
希望学习Python对你不是一件困难的事情!
'''
msg = MIMEText(text,'plain','utf-8')
# 邮件头信息:from_addr,to_addr可以自定义
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
# 开启发信服务,这里使用的是SSL加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
群发邮件
列表的方式:
使用str.join()函数将邮箱由列表转为字符串
to_addrs=['mail1','mail2','mail3']
comon=","
addrs_mod=comon.join(to_addrs)
While循环:
通过输入的方式将邮箱逐个加入到事先建立的空列表中
# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')
# 收信方邮箱
to_addrs = []
while True:
a=input('请输入收件人邮箱:')
to_addrs.append(a)
b=input('是否继续输入,n退出,任意键继续:')
if b == 'n':
break
# 发信服务器
smtp_server = 'smtp.qq.com'
text='''亲爱的学员,你好!
希望学习Python对你不是一件困难的事情!
'''
msg = MIMEText(text,'plain','utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(",".join(to_addrs))
msg['Subject'] = Header('python test')
# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addrs, msg.as_string())
# 关闭服务器
server.quit()
调用csv模块
data = [['wufeng ', '[email protected]'],['kaxi', '[email protected]']]
# 写入收件人数据
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()
try...except...语句处理你遇到的问题
try:
server.sendmail(from_addr, to_addrs, msg.as_string())
print('恭喜,发送成功')
except:
print('发送失败,请重试')
什么是SMTP?
SMTP (Simple Mail Transfer Protocol)是“简单邮件传输协议”的意思,SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。
注:此日志来源于风变编程课程。