本节课接着上节课的内容,继续讲如何用python群发邮件。内容分为三部分:
- 丰富邮件头
- 丰富正文内容
- 群发邮件
1、丰富邮件头
邮件头(header)这一区域包含了主题、发件人、收件人等信息。想要在邮件头中写入信息,需要用到以下代码:
from email.header import Header
msg['From'] = Header('xxx')
msg['To'] = Header('xxx')
msg['Subject'] = Header('xxx')
第一行代码是从email模块中引入Header()方法,用来构建邮件头。第三到五行代码分别对应邮件头中的发件人邮箱、收件人邮箱和邮件主题。根据上节课的内容,填写邮件头代码,如下:
from email.header import Header
#邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
你可以自己动手,将上面的代码和上节课的代码合并后运行,看看收到的邮件有什么不同。除此之外,你还可以自定义内容,如下:
from email.header import Header
#邮件头信息
msg['From'] = Header('小火龙')
msg['To'] = Header('杰尼龟')
msg['Subject'] = Header('PMKEMON GO!')
2、丰富正文内容
如果邮件内容很长,可以先设置一个变量,然后将内容赋值给变量,如下:
text = 'send by python'
msg = MIMEText(text,'plain','gbk')
如果邮件内容需要展示多行,可以在内容前后使用三引号【'''】,如下:
text = '''你好!
很高兴你能坚持学到本节课。
python并不难,T
我们每个人都能学会。
学会的秘诀在于两个词:
坚持、实践
'''
msg = MIMEText(text,'plain','gbk')
3、群发邮件
群发邮件可以通过很多种方法实现,这里只讲两种,分别是while循环和调用csv模块。
(1)while循环
需要定义一个空列表to_addrs用来存放收件人邮箱地址,在输入地址时将地址通过append()函数写入列表。因为循环次数不固定,所以选择用while循环。代码如下:
to_addrs = []
while True:
a = input('请输入收件人邮箱:')
to_addrs.append(a)
b = input('是否继续输入,按任意键继续,按n键退出:')
if b == 'n':
break
这时运行代码,程序会报错。除了未将【msg['To'] = Header(to_addr)】中的to_addr改为to_addrs外,还有一个问题。Header()中接受的参数必须是字符串类型,不能是列表。那该怎么办呢?
这时要用到join()函数,它的作用是将字符串拼接起来,用法是【str.join(sequence)】。str代表用来连接的字符串,也可以是逗号、空格等。这里我们要将列表中的元素合并,并用逗号连接。代码如下:
msg['To'] = Header(','.join(to_addrs))
用代码【print(type(','.join(to_addrs)))】验证下,发现打印出的类型是str。将上节课的内容和本节课的内容合并,代码如下:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#发件人信息
from_addr = input('请输入发件邮箱登录用户名')
password = input('请输入发件邮箱授权码')
#收件人邮箱
to_addrs = []
while True:
a = input('请输入收件人邮箱:')
to_addrs.append(a)
b = input('是否继续输入,按任意键继续,按n键退出:')
if b == 'n':
break
#邮件正文
text = '''你好!
很高兴你能坚持学到本节课。
python并不难,T
我们每个人都能学会。
学会的秘诀在于两个词:
坚持、实践
'''
msg = MIMEText(text,'plain','gbk')
#邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(','.join(to_addrs))
msg['Subject'] = Header('python test')
#调用smtplib模块中的SMTP协议
server = smtplib.SMTP()
#指定连接服务器的域名和端口
server.connect('smtp.qq.com',25)
#输入用户名和授权码,登录邮箱
server.login(from_addr,password)
#输入发件人、收件人和邮件内容,发送邮件
server.sendmail(from_addr,to_addrs,msg.as_string())
#关闭服务器
server.quit()
运行上面的代码,分别输入发件箱地址、授权码和收件箱地址,即可成功发送。下面来看看另一种群发邮件的方法。
(2)调用csv模块
在文件夹中新建一个csv文件,在里面写入收件人地址并保存,然后通过csv模块的功能逐行读出文件中的数据。代码如下:
#从csv文件中读取收件人数据
import csv
with open(r'C:UsersGTDesktoptestmail','r') as file:
reader = csv.reader(file)
for i in reader:
to_addrs = i
同样,将之前的代码合并,如下:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
import csv
#发件人信息
from_addr = input('请输入发件邮箱登录用户名')
password = input('请输入发件邮箱授权码')
#邮件正文
text = '''你好!
很高兴你能坚持学到本节课。
python并不难,T
我们每个人都能学会。
学会的秘诀在于两个词:
坚持、实践
'''
msg = MIMEText(text,'plain','gbk')
#邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(','.join(to_addrs))
msg['Subject'] = Header('python test')
#从csv文件中读取收件人数据,然后发送邮件
with open(r'C:UsersGTDesktoptestmail','r') as file:
reader = csv.reader(file)
for i in reader:
to_addrs = i
#调用smtplib模块中的SMTP协议
server = smtplib.SMTP()
#指定连接服务器的域名和端口
server.connect('smtp.qq.com',25)
#输入用户名和授权码,登录邮箱
server.login(from_addr,password)
#输入发件人、收件人和邮件内容,发送邮件
server.sendmail(from_addr,to_addrs,msg.as_string())
#关闭服务器
server.quit()
其实也可以在python中调用csv模块中的writer()函数写入收件人邮箱,然后再通过上面的代码读取邮箱后发送,只是那样较第一种方法更为复杂。不如建立一个存储邮箱的csv文件,然后从中读取邮箱地址,如果有新增地址可以直接在csv文件中增加。
最后。我们还可以给这个程序加一段异常处理代码,对于发送失败的情况进行提示,需要使用【try...except...】语句,代码如下:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
#发件人信息
from_addr = input('请输入发件邮箱登录用户名')
password = input('请输入发件邮箱授权码')
#收件人邮箱
to_addrs = []
while True:
a = input('请输入收件人邮箱:')
to_addrs.append(a)
b = input('是否继续输入,按任意键继续,按n键退出:')
if b == 'n':
break
#邮件正文
text = '''你好!
很高兴你能坚持学到本节课。
python并不难,T
我们每个人都能学会。
学会的秘诀在于两个词:
坚持、实践
'''
msg = MIMEText(text,'plain','gbk')
#邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(','.join(to_addrs))
msg['Subject'] = Header('python test')
try:
#调用smtplib模块中的SMTP协议
server = smtplib.SMTP()
#指定连接服务器的域名和端口
server.connect('smtp.qq.com',25)
#输入用户名和授权码,登录邮箱
server.login(from_addr,password)
#输入发件人、收件人和邮件内容,发送邮件
server.sendmail(from_addr,to_addrs,msg.as_string())
#关闭服务器
server.quit()
print('邮件发送成功!')
except:
print('邮件发送失败!')
本节课的内容就到这里,其实邮件正文除了文本外还可以有图片,邮件中也可以携带附件。因为操作有些复杂,所以不打算放在课程中讲述。需要了解的读者可以在公众号中回复【群发邮件】查看。