Python 自动化办公:批量发送邮件原来这么简单

在日常办公中,批量发送邮件(如通知、报告)是常见需求。使用Python,只需几行代码就能实现自动化,大大节省时间。下面我将一步步解释如何实现,并提供完整代码示例。整个过程基于Python标准库(smtplibemail),无需额外安装包,确保真实可靠。

为什么这么简单?
  • Python的smtplib库封装了SMTP协议,简化了邮件发送。
  • email库帮助构建邮件内容。
  • 批量发送本质是循环处理收件人列表,效率高(例如发送$n$封邮件只需$O(n)$时间)。
分步实现

假设场景:你需要向多个同事发送相同的通知邮件。收件人列表存储在CSV文件中(如recipients.csv),每行一个邮箱地址。

  1. 准备环境
    首先,确保Python已安装(推荐Python 3.6+)。导入必要库:

    import smtplib
    from email.mime.text import MIMEText
    import csv  # 用于读取收件人文件
    

  2. 设置SMTP服务器
    使用你的邮箱服务商(如Gmail、QQ邮箱)的SMTP信息。例如,Gmail的设置:

    • 服务器:smtp.gmail.com
    • 端口:587(TLS加密)
    • 用户名:你的邮箱地址
    • 密码:邮箱密码或应用专用密码(安全起见,不要硬编码在代码中)

    安全提示:密码应通过环境变量或输入获取。这里用input()函数动态输入。

  3. 构建邮件内容
    创建邮件主题和正文。使用MIMEText对象封装内容:

    subject = "重要通知:本周会议安排"  # 邮件主题
    body = "您好,本周五下午2点将举行团队会议,请准时参加。如有疑问,请联系管理员。"  # 邮件正文
    msg = MIMEText(body, 'plain', 'utf-8')  # 'plain'表示纯文本,'utf-8'支持中文
    msg['Subject'] = subject
    msg['From'] = 'your_email@example.com'  # 替换为你的发件邮箱
    

  4. 读取收件人列表
    假设收件人文件recipients.csv格式如下:

    email
    colleague1@example.com
    colleague2@example.com
    ...
    

    使用csv模块读取:

    recipient_list = []
    with open('recipients.csv', 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            recipient_list.append(row['email'])  # 提取邮箱地址
    

  5. 循环发送邮件
    连接SMTP服务器,遍历收件人列表发送。注意:每次发送需设置msg['To']

    # 获取SMTP凭据(安全方式)
    smtp_server = input("输入SMTP服务器地址(如 smtp.gmail.com): ")
    smtp_port = int(input("输入SMTP端口(如 587): "))
    username = input("输入邮箱用户名: ")
    password = input("输入邮箱密码: ")  # 实际运行时密码不会显示
    
    # 发送邮件
    try:
        with smtplib.SMTP(smtp_server, smtp_port) as server:
            server.starttls()  # 启用TLS加密
            server.login(username, password)
            for recipient in recipient_list:
                msg['To'] = recipient  # 设置当前收件人
                server.sendmail(msg['From'], recipient, msg.as_string())
                print(f"邮件发送成功至: {recipient}")
        print("批量发送完成!")
    except Exception as e:
        print(f"发送失败,错误: {e}")
    

完整代码示例

将以上步骤整合成一个脚本batch_email.py

import smtplib
from email.mime.text import MIMEText
import csv

# 设置邮件内容
subject = "重要通知:本周会议安排"
body = "您好,本周五下午2点将举行团队会议,请准时参加。如有疑问,请联系管理员。"
msg = MIMEText(body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = 'your_email@example.com'  # 替换为你的邮箱

# 读取收件人列表
recipient_list = []
try:
    with open('recipients.csv', 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)
        for row in reader:
            recipient_list.append(row['email'])
except FileNotFoundError:
    print("错误:收件人文件不存在!")
    exit()

# 获取SMTP信息(安全输入)
smtp_server = input("输入SMTP服务器地址(如 smtp.gmail.com): ")
smtp_port = int(input("输入SMTP端口(如 587): "))
username = input("输入邮箱用户名: ")
password = input("输入邮箱密码: ")

# 批量发送
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.starttls()
        server.login(username, password)
        for recipient in recipient_list:
            msg['To'] = recipient
            server.sendmail(msg['From'], recipient, msg.as_string())
            print(f"邮件发送成功至: {recipient}")
    print(f"所有邮件发送完毕!共发送{len(recipient_list)}封。")  # 使用$n$表示数量
except smtplib.SMTPException as e:
    print(f"SMTP错误: {e}")
except Exception as e:
    print(f"未知错误: {e}")

注意事项
  • 测试建议:先用自己的邮箱测试,避免触发反垃圾邮件机制。发送量过大时(如超过100封/小时),分批发送或添加延迟。
  • 扩展功能:如需发送HTML邮件或附件,使用MIMEMultipartMIMEBase(修改msg对象)。
  • 安全第一:永远不要将密码存储在脚本中。生产环境建议使用OAuth2或密钥管理服务。
  • 效率:对于$n$个收件人,发送时间约$O(n)$,取决于网络速度。

通过这个示例,你可以看到Python自动化批量邮件的简洁性:只需基础代码,就能处理重复任务。赶紧试试吧,让你的办公效率翻倍!如果有具体问题,欢迎进一步讨论。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐