Python批量发送邮件

862 阅读4分钟

哇奥,fantastic baby...今天 老Amy 开始薅头发~还有啥宝贝没给大家亮出来...

就开始看到繁忙的 hr ,我设身处地的想,如果行政部门需要批量的给不同人员发送不同信息的邮件~是怎么来做的呢?emmm...或许excel、word和邮箱都有快捷的功能[原谅我布吉岛],可是万一用python更便捷呢?所以 老Amy 就开动了!

需求如下

如下图,邮件.xlsx 文件中含有一些基本信息,而我们需要给不同的收件人邮箱发送对应的正文内容。

打BOSS第一版

最开始,我们不要把事情想的太复杂,而是先用 Python 实现给指定某一个人发送邮件。

并且,我觉得非常有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,也就是简单邮件传输协议,它是一组用于由原地址到目的地址传送邮件的规则,由它来控制信件的中转方式,python实现发邮件也是基于此基础上进行封装的。

也就是对应的 smtplib 与 email 库。首先大家需注意,这两个库都是 python内置 的,所以并不需要去安装[老Amy还去安装了...结果一直报错...太丢人了]

其次大家需要稍微了解下各自对应的作用:

  • email模块:主要负责构造邮件内容。
    • 通过 email.mime.MIMEText 构造文本对象
    • 通过 email.header.Header 构造标题对象
  • smtplib模块:主要负责发送邮件。主要步骤如下
    • 创建 SMTP 的操作对象并连接 SMTP 目标服务器,可以是163、QQ等
    • 根据自己的账号登录目标服务器(自己的邮箱地址与邮件授权码)
    • 调用对象的方法,发送邮件到目标地址

代码如下:

import smtplib                        # smtplib发送邮件
from email.mime.text import MIMEText  # 构造文本内容
from email.header import Header       # 构造标题内容


# 设置服务器地址
mail_host = "smtp.qq.com"
# 设置服务器端口
mail_port = 465

# 初始化发送方账号
sender = "28480*****@qq.com"
# 初始化接收方账号
receivers = "9152*****@qq.com"

# QQ邮件登录账号
mail_user = "28480*****"
# QQ邮箱第三方授权码
mail_pass = "gwgcqikk********"


def post_email(title,context):
    # 构造文本对象,三个参数:文本内容,设置文本格式,设置编码
    message = MIMEText(context,"plain","utf-8")
    # 文本对象 添加 发送者
    message["From"] = sender
    # 文本对象 添加 接收者
    message["To"] = receivers
    # 文本对象 添加 标题
    message["Subject"] = Header(title)

    # 创建 SMTP 对象,连接目标服务器
    smtpObj = smtplib.SMTP_SSL(mail_host,mail_port)
    # 自己账号登录
    smtpObj.login(mail_user,mail_pass)
    # 发送邮件到目标地址  注意:信息由MTMEText对象 转为 字符串对象
    smtpObj.sendmail(sender,receivers,message.as_string())
    # 结束 SMTP 对象
    smtpObj.quit()


if __name__ == '__main__':
    post_email("至老妖怪的邮件", "老Amy,哪里逃!")

当然在这里大家需要注意一点,就是QQ的第三方授权码并不是你的QQ密码奥,而是需要开启第三方的SMTP,操作猛如虎的过程如下:

  • 第一步
  • 第二步
  • 第三步

打BOSS第二版

以上实现了发单条邮件的功能,那现在我们就需要实现同时发多条的功能了。嘻嘻~

既然接收方的数据信息以行为单位存储在 邮件.xlsx 里面,所以我们需要用 Python的库 来读取表格数据,为了方便我们仍然使用 pandas.read_excel() 来进行操作。该函数读取的数据返回为 DataFrame 的类型,并且我们还需要将 DataFrame 数据中的每一行为单位,传入到发送邮件的函数中去进行处理发送,所以接下来会使用到 DataFrame.apply(func) 去进行映射。

实现代码如下:

import smtplib                        # smtplib发送邮件
from email.mime.text import MIMEText  # 构造文本内容
from email.header import Header       # 构造标题内容


# 设置服务器地址
mail_host = "smtp.qq.com"
# 设置服务器端口
mail_port = 465

# 初始化发送方账号
sender = "28480*****@qq.com"

# QQ邮件登录账号
mail_user = "28480*****"
# QQ邮箱第三方授权码
mail_pass = "gwgcqikk********"


def post_email(per_info):
    # 构造文本对象,三个参数:文本内容,设置文本格式,设置编码
    message = MIMEText(per_info["正文"],"plain","utf-8")
    # 文本对象 添加 发送者
    message["From"] = sender
    # 文本对象 添加 接收者
    message["To"] = per_info["收件人邮箱"]
    # 文本对象 添加 标题
    message["Subject"] = Header(per_info["邮件主题"])

    # 创建 SMTP 对象,连接目标服务器
    smtpObj = smtplib.SMTP_SSL(mail_host,mail_port)
    # 自己账号登录
    smtpObj.login(mail_user,mail_pass)
    # 发送邮件到目标地址  注意:信息由MTMEText对象 转为 字符串对象
    smtpObj.sendmail(sender,per_info["收件人邮箱"],message.as_string())
    # 结束 SMTP 对象
    smtpObj.quit()


if __name__ == '__main__':
    # 读取 邮件.xlsx
    email_info_df = pd.read_excel("邮件.xlsx")

    # 使用apply方法 将email_info_df中每一行 映射到post_email函数中
    email_info_df.apply(post_email,axis=1)

得嘞!在我实现这个之后,一阵开心结果老居泼了我一盆冷水他说他在很久之前就玩过这个了....我好想高歌一曲:“冷冷的冰雨在脸上胡乱地拍”。盘他哈哈哈哈哈

然鹅,还是希望对大家有所帮助,当然这两个库的玩法不止如此,还可以发送图片文件等。这个就大家自己去拓展啦~加油!打工人。