>>> from env_helper import info; info()
页面更新时间: 2024-04-07 23:42:08
运行环境:
Linux发行版本: Debian GNU/Linux 12 (bookworm)
操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
Python版本: 3.11.2
2.7. 使用数据库改进 Email 发送功能¶
前文中有对多用户推送邮件案例。这里再次对该案例进行改进。前面是从文本文件中读取用户邮箱,这里可以用数据库方式对推送邮件进行改进。首先将用户邮箱存入到数据库中,接着从数据库中读取出来。优点是可以在存储用户邮箱时给定一个发送状态,在发送时可以对此状态进行判断,发送状态为失败时重新对此用户推送信息。
实例如下:
运行下面代码先行条件:1,创建数据库。2,将用户邮箱存入到数据库中。设定用户邮箱发送状态为0,即失败状态。
导入库以及所用到的参数。设定好smtp服务器邮箱登录帐号和密码。
从数据库获取所有邮箱信息,存放到列表。
>>> 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为失败。
这里并没有直接调用用户邮箱列表,而是遍历后再发送。是因为需要对用户邮箱进行状态记录,代码后面会对邮箱状态进行判断,当邮箱状态为失败时可以重复运行发送命令。
>>> 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