1. 前言
在生活中,我们经常遇到的事情就是邮箱收到自己的工资条。你想一个公司如果只有几个人,那么还好说,但是如果上了十个以上,对于大多数人来说,这就是一件比较麻烦的事情。重复的劳动需要重复几十次几百次几千次,这样的事情对于一个程序员来,是不是很 low ?那么人事的小姐姐,就需要我们给他开发一个自动化脚本,它只需要将发送的邮箱和内容写在一个 excel 的表格中,通过表格读取内容,然后自动发送到对应的邮箱中,是不是很简单?
2. 准备工作
- QQ 邮箱开启 SMTP 服务,获取授权码(不一定是 QQ 邮箱,只是我这里使用的 QQ 开发,只要提供 SMTP 服务的邮箱,就可以);
- 安装 python 环境 3.7;
- 使用 pandas、openpyxl 读取后缀为 xlsx 的 excel 表格;
- 使用 smtplib 发送邮件。
3. QQ 邮箱开启 SMTP 服务,获取授权码
3.1 参考
3.2 开启 SMTP 服务步骤
-
打开【QQ邮箱】
-
进入【设置】
-
打开【帐户】
-
找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】,获取授权码
-
点击【获取授权码】
-
扫码结果,点击【前往发送短信】
-
发送信息
-
点击【我已发送】
-
获取授权码
4. 安装对应的库
pip install pandas openpyxl smtplib
5. 读取 excel
5.1 代码分析
- 使用 pandas 库来读取Excel文件。
- openpyxl库,提供读写Excel文件的功能,特别是.xlsx格式的文件。pandas通过调用openpyxl来读取Excel文件内容;
- 创建名为 read_excel 的函数,用于读取Excel文件。该函数接受一个参数file_path,即Excel文件的路径;
- 使用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 代码分析
- 创建 send_emails_in_batch(file_path, sender_email, sender_password) 批量发送邮件的函数; 1.1 file_path 是 excel 的文件路径; 1.2 sender_email 是发送邮件的邮箱; 1.3 sender_password 是 SMTP 服务的授权码。
- 使用read_excel函数读取指定路径下的Excel文件,返回一个Pandas DataFrame对象df。这个DataFrame包含了邮件信息,如收件人邮箱地址、邮件主题和邮件正文;
- 使用iterrows()方法遍历DataFrame中的每一行。iterrows()返回一个生成器,每次迭代时产生一个索引和一行数据(以字典格式)。这里,index是行号,row是该行的数据;
- 提取收件人邮箱地址、邮件主题、邮件正文;
- 对于每一行邮件信息,调用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 email.mime.text.MIMEText 是用于创建邮件的文本部分; 1.2 email.mime.multipart.MIMEMultipart 是用于创建邮件的多部分消息,可以包含文本、附件等; 1.3 smtplib 是用于发送邮件的 SMTP 协议客户端。
- 创建 send_email函数,函数接受五个参数:发件人邮箱地址sender_email、发件人邮箱密码sender_password、收件人邮箱地址receiver_email、邮件主题subject、邮件正文body;
- 创建邮件对象 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')) 是将邮件正文作为纯文本附件添加到邮件对象中。
- 使用SSL连接到QQ邮箱的SMTP服务器,端口号为 465;
- 使用发件人的邮箱地址和密码登录到SMTP服务器;
- 将邮件对象转换为字符串格式并发送给收件人;
- 发送完邮件后,关闭与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. 总结
- 整体来说,功能并不是很难,就是一个读取库和一个发送库的配合,就完成了脚本的开发,但是就像我看到的一句话,【想,都是问题。做,才有答案。】只有自己实现一遍,才知道中间需要注意那些细节;
- 【邮箱开启 SMTP 服务,获取授权码】这一步其实也很简单,就是需要我们对发送邮件的邮箱去开启;
- 我这里只是发送了简单的字符串内容,如果更多功能,比如表格等样式也是可以操作的,不过需要对应的设置,有需求时,在进行细节的研究修改。