Python实现邮件自动群发功能

 更新时间:2026年08月10日 09:16:22   作者:大黄说说  
还在手动群发邮件,用Python就能轻松批量发送通知和报表!本文提供可直接复制的脚本,兼容QQ、163、Gmail等主流邮箱,手把手教你获取授权码、配置SMTP服务器,并附上频率控制和防垃圾邮件的实用技巧,让你高效办公,需要的朋友可以参考下

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

一、准备工作

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

Python 内置 smtplib 和 email 模块,无需 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_server 和 smtp_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. 合规性:确保收件人同意接收邮件,遵守《反垃圾邮件法》相关规定。

以上就是Python实现邮件自动群发功能的详细内容,更多关于Python邮件自动群发的资料请关注脚本之家其它相关文章!

相关文章

  • python 获取毫秒级时间问题的解决

    python 获取毫秒级时间问题的解决

    这篇文章主要介绍了python 获取毫秒级时间问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Python、PyCharm安装及使用方法(Mac版)详解

    Python、PyCharm安装及使用方法(Mac版)详解

    这篇文章主要为大家详细介绍了Mac版的Python、PyCharm安装及使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • python返回多个值与赋值多个值的示例代码

    python返回多个值与赋值多个值的示例代码

    在Python中函数经常会返回多个值,下面这篇文章主要给大家介绍了关于python返回多个值与赋值多个值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • python实现石头剪刀布程序

    python实现石头剪刀布程序

    这篇文章主要为大家详细介绍了python实现石头剪刀布程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 使用Python实现一个安全封装EXE文件加密保护工具

    使用Python实现一个安全封装EXE文件加密保护工具

    文章介绍了使用Python开发的EXE文件加密保护工具,该工具使用AES-256加密算法保护原始EXE文件,并通过美观的密码验证界面进行访问,需要的朋友可以参考下
    2025-12-12
  • Python win32com 操作Exce的l简单方法(必看)

    Python win32com 操作Exce的l简单方法(必看)

    下面小编就为大家带来一篇Python win32com 操作Exce的l简单方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • minconda安装pytorch的详细方法

    minconda安装pytorch的详细方法

    这篇文章主要介绍了minconda安装pytorch的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • python正则表达式匹配[]中间为任意字符的实例

    python正则表达式匹配[]中间为任意字符的实例

    今天小编就为大家分享一篇python正则表达式匹配[]中间为任意字符的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python文件的操作处理详解

    Python文件的操作处理详解

    今天这篇文章给大家介绍Python文件的操作处理,文章内容介绍的很详细,有需要的可以参考借鉴,希望能够给你带来帮助
    2021-10-10
  • Python3实现连接SQLite数据库的方法

    Python3实现连接SQLite数据库的方法

    这篇文章主要介绍了Python3实现连接SQLite数据库的方法,在Python数据库编程中有着广泛的应用,需要的朋友可以参考下
    2014-08-08

最新评论