Flask 邮件,发送批量电子邮件时连接关闭
flask mail, connection closed when sending bulk email
我有一个基于 flask 的 Web 应用程序以及用于发送电子邮件的 flask-mail (https://pythonhosted.org/flask-mail/)。
我是 运行 一个 cronjob,每 5 分钟检查一次数据库中的更新,如果发现更新,它会向所有受这些更新影响的用户发送一堆电子邮件。可能会发生发送的电子邮件数量如此之大以致于作业在 5 分钟内没有完成,这意味着 cron 正在并行启动另一个作业。我的理解是,如果 5 分钟后它仍然是 运行,cron 不会终止旧作业。但是,似乎发生的情况是发送电子邮件的连接在旧作业中被关闭了?这意味着在这种情况下,并非所有用户都会收到电子邮件。
这是我发送电子邮件的方式
users = models.User.query.filter_by(query_email_notification=1).all()
if users:
# Bulk emails... keep connection open
with app.app_context():
with mail.connect() as conn:
for user in users:
subject = "subject"
message = 'Hi'
msg = Message(recipients=[user.email],
body=message,subject=subject, sender='me@gmail.com')
conn.send(msg)
这基本上是在遵循 flask-mail 网站上的主要示例。但是,每当新的 cronjob 启动时,连接就会关闭并且不再发送电子邮件。有谁知道为什么会发生这种情况以及我该如何预防?
一种解决方案是确保 cron 仅在旧作业完成后才开始新作业。但这对 cron 来说似乎很混乱。有没有其他软件可以做到这一点?
谢谢卡尔
可以使用 flock
to serialize long-running cron jobs. See, for example, https://serverfault.com/a/461637/82655
我有一个基于 flask 的 Web 应用程序以及用于发送电子邮件的 flask-mail (https://pythonhosted.org/flask-mail/)。 我是 运行 一个 cronjob,每 5 分钟检查一次数据库中的更新,如果发现更新,它会向所有受这些更新影响的用户发送一堆电子邮件。可能会发生发送的电子邮件数量如此之大以致于作业在 5 分钟内没有完成,这意味着 cron 正在并行启动另一个作业。我的理解是,如果 5 分钟后它仍然是 运行,cron 不会终止旧作业。但是,似乎发生的情况是发送电子邮件的连接在旧作业中被关闭了?这意味着在这种情况下,并非所有用户都会收到电子邮件。 这是我发送电子邮件的方式
users = models.User.query.filter_by(query_email_notification=1).all()
if users:
# Bulk emails... keep connection open
with app.app_context():
with mail.connect() as conn:
for user in users:
subject = "subject"
message = 'Hi'
msg = Message(recipients=[user.email],
body=message,subject=subject, sender='me@gmail.com')
conn.send(msg)
这基本上是在遵循 flask-mail 网站上的主要示例。但是,每当新的 cronjob 启动时,连接就会关闭并且不再发送电子邮件。有谁知道为什么会发生这种情况以及我该如何预防? 一种解决方案是确保 cron 仅在旧作业完成后才开始新作业。但这对 cron 来说似乎很混乱。有没有其他软件可以做到这一点? 谢谢卡尔
可以使用 flock
to serialize long-running cron jobs. See, for example, https://serverfault.com/a/461637/82655