下载地址:http://m.pan38.com/download.php?code=TMZENR 提取码:3338
代码实现了完整的QQ邮箱批量发送功能,包含异常处理和模板渲染功能。使用时需要先到QQ邮箱设置中开启SMTP服务并获取授权码。如需进一步扩展功能,可以参考代码中的扩展建议进行开发。
QQ邮箱批量群发系统开发指南
一、技术原理
本系统基于SMTP协议实现,核心组件包括:
邮件构造模块(MIME协议)
身证模块(SSL加密)
批量发送控制模块
异常处理机制
二、完整实现代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import time
import csv
from typing import List
class QQMailBulkSender:
def init(self,
sender_email: str,
auth_code: str,
smtp_server: str = "smtp.qq.com",
smtp_port: int = 465):
"""
初始化邮件发送器
:param sender_email: 发件人QQ邮箱
:param auth_code: SMTP授权码(非QQ密码)
:param smtp_server: SMTP服务器地址
:param smtp_port: SMTP端口(SSL加密)
"""
self.sender = sender_email
self.auth_code = auth_code
self.smtp_server = smtp_server
self.smtp_port = smtp_port
self.server = None
def connect(self) -> bool:
"""建立SMTP连接"""
try:
self.server = smtplib.SMTP_SSL(self.smtp_server, self.smtp_port)
self.server.login(self.sender, self.auth_code)
return True
except Exception as e:
print(f"连接失败: {str(e)}")
return False
def build_email(self,
receiver: str,
subject: str,
content: str,
content_type: str = "plain") -> MIMEMultipart:
"""构建MIME邮件对象"""
message = MIMEMultipart()
message['From'] = Header(f"发件人<{self.sender}>")
message['To'] = Header(f"收件人<{receiver}>")
message['Subject'] = Header(subject, 'utf-8')
# 添加正文
body = MIMEText(content, content_type, 'utf-8')
message.attach(body)
return message
def send_single(self,
receiver: str,
subject: str,
content: str,
content_type: str = "plain") -> bool:
"""发送单封邮件"""
if not self.server:
if not self.connect():
return False
try:
msg = self.build_email(receiver, subject, content, content_type)
self.server.sendmail(self.sender, [receiver], msg.as_string())
print(f"发送成功: {receiver}")
return True
except Exception as e:
print(f"发送失败[{receiver}]: {str(e)}")
return False
def send_bulk_from_csv(self,
csv_path: str,
subject: str,
content_template: str,
delay: float = 1.0) -> dict:
"""
从CSV文件批量发送
:param csv_path: 收件人CSV文件路径
:param subject: 邮件主题(支持{name}占位符)
:param content_template: 内容模板(支持{name}等占位符)
:param delay: 发送间隔(秒)
:return: 发送结果统计
"""
results = {"total": 0, "success": 0, "failed": 0}
try:
with open(csv_path, mode='r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
results["total"] += 1
# 渲染模板
rendered_content = content_template.format(**row)
rendered_subject = subject.format(**row)
if self.send_single(row['email'], rendered_subject, rendered_content):
results["success"] += 1
else:
results["failed"] += 1
time.sleep(delay) # 防止发送频率过高
except Exception as e:
print(f"批量发送异常: {str(e)}")
return results
def close(self):
"""关闭连接"""
if self.server:
try:
self.server.quit()
except:
pass
使用示例
if name == "main":
# 配置信息
SENDER_EMAIL = "your_email@qq.com"
AUTH_CODE = "your_smtp_auth_code" # 在QQ邮箱设置中获取
# 创建发送器实例
sender = QQMailBulkSender(SENDER_EMAIL, AUTH_CODE)
# 单封邮件发送示例
sender.send_single(
receiver="target1@example.com",
subject="测试邮件",
content="这是一封测试邮件内容"
)
# 批量发送示例(需准备recipients.csv)
template = """尊敬的{name}:
感谢您使用我们的服务,您的会员账号是:{account}
到期时间:{expire_date}
如有任何问题,请联系客服。
"""
results = sender.send_bulk_from_csv(
csv_path="recipients.csv",
subject="您的账户提醒",
content_template=template,
delay=1.5
)
print(f"批量发送完成,成功:{results['success']} 失败:{results['failed']}")
# 关闭连接
sender.close()
三、CSV文件格式要求
name,email,account,expire_date
张三,zhangsan@example.com,AC123456,2025-12-31
李四,lisi@example.com,AC789012,2025-11-30
四、注意事项
必须使用SMTP授权码(非QQ密码)
每日发送上限约500封(根据QQ邮箱规则)
建议发送间隔大于1秒
重要邮件建议添加阅读回执功能
HTML内容需将content_type改为"html"
五、扩展功能建议
添加附件支持
实现邮件追踪功能
加入发送队列管理
开发图形化操作界面
增加发送失败重试机制