Python实现群发邮件

您所在的位置:网站首页 如何群发邮箱 Python实现群发邮件

Python实现群发邮件

#Python实现群发邮件| 来源: 网络整理| 查看: 265

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 smtplib smtpObj = 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": break receivers_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])

输出:

[['姓名', '邮件地址'], ['朱宏程', '[email protected]'], ['broly', '[email protected]']]

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

再看字典:

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

输出:

{'姓名': '朱宏程', '邮件地址': '[email protected]'} {'姓名': 'broly', '邮件地址': '[email protected]'}

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

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

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

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

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

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

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

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

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

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

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

输出邮件主题、内容 在这里插入图片描述 在这里插入图片描述

结果: 在这里插入图片描述

总结

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3