Python 实现邮件自动群发(办公场景直接可用)

在日常办公中,经常需要批量发送通知、报表或问候邮件。下面提供一份可直接复制的 Python 脚本,支持 SMTP 协议,兼容 QQ邮箱 / 163邮箱 / Gmail 等主流邮箱。


一、准备工作

1. 安装所需库(无需额外安装)

Python 内置 smtplibemail 模块,无需 pip 安装任何第三方包。

2. 获取邮箱授权码(非登录密码)

以 QQ邮箱为例:

  • 进入设置 → 账户 → POP3/SMTP服务 → 开启并生成授权码

  • 记录下这个16位授权码,后续作为密码使用

其他邮箱同理,均需开启 SMTP 服务并获取专用密码。


二、完整代码(复制即可用)

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import time

def send_emails(sender_email, sender_password, receivers, subject, content,
                smtp_server="smtp.qq.com", smtp_port=465, use_ssl=True):
    """
    批量发送邮件
    
    参数说明:
        sender_email:     发件人邮箱地址
        sender_password:  邮箱授权码(非登录密码)
        receivers:        收件人列表,如 ["a@qq.com", "b@163.com"]
        subject:          邮件主题
        content:          邮件正文(支持HTML格式)
        smtp_server:      SMTP服务器地址,默认QQ邮箱
        smtp_port:        端口,SSL默认465,TLS默认587
        use_ssl:          是否使用SSL加密,默认True
    """
    
    # 统计结果
    success_count = 0
    fail_list = []
    
    for i, receiver in enumerate(receivers):
        try:
            # 创建邮件对象
            msg = MIMEMultipart('alternative')
            msg['From'] = sender_email
            msg['To'] = receiver
            msg['Subject'] = Header(subject, 'utf-8')
            
            # 添加正文(支持HTML)
            msg.attach(MIMEText(content, 'html', 'utf-8'))
            
            # 连接SMTP服务器
            if use_ssl:
                server = smtplib.SMTP_SSL(smtp_server, smtp_port)
            else:
                server = smtplib.SMTP(smtp_server, smtp_port)
                server.starttls()
            
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, [receiver], msg.as_string())
            server.quit()
            
            success_count += 1
            print(f"[成功] 第{i+1}封 -> {receiver}")
            
            # 避免触发频率限制,每次发送间隔1秒
            time.sleep(1)
            
        except Exception as e:
            fail_list.append((receiver, str(e)))
            print(f"[失败] 第{i+1}封 -> {receiver},原因:{e}")
    
    # 输出汇总
    print("\n" + "="*40)
    print(f"发送完成!成功:{success_count},失败:{len(fail_list)}")
    if fail_list:
        print("失败详情:")
        for addr, reason in fail_list:
            print(f"  {addr}: {reason}")
    
    return success_count, fail_list


# ========== 使用示例 ==========
if __name__ == "__main__":
    # -------- 配置区(请修改为实际信息)--------
    MY_EMAIL = "your_email@qq.com"          # 你的邮箱
    MY_PASSWORD = "your_authorization_code" # 邮箱授权码
    
    RECEIVERS = [
        "colleague1@company.com",
        "colleague2@company.com",
        "colleague3@company.com"
    ]
    
    SUBJECT = "【重要】本周工作安排通知"
    
    CONTENT = """
    <h3>各位同事好:</h3>
    <p>以下是本周工作安排:</p>
    <ul>
        <li>周一:项目进度汇报</li>
        <li>周三:部门例会(14:00 会议室A)</li>
        <li>周五:提交周报</li>
    </ul>
    <p>如有疑问请及时联系我。</p>
    <br>
    <p style="color:gray;">此邮件由系统自动发送,请勿回复。</p>
    """
    
    # 执行发送
    send_emails(
        sender_email=MY_EMAIL,
        sender_password=MY_PASSWORD,
        receivers=RECEIVERS,
        subject=SUBJECT,
        content=CONTENT
    )

三、常见邮箱SMTP配置

邮箱

SMTP服务器

SSL端口

TLS端口

QQ邮箱

smtp.qq.com

465

587

163邮箱

smtp.163.com

465

25

Gmail

smtp.gmail.com

465

587

企业微信邮箱

smtp.exmail.qq.com

465

587

使用时只需修改 send_emails() 中的 smtp_serversmtp_port 参数即可。


四、进阶功能

1. 添加附件

from email.mime.base import MIMEBase
from email import encoders

# 在创建msg后添加
with open("report.xlsx", "rb") as f:
    attachment = MIMEBase('application', 'octet-stream')
    attachment.set_payload(f.read())
    encoders.encode_base64(attachment)
    attachment.add_header('Content-Disposition', 'attachment', filename='report.xlsx')
    msg.attach(attachment)

2. 从Excel读取收件人

import pandas as pd

df = pd.read_excel("contacts.xlsx")
receivers = df["邮箱"].tolist()

3. 发送个性化内容(替换姓名等)

for name, email in zip(names, emails):
    personalized_content = CONTENT.replace("{姓名}", name)
    # ... 调用发送函数

五、注意事项

  1. 频率限制:大多数免费邮箱每天有发送上限(QQ约500封/天),且短时间内发送过快可能被暂时封禁。建议每封间隔1~3秒。

  2. 授权码安全:不要将授权码硬编码在公开仓库中,建议使用环境变量或配置文件。

  3. 垃圾邮件:纯文本内容容易被判为垃圾邮件,建议使用HTML模板并包含退订链接。

  4. 错误处理:生产环境中建议增加重试机制和日志记录。

  5. 合规性:确保收件人同意接收邮件,遵守《反垃圾邮件法》相关规定。

更多推荐