python群发邮件 如何用python群发邮件_用户名


本节课接着上节课的内容,继续讲如何用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('邮件发送失败!')


本节课的内容就到这里,其实邮件正文除了文本外还可以有图片,邮件中也可以携带附件。因为操作有些复杂,所以不打算放在课程中讲述。需要了解的读者可以在公众号中回复【群发邮件】查看。