Python 实现邮件自动群发(办公场景直接可用)
·
Python 实现邮件自动群发(办公场景直接可用)
在日常办公中,经常需要批量发送通知、报表或问候邮件。下面提供一份可直接复制的 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)
# ... 调用发送函数
五、注意事项
-
频率限制:大多数免费邮箱每天有发送上限(QQ约500封/天),且短时间内发送过快可能被暂时封禁。建议每封间隔1~3秒。
-
授权码安全:不要将授权码硬编码在公开仓库中,建议使用环境变量或配置文件。
-
垃圾邮件:纯文本内容容易被判为垃圾邮件,建议使用HTML模板并包含退订链接。
-
错误处理:生产环境中建议增加重试机制和日志记录。
-
合规性:确保收件人同意接收邮件,遵守《反垃圾邮件法》相关规定。
更多推荐



所有评论(0)