Python实现群发邮件

邮箱设置

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

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])

输出:

[['姓名', '邮件地址'], ['朱宏程', '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"] = 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 = "<a href='https://movie.douban.com/subject/1292217/' > 深夜的穆赫兰道发生一桩车祸,女子丽塔(劳拉·赫利 Laura Harring 饰)在车祸中失了忆。她跌跌撞撞来到一个公寓里藏身。。。.</a>"  # 邮件内容
    content = input("请输入邮件的内容")
    sender = "banka799@163.com"  # 发件人
    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)

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

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

总结

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

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值