在Django中发送异步邮件-不写入数据库?

vdzxcuhz  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(99)

我希望通过异步发送我的邮件来加快我的网站加载时间。目前,我的代码看起来像这样:

def myFunction(content):
   result = modify(content)
   send_mail('My Subject', result, 'me@example.com')
   return render(request, 'page.html', result)

使用Django-Mailer,我发现我可以通过将电子邮件写入数据库而不是立即发送它来减少加载时间,然后让cron + Django mailer异步处理数据库中的电子邮件。
但是,我希望尽可能保持我的数据库不受潜在敏感信息的影响,并希望避免将通过我的应用程序发送到我的数据库中的任何电子邮件写入。即使数据只是被写入很短的时间,自动备份也有可能保存一些东西。
如果这里没有解决方案,我可以理解,但是有没有一种方法可以异步发送电子邮件而不每次都将它们写入数据库?我真的不认为这是可能的,但我的理想希望是,如果有一种方法来返回的回应,然后发送电子邮件。

def myFunction(content):
   result = modify(content)
   return render(request, 'page.html', result)
   send_mail('My Subject', result, 'me@example.com')

Django-After-Response似乎可以做到这一点,但自2015年以来一直没有更新。
This answerthis answer也提供了潜在的解决方案。

qvk1mo1f

qvk1mo1f1#

你有几个选择。一种方法是拥有一个任务队列和一个执行这些任务的worker。
我喜欢使用Django-RQ https://github.com/rq/django-rq,但Celery是另一个不错的选择。尽管这样做,你需要有一个工人示例运行,还需要一些东西来存储队列,比如Redis。
要获得更简单快速的解决方案,我建议尝试django-background-tasks:https://django-background-tasks.readthedocs.io/en/latest/#这个程序将任务队列存储在数据库中,但它会处理它,因此您不必自己实现它。

vd8tlhqk

vd8tlhqk2#

使用celery作为任务队列,django-celery-email是Django的电子邮件后端,它将电子邮件发送到celery任务。

相关问题