使用 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
或者您也可以完全删除该行。
我花了很多时间弄清楚如何在 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)
send_at = {"send_at": send_at}
生成 X-SMTPAPI: {"send_at": {"send_at": 1643934600}}
相反,只需使用 send_at = send_at
或者您也可以完全删除该行。