Python100个库分享第31个—smtplib模块(自动发送(抄送)携带附件—邮件脚本(办公自动化+附完整版代码))

专栏导读

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

库的介绍

  • 为了编写一个利用Python进行办公自动化,特别是批量发送邮件(包括收件人、抄送人和附件)的脚本,我们可以使用smtplib库来处理SMTP邮件发送,以及email模块来构建邮件内容。以下是一个简单的示例脚本,展示了如何实现这一功能:

  • 首先,确保你有Python环境,并且安装了必要的库(虽然smtplib和email模块是Python标准库的一部分,所以你通常不需要额外安装)。

库的安装

内置库,无需安装
  • 批量发送时需要读取Excel,需安装pandas,或 openpyxl

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/

1、确定SMTP服务器地址、端口、发件人邮箱、密码

smtp_server = "smtp.example.com" # 填入 SMTP 服务器地址

smtp_port = 9025 # 填入 SMTP 端口

sender_password = "xxxxxxx" # 填入 发件人密码

2、设置批量发送模板

  • 按照如下模板,进行填充,准备批量发送的模板

["发件人邮箱","收件人邮箱(多个封号隔开-英文输入法)","抄送人邮箱(多个封号隔开-英文输入法)","邮件主题","邮件正文","附件路径"]

在这里插入图片描述

3、读取模板

sender_email = row[0] # 发件人邮箱,类型:字符串

recipients = row[1].split(';') # 收件人列表,类型:列表

cc_recipients = [row[2].split(';')] # 抄送人列表,类型:列表

subject = row[3] # 邮件主题,类型:字符串

body = row[4] # 邮件内容,类型:字符串

attachments = [row[5]] # 附件路径列表,类型:列表

df = pd.read_excel('./发送模板/' + os.listdir('./发送模板/')[0], dtype=str, keep_default_na='')
for row in df.values.tolist():
    sender_email = row[0]  # 发件人邮箱
    recipients = row[1].split(';')  # 收件人列表
    cc_recipients = [row[2].split(';')]  # 抄送人列表
    subject = row[3]  # 邮件主题
    body = row[4]  # 邮件内容
    attachments = [row[5]]  # 附件路径列表

4、设置发送失败日志

  • 请看完整版代码

5、完整版代码

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
import openpyxl
import pandas as pd

wb = openpyxl.Workbook()
ws = wb.active
ws.append(["发件人邮箱", "收件人邮箱", "抄送人邮箱", "邮件主题", "邮件内容", "附件路径"])


def send_bulk_email(smtp_server, smtp_port, sender_email, sender_password, recipients, cc_recipients, subject, body,
                    attachments=[]):
    try:
        # 创建 SMTP 连接
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()  # 启用 TLS 加密
        server.login(sender_email, sender_password)

        # 循环遍历收件人并发送邮件
        for recipient, cc in zip(recipients, cc_recipients):
            # 创建邮件对象
            msg = MIMEMultipart()
            msg['From'] = sender_email
            msg['To'] = recipient
            msg['Cc'] = ";".join(cc)  # 将抄送人列表转换为分号分隔的字符串
            msg['Subject'] = subject

            # 添加邮件内容
            msg.attach(MIMEText(body, 'plain'))

            # 添加附件
            for file_path in attachments:
                attachment = MIMEBase('application', 'octet-stream')
                try:
                    with open(file_path, 'rb') as attachment_file:
                        attachment.set_payload(attachment_file.read())
                    encoders.encode_base64(attachment)
                    attachment.add_header('Content-Disposition', f'attachment; filename={os.path.basename(file_path)}')
                    msg.attach(attachment)
                except Exception as e:
                    print(f"添加附件 {file_path} 时发生错误: {e}")

            # 发送邮件
            all_recipients = [recipient] + cc  # 合并收件人和抄送人列表
            server.sendmail(sender_email, all_recipients, msg.as_string())
            print(f"邮件已发送至 {recipient} (抄送: {';'.join(cc)})")

        # 关闭服务器连接
        server.quit()
        print("所有邮件已成功发送")

    except Exception as e:
        print(f"发送邮件时发生错误: {e}")
        return False


# 使用示例
if __name__ == "__main__":
    smtp_server = "smtp.example.com"  # SMTP 服务器地址
    smtp_port = 9025  # SMTP 端口
    sender_password = "xxxxx"  # 发件人密码
    df = pd.read_excel('./发送模板/' + os.listdir('./发送模板/')[0], dtype=str, keep_default_na='')
    for row in df.values.tolist():
        sender_email = row[0]  # 发件人邮箱
        recipients = row[1].split(';')  # 收件人列表
        cc_recipients = [row[2].split(';')]  # 抄送人列表
        subject = row[3]  # 邮件主题
        body = row[4]  # 邮件内容
        attachments = [row[5]]  # 附件路径列表

        state = send_bulk_email(smtp_server, smtp_port, sender_email, sender_password, recipients, cc_recipients,
                                subject, body, attachments)
        if state == False:
            ws.append(row)

wb.save("邮件发送失败日志.xlsx")

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一晌小贪欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值