美文网首页
邮件个性化-群发单显,称呼名称定制

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

作者: lovershy | 来源:发表于2019-09-29 17:35 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:邮件个性化-群发单显,称呼名称定制

          本文链接:https://www.haomeiwen.com/subject/gaadyctx.html