使用Sendgrid和Django,SMTP api和send_at标头延迟发送电子邮件

时间:2016-03-22 11:32:28

标签: django email scheduling sendgrid

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

我的用例是在工作时间发送电子邮件。使用芹菜是a bad idea。但Sendgrid可以发送最多3天的电子邮件。这就是我们所需要的。

1 个答案:

答案 0 :(得分:1)

我所做的:

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

请勿忘记将其设置在标题 X-SMTPAPI 中,因为我无法在任何地方找到它。 send_at应该是一个时间戳

此外,您还可以看到如何使用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)