系列文章目录

python办公自动化–数据可视化(pandas+matplotlib)–生成条形图和饼状图
python办公自动化–数据可视化(pandas+matplotlib)–生成折线图
python办公自动化–数据可视化(pandas读取excel文件,matplotlib生成可视化图表)
python办公自动化-openpyxl学习-工资表生成工资条
python办公自动化–使用将csv大文件分割为xlsx小文件
python办公自动化----使用pandas和os合并多个订单表
三种方法批量填充订单表中的空白单元格–python,excel vba,excel


前言

hello,大家好呀,新的一周,我们继续来学习python的办公自动化,今天我们来讲python批量发送带附件的变量邮件

一、发送最简单的邮件

首先,我们来尝试发送一封最简单的邮件,通常我们用来发送邮件的模块有两个
smtplib和yagmail,下面我们分别使用这两个模块来发送邮件

1.使用smtplib发送邮件

发送方:youremail@163.com
接收方:youremail@qq.com
邮件主题:测试
邮件内容:你好,这是一封测试邮件,用到的模块是smtplib。

代码如下(示例):

import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 邮件服务器地址和端口号
smtp_server = 'smtp.163.com'
smtp_port = 25

# 发件人邮箱地址和密码
sender_email = 'youremail@163.com'  # 这里替换为您自己的发件人邮箱地址
sender_password = 'yourpassword'  # 这里替换为你的授权码 非邮箱登录密码

# 收件人邮箱地址
recipient_email = 'youremail@qq.com'

# 创建一封邮件,文本内容为 "Hello, World!"
message = MIMEText('你好,这是一封测试邮件,用到的模块是smtplib', 'plain', 'utf-8')
message['From'] = Header('发件人昵称 <{}>'.format(sender_email), 'utf-8')  # 设置发件人昵称
message['To'] = Header('收件人昵称 <{}>'.format(recipient_email), 'utf-8')  # 设置收件人昵称
message['Subject'] = Header('测试', 'utf-8')  # 设置邮件主题

try:
    # 连接邮件服务器并登录
    smtp_connection = smtplib.SMTP(smtp_server, smtp_port)
    smtp_connection.login(sender_email, sender_password)

    # 发送邮件
    smtp_connection.sendmail(sender_email, recipient_email, message.as_string())

    # 关闭连接
    smtp_connection.quit()

    print("邮件发送成功!")

except Exception as e:
    print("邮件发送失败:", e)

点击运行后,你的收件人邮箱会收到一封邮件,如下

在这里插入图片描述
这个模块发送邮件很复杂,所以我们一般选择另一个模块:yagmail

2.使用yagmail发送邮件

发送方:youremail@163.com
接收方:youremail@qq.com
邮件主题:测试
邮件内容:你好,这是一封测试邮件,用到的模块是yagmail。

代码如下(示例):

import yagmail
username="youremail.com"    # 发件人邮箱地址,需替换为实际使用的163邮箱
passwd="yourpassword"    # 邮箱密码或授权码,需替换为实际密码
toemail="youremail@qq.com"    # 收件人邮箱地址,需替换为实际使用的qq邮箱

yag = yagmail.SMTP(
    user=username,  
    password=passwd,  
    host='smtp.163.com'  # 163邮箱的SMTP服务器地址
)

yag.send(to=toemail,subject="测试",contents="你好,这是一封测试邮件,用到的模块是yagmail。")

yag.close()

点击运行后,加过如下

在这里插入图片描述
是不是简单多了,代码很简单,我们只需要将发件人和收件人的邮箱地址按照实际的邮箱地址进行替换就行了,另外还有一个地方就是password授权码,这是什么呢?!
以网易邮箱为例,在设置这里打开smtp服务,就可以获得一个授权码,通常是一连串的字母和数字组成的字符串,使用这个授权码你就可以在python里面用你的邮箱发送邮件了
这里需要提醒大家,授权码一定要保管好哟。

二、应用示例:使用yagmail发送工资条

1.需求

今天我们主要来讲一下,如何使用python批量发送带附件的邮件。
加入你是一名人事,现在你手上有每一个员工的工资条(.png格式的图片),你需要使用公司的邮箱(假设是163邮箱)给每一位员工发送一封邮件,邮件的主题为"{员工姓名}的工资条",邮件内容为“你好,{员工姓名},这是你的工资条”,并且把员工的工资条以附件的形式放进邮件里面发送给每一位员工,该怎么做呢?

逐步分析:员工姓名和员工的邮箱、工资条需要一一对应,我们可以建立一个表格,在表格里面一列写入员邮箱,一列写入员工姓名,如下:

在这里插入图片描述

然后我们把工资条图片放进一个文件夹,用员工的姓名来命名,如下:

在这里插入图片描述

这样我们就可以将员工的信息给对应起来

另外,为了统计邮件发送成功和失败的件数,我们可以设置计数器来进行统计

# 初始化发送成功和失败的计数器
success_count = 0  # 记录成功发送的邮件数量
fail_count = 0     # 记录发送失败的邮件数量
  success_count += 1  # 成功计数器加1
    except Exception as e:  # 捕获所有异常
        print(f"[失败] {qq_email}: {str(e)}")  # 打印失败信息和异常详情
        fail_count += 1  # 失败计数器加1

那么下面让我们来一起看一下最后的代码,为了方便大家阅读,我给每一行代码都添加了注释

2.粉丝福利:可以直接用来发送带附件的变量邮件的代码

代码如下(示例):

# 导入pandas库,用于数据处理和分析,特别是Excel文件操作
import pandas as pd
# 导入yagmail库,用于发送电子邮件
import yagmail
# 导入os库,用于操作系统相关功能,如文件路径操作
import os

# 配置邮箱SMTP服务信息
# 使用yagmail创建SMTP客户端实例
yag = yagmail.SMTP(
    user='youremail@163.com',  # 发件人邮箱地址,需替换为实际使用的163邮箱
    password='yourpassword',  # 邮箱密码或授权码,需替换为实际密码
    host='smtp.163.com'  # 163邮箱的SMTP服务器地址
)

# 定义员工信息Excel文件路径,使用原始字符串避免转义问题
employee_path = r'C:\员工名单\员工.xlsx'
# 定义工资条图片存放目录路径
salary_dir = r'C:\工资条'
# 使用pandas读取Excel文件内容到DataFrame对象
df = pd.read_excel(employee_path)

# 初始化发送成功和失败的计数器
success_count = 0  # 记录成功发送的邮件数量
fail_count = 0     # 记录发送失败的邮件数量

# 遍历DataFrame中的每一行数据
for index, row in df.iterrows():
    # 从当前行获取员工邮箱地址,列名为"邮箱"
    qq_email = row['邮箱']  # 接收邮件的QQ邮箱地址
    # 从当前行获取员工姓名,列名为"姓名"
    employee_name = row['姓名']  # 员工姓名,用于个性化邮件和查找工资条图片
    # 构建工资条图片完整路径:工资条目录 + 员工姓名 + .png后缀
    salary_slip = os.path.join(salary_dir, f"{employee_name}.png")

    # 检查工资条图片文件是否存在
    if not os.path.exists(salary_slip):  # os.path.exists()检查文件是否存在
        print(f"[错误] 工资条文件不存在: {salary_slip}")  # 打印错误信息
        fail_count += 1  # 失败计数器加1
        continue  # 跳过当前员工,继续处理下一个

    try:  # 尝试发送邮件,捕获可能出现的异常
        # 使用yagmail发送邮件
        yag.send(
            to=qq_email,  # 收件人邮箱地址
            subject=f'{employee_name}的工资条',  # 邮件主题,包含员工姓名
            contents=f'你好,{employee_name},这是你的工资条',  # 邮件正文,个性化内容
            attachments=salary_slip  # 邮件附件,工资条图片
        )
        print(f"[成功] {employee_name}的工资条发送完毕")  # 打印成功信息
        success_count += 1  # 成功计数器加1
    except Exception as e:  # 捕获所有异常
        print(f"[失败] {qq_email}: {str(e)}")  # 打印失败信息和异常详情
        fail_count += 1  # 失败计数器加1

# 打印最终的发送结果统计
print(f"\n发送结果统计:")  # 统计标题
print(f"成功发送: {success_count}封")  # 显示成功发送数量
print(f"发送失败: {fail_count}封")  # 显示失败发送数量
print("所有工资条发送完成!")  # 完成提示

我们将上述代码在pycharm中复制粘贴,然后运行后,显示如下
在这里插入图片描述

可以看到,我们这里成功发送了两封邮件,没有失败的
然后我们打开这两个邮箱看下邮件
在这里插入图片描述

在这里插入图片描述

可以看到,员工们的邮件都收到了,而且姓名和工资条也都对应上了。

那么大家如果将上面的代码拿去使用的话,只需要将发送方的邮箱改成你们的实际邮箱,然后将授权码改成你们的授权码,接下来在c盘新建两个文件夹:员工名单和工资条,员工名单这个文件夹里面新建一个表格:员工.xlsx,第一列是员工的邮箱地址,第二列是员工的姓名,工资条这个文件里里面就放员工的工资条图片,用员工姓名来命名,注意是png格式的图片哟,要不然后面连接路径的时候会报错,如果你们的图片格式是jpg格式,那么就将

   # 构建工资条图片完整路径:工资条目录 + 员工姓名 + .png后缀
    salary_slip = os.path.join(salary_dir, f"{employee_name}.png")

这行代码,改成

   # 构建工资条图片完整路径:工资条目录 + 员工姓名 + .jpg后缀
    salary_slip = os.path.join(salary_dir, f"{employee_name}.jpg")

如果你们的工资条图片有很多格式,比如jpg,png,webp啥的都有,那么就需要改代码来匹配,这里大家可能不会改代码,如果出现问题可以私信我哟。

其实如果想完善代码,我们可以用python的flask模块搭建一个简单的服务器,同时在上面脚本的邮件里面嵌入透明图片来记录像素访问,最终实现邮件追踪,查看有多少用户打开了邮件。
这就涉及到python全栈开发的内容了,这部分我后续有机会也会慢慢更新。
现在大家没必要做这个像素追踪的工作,只需要搞清楚如何发送邮件就可以了。

总结

今天我们学习了如何用python发送邮件,从简单的文本邮件,到复杂的带附件的变量邮件,最后我们还通过批量给员工发送工资条来举例进行了讲解,相信大家如何认真学习了上面的内容,一定可以搞清楚的。如果有什么不懂的问题,或者代码运行错误,可以随时问我哈,同时如果我上面哪里写的有问题,也欢迎大家指出哟。最后希望大家可以点个免费的赞和订阅,爱你们哟~~~~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐