目标: 想实现群发邮件时,正文文本开头是该收件人的名字。
1.收件人信息的写入:
首先,需要建立一个口袋来存储收件人信息。这次采用的就是CSV这个简单通用的文件格式。用语法写入文件里就好。代码如下↓
'''无注释版'''
import csv #引入CSV模块
with open(r'c:/文件/emails_send.csv','w',newline='',encoding='utf-8-sig') as email_datas:
writer = csv.writer(email_datas)
writer.writerow(['神秘博士','邮箱名称@hotmail.com'])
writer.writerow(['钢铁侠','邮箱名称@163.com'])
writer.writerow(['雷神','邮箱名称@qq.com'])
writer.writerow(['古一法师','邮箱名称@126.com'])
'''注释版'''
import csv #引入CSV模块
with open(r'c:/文件/emails_send.csv','w',newline='',encoding='utf-8-sig') as email_datas:
'''
最前面的参数代表文件的位置,这里是我电脑中文件位置,加r避免后面的斜杠被转义了,
'w'代表覆盖写入,
加newline=''表示避免行与行之间出现空白行,
encoding='utf-8-sig'我的本地需要加上-sig,不然打开CSV会发现是乱码的
as 后面的名字是自己取的,可以更换
'''
writer = csv.writer(email_datas)#实例化对象,简单来说就是将csv.writer这个类的属性和方法赋予给了writer,下面就能用属性和方法了
writer.writerow(['神秘博士','邮箱名称@hotmail.com'])#按行写入,信息用英文字符隔开,加引号是代表是字符串。
writer.writerow(['钢铁侠','邮箱名称@163.com'])
writer.writerow(['雷神','邮箱名称@qq.com'])
writer.writerow(['古一法师','邮箱名称@126.com'])
'''我这里建了四行信息,模拟一下群发邮件的环境'''
2.收件人信息的读取:
当然,如果我们早已经在本地建好了人名和邮箱的CSV文件的话,直接进入该步骤便可。代码如下↓
with open(r'I:\数据库\emails_send.csv','r',encoding='utf-8-sig') as email_datas:
readers = csv.reader(email_datas)#实例化对象,将读取操作的类赋予给readers
for row in readers:
print(row)#通过打印验证是否已经读取出来了
运行以上代码后输出如下信息:
['神秘博士', '******@hotmail.com']
['钢铁侠', '*******@163.com']
['雷神', '*****@qq.com']
['古一法师', '*******@126.com']
————邮箱名称已用*号代替————
显而易见,每个row是一个列表,这个先放在这里,后面会用到
3.邮件发送
这一步当然就是核心部分了,思路为先引入代码→设置参数→运行程序。来看代码↓
引入代码
import csv,time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
设置参数
email_host ='smtp.163.com'#我用的是163邮箱
email_post = '25'
username = input('请输入发送邮箱')
password = input('请输入授权码')
sender = username#登陆邮箱和发件人名称一致,当然也可以不一致
运行程序
server = smtplib.SMTP()
server.connect(email_host,email_post)
server.login(username,password)
for name in email_dict:
receiver_name = name
receiver_email= email_list[name]
text='''尊敬的%s,您好!
很感谢您能收到我们这封邮件。---测试'''%(receiver_name)
msg=MIMEText(text,'plain','utf-8')
msg['From']=Header(sender)
msg['Subject']=Header('测试')
msg['To']=Header(receiver_email)
server.sendmail(sender,receiver_email,msg.as_string())
server.quit()
会看到群发单显,称呼名称定制核心的代码就在那个循环部分,占位符的应用↓
for name in email_dict:
receiver_name = name
receiver_email= email_dict[name]
text='''尊敬的%s,您好!
很感谢您能收到我们这封邮件。---测试'''%(receiver_name)
msg=MIMEText(text,'plain','utf-8')
msg['From']=Header(sender)#写入发送人的姓名
msg['Subject']=Header('测试')#写入发送的主题
msg['To']=Header(receiver_email)#写入收件人的邮箱地址
server.sendmail(sender,receiver_email,msg.as_string())#发送邮件的语法
仔细看就会发现 email_dict是前面所没有的,现在就讲讲:
email_dict 是我们在读取步骤那里新建的一个字典,目的是将姓名和邮箱匹配起来。
email_dict={}#新建一个字典
with open(r'I:\数据库\emails_send.csv','r',encoding='utf-8-sig') as email_datas:
readers = csv.reader(email_datas)
for row in readers:
email_dict[row[0]]=row[1]# 写入字典的语法
'''
因row是一个列表(上方已讲过),他包含了两个元素,第[0]个元素就是姓名,第[1]个元素就是邮箱,按照写入字典的语法写进email_dict这个字典中
'''
如此来,我们就可以将收件人的姓名和邮箱装载到相应的位置了
用一个for循环将email_dict每一个键值对取出来,再将键值分别赋予到收件人及正文text中的相应位置。
for name in email_dict:
receiver_name = name'''将字典的键取出来即姓名赋予到receiver_name上,后面会放到正文中作为变量如下:'''
text='''尊敬的%s,您好!
很感谢您能收到我们这封邮件。---测试'''%(receiver_name)#占位符的用法,使得称呼名称可以定制
receiver_email = email_dict[name]'''将字典的值取出来赋予到receiver_email上,后面会放到发送邮件的语法以及Header中收件人的名称这里中如下:'''
msg['To']=Header(receiver_email)#写入收件人的邮箱地址
server.sendmail(sender,receiver_email,msg.as_string())#发送邮件的语法
由于正文和发送邮件的语法都在同一层级,因此总是一一对应的,这样就实现了称呼名称的定制,好了,最后来美化一下语法,让他在工作时能看到每步走到那里了。
import csv,time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
with open(r'I:\数据库\emails_send.csv','w',newline='',encoding='utf-8-sig') as email_datas:
writer = csv.writer(email_datas)
writer.writerow(['神秘博士','******@hotmail.com'])
writer.writerow(['钢铁侠','*******@163.com'])
writer.writerow(['雷神',****@qq.com'])
writer.writerow(['古一法师',****@126.com'])
email_dict ={}
with open(r'I:\数据库\emails_send.csv','r',encoding='utf-8-sig') as email_datas:
readers = csv.reader(email_datas)
for row in readers:
print(row)
email_dict[row[0]]=row[1]
print(email_dict)
email_host ='smtp.163.com'
email_post = '25'
username = input('请输入发送邮箱')
password = input('请输入授权码')
sender = username
print('正在连接服务器......')
server = smtplib.SMTP()
server.connect(email_host,email_post)
print('连接成功!')
time.sleep(2)
print('导入用户名与密码')
server.login(username,password)
print('导入成功!')
time.sleep(2)
print('发送邮件中....')
number = 1
for name in email_dict:
print('正在发送第%d封。。'%(number))
time.sleep(2)
receiver_name = name
receiver_email= email_dict[name]
text='''尊敬的%s,您好!
很感谢您能收到我们这封邮件。---测试'''%(receiver_name)
msg=MIMEText(text,'plain','utf-8')
msg['From']=Header(sender)
msg['Subject']=Header('测试')
msg['To']=Header(receiver_email)
server.sendmail(sender,receiver_email,msg.as_string())
number=number+1
server.quit()
print('全部发送成功!')
运行一下,终端会显示如下:
请输入发送邮箱**********
请输入授权码*********
正在连接服务器......
连接成功!
导入用户名与密码
导入成功!
发送邮件中....
正在发送第1封。。
正在发送第2封。。
正在发送第3封。。
正在发送第4封。。
全部发送成功!
再来看看收到的邮件吧~
image.png大功告成!
总结
用字典将姓名及邮箱对应起来,使用占位符可以输入变量,使用for循环解决群发问题。
网友评论