使用 Sendgrid 和 Django、SMTP api 和 send_at header 延迟发送电子邮件

Delaying the sending emails with Sendgrid and Django, SMTP api and send_at header

我花了很多时间弄清楚如何在 Django 中的指定时间发送电子邮件,所以我在这里发布它和答案以节省其他人一些时间。

我的用例是在工作时间发送电子邮件。为此使用 celery a bad idea. But Sendgrid 可以发送最多延迟 3 天的电子邮件。这就是我们需要的。

那是我做的:

from django.core.mail import EmailMultiAlternatives
from django.template.context import Context
from django.template.loader import get_template
from smtpapi import SMTPAPIHeader
def send_email(subject, template_name, context, to, bcc=None, from_email=settings.DEFAULT_FROM_EMAIL, send_at=None):
    header = SMTPAPIHeader()
    body = get_template(template_name).render(Context(context))
    if send_at:
        send_at = {"send_at": send_at}
        header.set_send_at(send_at)
    email = EmailMultiAlternatives(
        subject=subject,
        body=body,
        from_email=from_email,
        to=to,
        bcc=bcc,
        headers={'X-SMTPAPI': header.json_string()}

    )
    email.attach_alternative(body, 'text/html')
    email.send()

不要忘记在 header X-SMTPAPI 中设置它,因为我在任何地方都找不到它.. send_at 应该是时间戳

您还可以在这里看到如何添加 header 或除 sendgrid.SendGridClient 之外的任何内容: https://sendgrid.com/docs/Utilities/code_workshop.html/scheduling_parameters.html

import sendgrid
...
sg = sendgrid.SendGridClient('apiKey')
message = sendgrid.Mail()
message.add_to('John Doe <example@mailinator.com>')
message.set_subject('Example')
message.set_html('Body')
message.set_text('Body')
message.set_from('Doe John <example@example.com>')
message.smtpapi.set_send_at(timestamp)
sg.send(message)
当您打印 headers.

时,

send_at = {"send_at": send_at} 生成 X-SMTPAPI: {"send_at": {"send_at": 1643934600}}

相反,只需使用 send_at = send_at 或者您也可以完全删除该行。