邮件个性化-群发单显,称呼名称定制

2019-09-29  本文已影响0人  lovershy

目标: 想实现群发邮件时,正文文本开头是该收件人的名字。

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循环解决群发问题。

上一篇下一篇

猜你喜欢

热点阅读