在日常办公中,经常需要批量发送通知、报表或问候邮件。下面提供一份可直接复制的 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模板并包含退订链接。
- 错误处理:生产环境中建议增加重试机制和日志记录。
- 合规性:确保收件人同意接收邮件,遵守《反垃圾邮件法》相关规定。
以上就是python实现邮件自动群发功能的详细内容,更多关于python邮件自动群发的资料请关注代码网其它相关文章!
发表评论