Python 实现批量发送邮件,通过读取 excel 中的发送内容

114 阅读5分钟

1. 前言

在生活中,我们经常遇到的事情就是邮箱收到自己的工资条。你想一个公司如果只有几个人,那么还好说,但是如果上了十个以上,对于大多数人来说,这就是一件比较麻烦的事情。重复的劳动需要重复几十次几百次几千次,这样的事情对于一个程序员来,是不是很 low ?那么人事的小姐姐,就需要我们给他开发一个自动化脚本,它只需要将发送的邮箱和内容写在一个 excel 的表格中,通过表格读取内容,然后自动发送到对应的邮箱中,是不是很简单?

2. 准备工作

  1. QQ 邮箱开启 SMTP 服务,获取授权码(不一定是 QQ 邮箱,只是我这里使用的 QQ 开发,只要提供 SMTP 服务的邮箱,就可以);
  2. 安装 python 环境 3.7;
  3. 使用 pandas、openpyxl 读取后缀为 xlsx 的 excel 表格;
  4. 使用 smtplib 发送邮件。

3. QQ 邮箱开启 SMTP 服务,获取授权码

3.1 参考

QQ 邮箱开启 SMTP 服务,获取授权码!

3.2 开启 SMTP 服务步骤

  1. 打开【QQ邮箱】 输入图片说明

  2. 进入【设置】 输入图片说明

  3. 打开【帐户】 输入图片说明

  4. 找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】,获取授权码 输入图片说明

  5. 点击【获取授权码】 输入图片说明

  6. 扫码结果,点击【前往发送短信】 输入图片说明

  7. 发送信息 输入图片说明

  8. 点击【我已发送】 输入图片说明

  9. 获取授权码 输入图片说明

4. 安装对应的库

pip install pandas openpyxl smtplib

5. 读取 excel

5.1 代码分析

  1. 使用 pandas 库来读取Excel文件。
  2. openpyxl库,提供读写Excel文件的功能,特别是.xlsx格式的文件。pandas通过调用openpyxl来读取Excel文件内容;
  3. 创建名为 read_excel 的函数,用于读取Excel文件。该函数接受一个参数file_path,即Excel文件的路径;
  4. 使用pandas库中的read_excel方法读取指定路径的Excel文件,并且指定了使用openpyxl作为引擎来解析文件内容。

注意:engine='openpyxl' 指定了使用 openpyxl 来读取文件,这在处理.xlsx格式的文件时特别重要,因为不同的Excel文件格式需要不同的引擎。

5.2 读取 excel 代码块

# 读取Excel文件
def read_excel(file_path):
    df = pd.read_excel(file_path, engine='openpyxl')
    return df

6. 批量发送函数

6.1 代码分析

  1. 创建 send_emails_in_batch(file_path, sender_email, sender_password) 批量发送邮件的函数; 1.1 file_path 是 excel 的文件路径; 1.2 sender_email 是发送邮件的邮箱; 1.3 sender_password 是 SMTP 服务的授权码。
  2. 使用read_excel函数读取指定路径下的Excel文件,返回一个Pandas DataFrame对象df。这个DataFrame包含了邮件信息,如收件人邮箱地址、邮件主题和邮件正文;
  3. 使用iterrows()方法遍历DataFrame中的每一行。iterrows()返回一个生成器,每次迭代时产生一个索引和一行数据(以字典格式)。这里,index是行号,row是该行的数据;
  4. 提取收件人邮箱地址、邮件主题、邮件正文;
  5. 对于每一行邮件信息,调用send_email函数,使用提供的发件人邮箱和密码,将邮件发送给指定的收件人。

6.2 代码实现

# 批量发送邮件
def send_emails_in_batch(file_path, sender_email, sender_password):
    df = read_excel(file_path)
    for index, row in df.iterrows():
        receiver_email = row['email']
        subject = row['subject']
        body = row['body']
        send_email(sender_email, sender_password, receiver_email, subject, body)

7. 发送邮件

7.1 代码分析

  1. 导入必要的库 1.1 email.mime.text.MIMEText 是用于创建邮件的文本部分; 1.2 email.mime.multipart.MIMEMultipart 是用于创建邮件的多部分消息,可以包含文本、附件等; 1.3 smtplib 是用于发送邮件的 SMTP 协议客户端。
  2. 创建 send_email函数,函数接受五个参数:发件人邮箱地址sender_email、发件人邮箱密码sender_password、收件人邮箱地址receiver_email、邮件主题subject、邮件正文body;
  3. 创建邮件对象 3.1 msg = MIMEMultipart() 是创建一个MIMEMultipart对象,用于存储邮件的所有部分; 3.2 msg['From'] = sender_email 是设置邮件的发件人地址; 3.3 msg['To'] = receiver_email 是设置邮件的收件人地址; 3.4 msg['Subject'] = subject 是设置邮件的主题; 3.5 msg.attach(MIMEText(body, 'plain')) 是将邮件正文作为纯文本附件添加到邮件对象中。
  4. 使用SSL连接到QQ邮箱的SMTP服务器,端口号为 465;
  5. 使用发件人的邮箱地址和密码登录到SMTP服务器;
  6. 将邮件对象转换为字符串格式并发送给收件人;
  7. 发送完邮件后,关闭与SMTP服务器的连接。

7.2 代码实现

# 发送邮件
def send_email(sender_email, sender_password, receiver_email, subject, body):
    try:
        msg = MIMEMultipart()
        msg['From'] = sender_email
        msg['To'] = receiver_email
        msg['Subject'] = subject
        msg.attach(MIMEText(body, 'plain'))
        
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        # server.starttls()
        server.login(sender_email, sender_password)
        server.sendmail(sender_email, receiver_email, msg.as_string())
        server.quit()
        print(f'邮件已成功发送至: {receiver_email}')
    except Exception as e:
        print(f'发送邮件至 {receiver_email} 失败: {e}')

8. 导入的库

import pandas as pd
import openpyxl
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

9. 使用脚本

if __name__ == '__main__':
    # 替换为您的Excel文件路径、发件人邮箱和密码
    send_emails_in_batch('./emails.xlsx', '发送邮件的邮箱@qq.com', '发送邮件邮箱的 SMTP 服务的授权码')

10. 示例 excel

输入图片说明

11. 执行结果

输入图片说明

12. 目标邮箱接收结果

输入图片说明

13. 总结

  1. 整体来说,功能并不是很难,就是一个读取库和一个发送库的配合,就完成了脚本的开发,但是就像我看到的一句话,【想,都是问题。做,才有答案。】只有自己实现一遍,才知道中间需要注意那些细节;
  2. 【邮箱开启 SMTP 服务,获取授权码】这一步其实也很简单,就是需要我们对发送邮件的邮箱去开启;
  3. 我这里只是发送了简单的字符串内容,如果更多功能,比如表格等样式也是可以操作的,不过需要对应的设置,有需求时,在进行细节的研究修改。