在先前实现的多用户邮件推送案例基础上,现提出基于数据库存储的优化方案, 将原本从文本文件读取邮箱的方式升级为数据库存储与读取机制。 通过将用户邮箱信息持久化存储至数据库,并增设发送状态标识字段, 系统可在执行邮件推送时动态查询待发送用户。依据状态标识智能过滤已成功投递的收件人, 同时对发送失败的记录自动触发重试机制。
import sys
import datetime
import time
from cfg import email_cfg
import yagmail
receivers_arr = []
list = email_list.select().where(email_list.success=='0')
for email_l in list:
tt = email_l.email.strip()
receivers_arr.append(tt)
receivers = set(receivers_arr)
写邮件内容,登录服务器邮箱。
yag = yagmail.SMTP( user=email_cfg['user'], password=email_cfg['passwd'], host='smtp.163.com')
contents = 'yagmail Email test'
在邮件推送过程中,系统会实时更新每条用户邮箱记录的发送状态。 成功发送的标记为1,发送失败的标记为0,以便后续进行状态追踪和失败重发处理。
系统采用逐条遍历的方式处理用户邮箱列表,在每次发送邮件后立即更新对应邮箱的状态标识(成功标记为1,失败标记为0)。 这种设计使得后续可以通过状态检查机制对发送失败的邮箱进行精准识别, 并在重新执行发送命令时自动针对失败记录进行重发操作,从而确保邮件投递的完整性和可靠性。
idx_c = 1
for reci in receivers:
yag.send(reci, 'subject', contents)
if idx_c > 10:
yag = yagmail.SMTP( user=email_cfg['user'], password=email_cfg['passwd'], host='smtp.163.com')
idx_c = 0
try:
e_find = email_list.get(email=reci)
yag.send(reci, 'subject', contents)
e_up = email_list.get(email=reci)
e_up.success = '1'
e_up.save()
print('成功1')
except:
print('err', reci)
# 发送失败的邮箱尝试发送5次
for i in range(5):
try:
e_find = email_list.get(email=reci)
if e_find.success == '0':
yag.send(reci, 'subject', contents)
e_up = email_list.get(email=reci)
e_up.success = '1'
e_up.save()
print('成功')
else:
print('已发送')
continue
except:
e_up = email_list(email=reci)
e_up.success = '0'
e_up.save()
print('失败')
time.sleep(.2)
idx_c = idx_c + 1
成功1 成功1 成功1