Python实现邮件群发

  • 邮箱设置
    • IMAP/SMTP协议
    • 网易邮箱/qq邮箱设置
  • smtplib库和email.mime.text库的了解
    • smtplib库
    • email.mime.text库
  • 开始代码
    • CSV文件读写收件人信息
    • 构建邮件信息
  • 代码实践
  • 总结

邮箱设置

在开始代码前,我们需要先对我们的邮箱做一些设置,以保证我们能较好地实现群发邮件功能。

IMAP/SMTP协议

先了解下什么是IMAP、SMTP。
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

网易邮箱/qq邮箱设置

邮箱可以选择163邮箱或者qq邮箱。
这里选网易邮箱做示范的话:
打开设置:

开启即可:

OK,准备工作结束!
(QQ邮箱的步骤类似,可自己尝试下)

smtplib库和email.mime.text库的了解

smtplib库

简单了解下,它其实就是一个对stmp协议封装了的库,使用它能快捷遍历的发送电子邮件,语法如下:

import smtplibsmtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

email.mime.text库

对于这个库,主要是使用其MIMEText这个函数,它的功能是构造邮件,例如:

msg = MIMEText(content, "html", "utf-8")

第一个参数是邮件正文,第二个参数MIME的subtype,传入html表示网页,最后跟上一个utf-8,保证语言的兼容性。

开始代码

CSV文件读写收件人信息

第一步,初始化,给收件人文件命名为receiver_list.csv,并写入【姓名,邮箱】这一行数据进去(后面讲为什么这么写)。

def init():receivers_list = open("receivers_list.csv", "w", newline="")# 将文件加载到csv对象中writer = csv.writer(receivers_list)writer.writerow(["姓名", "邮箱"])receivers_list.close()

第二步,读入数据功能
将刚才初始化的文件加入到csv对象中。

writer = csv.writer(receivers_list)

然后通过一行一行写入的方式,写入一条一条的收件人数据:

writer.writerow([name,address])

整体代码如下:

def member_writer():receivers_list = open("receivers_list.csv","a",newline="")#将文件加载到csv对象中writer = csv.writer(receivers_list)#格式while True:name = input("请输入收件人姓名")address = input("请输入邮件地址")writer.writerow([name,address])end = input("如果输入完毕,键入q退出")if end=="q":breakreceivers_list.close()

第三步,读取收件人信息
还是先加入csv对象:

#读csv文件
csvfile_1 = open("csv_test.csv","r")

这里有两种读取方式:
1.以列表的形式输入2.以字典的形式输出
先看列表,我们读取存好的数据:

reader_1 = csv.reader(csvfile_1)rows1 = [row1 for row1 in reader_1]
print(rows1)
print(rows1[1][0])

输出:

[['姓名', '邮件地址'], ['朱宏程', 'banka799@163.com'], ['broly', '1418158575@qq.com']]

是一个列表,将输入的成对数据以列表的形式返回。

再看字典

reader_2 = csv.DictReader(csvfile_1)for row2 in reader_2:print(row2)
csvfile_1.close()

输出:

{'姓名': '朱宏程', '邮件地址': 'banka799@163.com'}
{'姓名': 'broly', '邮件地址': '1418158575@qq.com'}

看,他把我们初始化输入的【姓名,邮箱】当成了字典的key,而后续我们的输入成了value,这样我们就能通过key来索取value,方便快捷。
所以,这里我们选用第字典输出作为读取方式。

将读出的数据分别存在name,address列表中,很显然他们是一一对应的关系。

    for row in reader:name.append(row["姓名"])address.append(row["邮箱"])return name, address

构建邮件信息

键盘读入邮件主题、内容
这里其实也可以键入发送人邮箱和密码,但是由于输入比较繁琐所以略去,提前设置好一个账号密码。(安全起见,密码略去了)

    subject = input("请输入邮件的主题")  # 邮件的主题# content = "<a href='https://movie.douban.com/subject/1292217/' > 深夜的穆赫兰道发生一桩车祸,女子丽塔(劳拉·赫利 Laura Harring 饰)在车祸中失了忆。她跌跌撞撞来到一个公寓里藏身。。。.</a>"  # 邮件内容content = input("请输入邮件的内容")sender = "banka799@163.com"  # 发件人password = '************'  # 刚才我们在163邮箱里设置的授权密码

开始发送邮件
组装邮件
使用上面讲过的MIMEText构成message
并分别对应写入发件人、收件人、邮件主题的对应信息。

message = MIMEText(content, "html", "utf-8")message["From"] = sendermessage["To"] = receivermessage["Subject"] = subject

使用stmp链接服务器,然后登入,发送邮件。
值得一提的是这里的端口号有多种选择,在具体实践中发现163邮箱使用994比较容易成功请求,而qq邮箱使用465易成功。

smtp = smtplib.SMTP_SSL('smtp.163.com', 994)#qq用465,163用994smtp.login(sender, password)smtp.sendmail(sender, [receiver], message.as_string())

总体代码
上面两部分代码其实是写在一起的,总体是这样:

import smtplib
from email.mime.text import MIMEText
import timedef sendEmail(address, name):subject = input("请输入邮件的主题")  # 邮件的主题# content = "<a href='https://movie.douban.com/subject/1292217/' > 深夜的穆赫兰道发生一桩车祸,女子丽塔(劳拉·赫利 Laura Harring 饰)在车祸中失了忆。她跌跌撞撞来到一个公寓里藏身。。。.</a>"  # 邮件内容content = input("请输入邮件的内容")sender = "banka799@163.com"  # 发件人password = '**************'  # 刚才我们在163邮箱里设置的授权密码order = 0for receiver in address:message = MIMEText(content, "html", "utf-8")message["From"] = sendermessage["To"] = receivermessage["Subject"] = subjectsmtp = smtplib.SMTP_SSL('smtp.163.com', 994)#qq用465,163用994smtp.login(sender, password)smtp.sendmail(sender, [receiver], message.as_string())smtp.close()time.sleep(1)order += 1print("成功发送第{}份,接收方是{}".format(order,name[order-1]))print("成功发送所有,共计{}份".format(order)

代码实践

正式跑一下试试:
随机抽取幸运观众

启动群发

import receivers
import SendEmail
# receivers.init()
# receivers.member_writer()
x, y = receivers.member_reader()SendEmail.sendEmail(y,x)

输出邮件主题、内容

结果:

总结

代码主体难度不高,主要是考察对一些stmplibemail.mime.text库的运用和对csv文件操作的掌握。
我的代码总体偏简单,没有做过多的复杂操作,比如缺少对不规范输入检测,导致程序比较脆弱,如果不按正确格式输入就很难完整运行。除此之外,邮件内容的输入也做的过于简单,没有考虑实际需求,例如如果需要在邮件中附加图片、视频或者超链接等功能都没实现,只能简单文字内容,过于单一,这都是可以改进的地方。

Python实现群发邮件相关推荐

  1. python实现群发邮件及自动跳过无效邮箱

    python实现群发邮件.密送及自动跳过无效邮箱 需求背景:最近同学需要收集一些调研问卷,立马想到了群发邮件这一方式,机智地用excel按照邮件格式造了一堆学校邮箱,打算一个一个复制粘贴群发.好家伙, ...

  2. python smtp 群发邮件

    最近工作中遇到使用脚本处理问题并发送结果邮件,使用python的smtp模块很简单的完成了实现.今天遇到一个问题,根据脚本的测试结果需要群发邮件,但是发送邮件的py文件只有首个地址收到了邮件.仔细排查 ...

  3. python怎么群发邮件_python群发邮件怎么做

    我们平时需要使用python群发邮件,这个需求怎么来实现?答案其实很简单,smtplib 和 email库可以帮忙实现这个需求.smtplib 和 email 的组合可以用来发送各类邮件:普通文本,H ...

  4. python自动群发邮件_24.python之自动群发邮件(1)

    学习python的目的是为了让我们的工作生活能够更加轻松,和上节课一样,本节课讲一个python的实际应用--自动群发邮件. 发送邮件需要用到smtplib和email两个模块,这两个都是内置模块,不 ...

  5. python怎么群发邮件_python小白之实现群发邮件

    2020年10月2日 前两天看到kk的公众号推送 有一句话特别醒目 努力是最不值得拿来夸口的东西,因为这是最基本的 以前考研的时候所有驱动力都是kk的推送 后来有了内在驱动力 很少点开kk的推送了 最 ...

  6. 用python快速群发邮件

    最近要通过邮件群发一个通知,正好之前看到过python发邮件的,就试了一把,还挺方便的 可以自由的写正文,摘要,加附件 一.配置邮箱第三方使用 我的是扣扣邮箱,详情见 https://jingyan. ...

  7. python百万邮件群发软件_python如何群发邮件

    今天一米软件来跟大家分享一下python如何群发邮件. python群发邮件需要用到的模块:email模块,smtplib模块. email模块用来构建文件内容,smtplib模块用来发邮件,这两个都 ...

  8. python群发邮箱软件下载_python如何群发邮件

    今天一米软件来跟大家分享一下python如何群发邮件. python群发邮件需要用到的模块:email模块,smtplib模块. email模块用来构建文件内容,smtplib模块用来发邮件,这两个都 ...

  9. Python趣味打怪:60秒学会一个例子,147段简单代码助你从入门到大师 | 中文资源...

    鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 人生苦短,编程苦手,不妨学起Python,感受一飞冲天的快乐. 不要害怕学习的过程枯燥无味,这里有程序员jackzhenguo打造的一份中文 ...

最新文章

  1. 依然持有比特币,Roger Ver谈投资心经
  2. javascript中的字典
  3. PHP获取当前url路径的函数及服务器变量:QUERY_STRING、REQUEST_URI、SCRIPT...
  4. 电脑网络禁用了怎么恢复_网卡禁用怎么启用恢复
  5. fps 每秒刷新的频率
  6. 初学Web前端开发,你需要掌握的11项技能
  7. Spring注解原理学习之@Size and @Pattern
  8. python第五次作业——陈灵院
  9. volatile关键字和AtomicInteger
  10. 数据“被”覆盖有假象,SQL数据库恢复终极绝招(数据恢复高级技术)
  11. Java里面的arraycopy总结
  12. P1447 [NOI2010] 能量采集
  13. 稀疏数组(数据结构)
  14. 使用new调用构造器创建对象并统一添加属性的代码运行过程
  15. 剑指offer第二版(C++实现)
  16. 人与人,人与自然。文/江湖一剑客
  17. 翻译PDF 翻译PPT 保留原格式 一键搞定
  18. 使用Axis2实现WebService的发布和调用
  19. throw 关键字,throw 必须写在方法体中,并且 throw new xxxException的话,如果是运行时的异常可以不用管,如果是编译的异常需要进行处理
  20. c语言编辑三色球问题,C语言实例编程:三色球问题

热门文章

  1. 电脑硬盘不小心格式化了文件怎么恢复,手把手教你变恢复高手
  2. 计算机格式化后能恢复数据吗,格式化数据恢复 电脑格式化了还能恢复吗?原来找回如此简单!...
  3. 微软sus服务器搭建,规划和部署 Exchange Server
  4. 应对嵌入式校招面试手撕之——链表
  5. 浅谈umi router
  6. WebGL 水波及焦散(刻蚀)的渲染总结
  7. zstu新生赛 Problem A: Baby Coins(折半枚举+二分)
  8. 机器学习之深度学习入门
  9. 2020年安卓各大应用市场份额占比分析,Android自定义View详解
  10. 【初识数据结构】手把手教会你时间复杂度的计算方法