>>> 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