欢迎进入万兴电子官网
购物车图片 我的购物车 ( )

python实现群发邮件、密送及自动跳过无效邮箱

发布时间: 2019-03-12
浏览次数: 37

需求背景:最近同学需要收集一些调研问卷,立马想到了群发邮件这一方式,机智地用excel按照邮件格式造了一堆学校邮箱,打算一个一个复制粘贴群发。好家伙,这么多邮箱得粘贴到猴年马月啊,极其精污。作为略懂点python的弱鸡,当然要在这个问题上装个逼了,一口答应了同学用python给他写个脚本,当然就踩到了各种坑了。网上各种python群发邮件的教程都有,没错,就是用smtplib这个包基本可以实现,但是写完之后却发现遇到无效的邮箱程序自动抛出错误就停止了,邮件倒是一个都没发出去。在网上找了很久,都没找到啥教程。最后我貌似阴差阳错找到了可能有效的替代方法,因此记录一下,供大家讨论学习。

步骤:使用python中的smtplib群发邮件主要可以分为以下几个步骤:

1.开通邮箱的第三方授权,注意记下授权码;

2.创建smpt对象,连接smpt服务器(注意不通邮箱的端口不同);

3.登录自己的邮箱账号(注意密码是1中开通第三方授权的授权码,而不是登录密码);

4.通过发送消息函数发送邮件,需要设置发件人、收件人(群发为多个收件人),内容,标题等参数;

5.发送成功,关闭连接。

为了比较清楚地了解具体的流程,下面我将以QQ邮箱为例。进行简单的说明。

一、开通邮箱的第三方授权

QQ邮箱开通授权的步骤可以参考这篇博客:https://blog.csdn.net/SpiderManSun/article/details/84964171

简单来说就是:登入你的QQ邮箱,点击设置–账户,然后找到POP3/SMTP或者IMAP/SMTP服务,二者选其一就行,这里我们只需要SMTP,然后会通知你给腾讯科技的电话发邮件,之后会告诉你一个授权码,这个授权码需要记住,后面需要用。

二、创建对象,设置参数

这一部分网上的教程比较多,就不过多赘述了,只说几个需要注意的点:

1.smpt server的host:这个不同邮箱有所不同,例如QQ邮箱就是:smpt.qq.com

2.mail_user和sender均为发件人邮箱,mail_pass为授权码,并非邮箱登录密码

3.群发邮件有多个收件人,需要用.join()函数添加,即:message[‘To’] = “,”.join(receiver)

代码如下:

import smtplib

from email.header import Header

from email.mime.text import MIMEText

import csv

import pandas as pd 

# SMTP Service

mail_host = 'smtp.qq.com'               # SMTP server, take QQ as example

mail_user = 'xxx@qq.com'                # user

mail_pass = 'xxxxxxxxxx'                # note:Authorization Code,not password

sender = 'xxx@qq.com'                   # sender email

#get receiver email from cvs file

def get_email():

    with open('test.csv','r') as csvfile:

        reader = csv.reader(csvfile)

        row1 = [row for row in reader]

        data = row1[0]

    print(data)

    print(len(data))

    return data

#write the content and title of your email here! 

def email_content():

    title = 'python_email_test'  # title

    content = 'Test success!'    # content of your email

    return title,content

def sendEmail():

    title,content = email_content()

    #receiver = get_email()

    bcc = get_email()            # 接收邮件,可设置为你的QQ邮箱或者其他邮箱,加入bcc实现密送

    message = MIMEText(content, 'plain', 'utf-8')       # content, format, encoding

    message['From'] = '{}'.format(sender)

    #message['To'] = ','.join(receiver)                 #To:收件人,Cc:抄送,Bcc:密送,不显示地址

    message['Bcc'] = ','.join(bcc)

    message['Subject'] = title

    try:

        smtp_Obj = smtplib.SMTP_SSL(mail_host, 465)     # 启用SSL发信, 端口一般是465

        smtp_Obj.login(mail_user, mail_pass)            # 登录验证

        #smtp_Obj.sendmail(sender, receiver, message.as_string())  # send

        smtp_Obj.sendmail(sender, bcc, message.as_string())

        print('email send success!')

    except smtplib.SMTPException as e:

        print(e)

        print('error!email send failed!')

if __name__ == '__main__':

注意这几点基本就能实现简单的群发邮件了,但是在实际运行过程中会发现如果遇到无效的邮箱地址,会导致程序抛出错误,该批邮箱均无法成功发出邮件。

运行结果如下:

输入正确邮箱和错误邮箱,但是会导致两个均无法接受到邮件,这在群发邮件中是很让人头疼的问题。为了解决这个问题,翻了网上大部分教程都没有解决,本来就要放弃了,却因为群发邮件的另一个需求而阴差阳错的解决了,下面听我慢慢道来。

契机:像这种调研问卷直接让每个收件人看到所有的群发收件人是不合适的,容易引起反感,也无法营造出被问卷调查人是被偶然抽中的(废话!当然是怕被骂啊!),因此想实现类似手动群发中的群发单显功能,由于时间有限,当然没有实现完整的群发单显功能,通过查阅smtplib的说明文档,我发现可以通过简单设置一下参数就可实现抄送,密送功能,这种发骚扰问卷,当然密送最好了,最后就选了密送。

了解一下什么是抄送、密送,可以参考:https://www.zhihu.com/question/19670232

具体的实现问题可以参考Stack Overflow的讨论:https://stackoverflow.com/questions/1546367/python-how-to-send-mail-with-to-cc-and-bcc

注意:To列表:所有收件人邮箱;Cc列表:抄送;放入Bcc列表:密送,不能看见收件人邮箱,只能看到发件人邮箱地址。

简单总结一下:只要把收件人的邮箱都添加在 bcc 列表里就可以保证单个收件人只可以看到自己的邮箱,而无法看到所有收件人的邮箱。

下面重点来了!在将所有的收件人均放到message[‘Bcc’]后,我发现不但成功解决了显示邮箱的隐私泄露问题,还成功解决了错误邮箱不能跳过的问题。采用密送形式群发邮件,smtplib就能自动跳过无效邮箱,只发送给有效邮箱,成功解决了两大问题,也成功发完了所有的问卷,避免了人工筛选的繁杂工作。

当然,这里的无效邮箱也不是完全非法形式,主要是针对正确邮箱形式的无效邮箱。其实在用QQ邮箱测试的时候发现QQ会自动退订,这种情况下不会出现有错误邮箱发不出的因素。本文针对的更多是学校的教育邮箱或者公司邮箱不能对错误邮箱作出自动退回的邮箱,这种情况下一有报错就可能会导致全部发送失败,这时候可以试着采用密送的形式,就能跳过无效邮箱了。

简单总结一下,实现python群发邮件可能会出现错误邮箱导致全部发送失败,可以尝试改为密送方式,这时候可以自动跳过这些错误邮箱,当然还有前提条件:没有自动退回功能的自建邮箱,如学校邮箱等。当然不同邮箱的差别很大,这种方法可能也不一定完全适用,如果不适用,本文也可以提供密送邮件的解决办法嘛。

参考:

1.QQ邮箱SMTP授权:https://blog.csdn.net/SpiderManSun/article/details/84964171

2.知乎:什么是抄送、密送:https://www.zhihu.com/question/19670232

3.Stack Overflow的实现:https://stackoverflow.com/questions/1546367/python-how-to-send-mail-with-to-cc-and-bcc

--------------------- 

作者:yfreedomliTHU 

来源:CSDN 

原文:https://blog.csdn.net/yfreedomliTHU/article/details/88196631 

版权声明:本文为博主原创文章,转载请附上博文链接!

相关推荐 More
2019 - 03 - 12
点击次数: 12
无状态:HTTP是一种不保存状态,既无状态协议。HTTP自身不对请求和响应之间的通信状态进行保存,也就是说不做持久化处理。这是为了更快处理大量事务,确保协议的可伸缩性。随着web的不断发展,无状态也导致业务处理变得棘手,比如用户登录购物网站,在跳转到该网站其他页面后也要保存登录这个状态。不然请求不知道是哪个用户发出的。因此,引入了cookie技术。持久连接:HTTP协议初始版本中,每进行一次HTTP通信就要断开一次TCP连接。随着HTTP的普及,文档包含图片的情况多了起来,如果使用浏览器浏览一个包含多张图片的HTML页面时,在发送请求访问HTML页面资源的同时,也会请求HTML页面包含的其他资源因此,每次请求都会造成无畏的TCP连接建立和断开,增加通信量的开销通过持久连接解决了上述的TCP连接问题。持久连接的特点是,只要任意一端没有明确提出断开连接,则保持TCP连接状态。请求头部字段Con...
2019 - 03 - 12
点击次数: 7
了解两个问题,什么是加密算法、为什么要使用加密。加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。为什么要加密,保障数据的安全和完整性防止被他人篡改。1、摘要算法数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法、散列算法。常用的摘要算法有MD5、SHA1、SHA256 , 加密后分别输出128bit、160bit、256bit。1.1 MD5--------------------- 作者:云度 来源:CSDN 原文:https://blog.csdn.net/seoyundu/article/details/88112861 ...
2019 - 03 - 12
点击次数: 11
MySQL 是一个最流行的关系型数据库,在互联网产品中应用比较广泛。一般情况下,MySQL 数据库是选择的第一方案,基本上有 80% ~ 90% 的场景都是基于 MySQL 数据库的。因为,需要关系型数据库进行管理,此外,业务存在许多事务性的操作,需要保证事务的强一致性。同时,可能还存在一些复杂的 SQL 的查询。值得注意的是,前期尽量减少表的联合查询,便于后期数据量增大的情况下,做数据库的分库分表。--------------------- 作者:weixin_33757911 来源:CSDN 原文:https://blog.csdn.net/weixin_33757911/article/details/88318634 版权声明:本文为博主原创文章,转载请附上博文链接!
2019 - 03 - 12
点击次数: 9
数据中的连接join分为内连接、自然连接、外连接,外连接又分为左外连接、右外连接、全外连接当然,这些分类都是在连接的基础上,是从两个表中记录的笛卡尔积中选取满足连接的记录。笛卡尔积简单的说就是一个表里的记录要分别和另外一个表的记录匹配为一条记录,即如果表A有3条记录,表B也有三条记录,经过笛卡尔运算之后就应该有3*3即9条记录。如下表:自然连接(natural join)自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。sql语句:Select …… from 表1 natural join 表2结果:内连接(inner join)内连接基本与自然连接相同,不同之处在于自然连接要求是同名属性列的比较,而内连接则不要求两属性列同名,可以用using或on来指定某两列字段相同的连接条件。sql语句:Select …… ...
  • 您的姓名:
  • *
  • 公司名称:
  • *
  • 地址:
  • *
  • 电话:
  • *
  • 传真:
  • *
  • E-mail:
  • *
  • 邮政编码:
  • *
  • 留言主题:
  • *
  • 详细说明:
  • *
     
郑州市二七区祥云路1号2幢2单元1207号
0371-55030465
Copyright ©2019 - 2021 河南万兴电子科技有限公司
犀牛云提供企业云服务
X
1

QQ设置

3

积分商城

4

阿里旺旺设置

等待加载动态数据...

等待加载动态数据...

5

电话号码

  • 0371-55030465
6

二维码管理

等待加载动态数据...

等待加载动态数据...

展开