2

我正在尝试使用 SendGrid 发送邮件,但每当我发送 HTML 格式的电子邮件时,它会在电子邮件中显示 HTML 标签,而不是根据需要格式化 HTML。这是我要发送的内容:

<html>
<head></head>
<body>
  <p>Hi!<br>
     How are you?<br>
  </p>
</body>
</html>

这是我的代码:

 def send(self, group=None):
        current_site = Site.objects.get_current()
        domain = unicode(current_site.domain)
        ctx = {
            "group": group,
            "signup_code": self,
            "domain": domain,
        }
        msg = MIMEMultipart('alternative')
        subject = render_to_string("signup_codes/invite_user_subject.txt", ctx)
        msg['subject'] = render_to_string("signup_codes/invite_user_subject.txt", ctx)
        message = render_to_string("signup_codes/invite_user.txt", ctx)
        text = "Hi!\nHow are you?\n"
        part1 = MIMEText(text, 'plain')
        part2 = MIMEText(message,'html')
        msg.attach(part1)
        msg.attach(part2)
        send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [self.email])
        self.sent = datetime.datetime.now()
        self.save()

注意:invite_user.txt包含上面的html。

任何洞察为什么它没有认识到这是 HTML 并相应地格式化它?我错过了什么吗?

4

1 回答 1

3

默认情况下,Django 邮件程序只发送电子邮件的文本部分。您需要将其设置为 html(这是不好的做法)或使用 EmailMultiAlternatives 类。所以,我认为这就是你真正想要的:

from django.core.mail import EmailMultiAlternatives

def send(self, group=None):
  current_site = Site.objects.get_current()
  domain = unicode(current_site.domain)
  ctx = {
      "group": group,
      "signup_code": self,
      "domain": domain,
  }

  subject = render_to_string("signup_codes/invite_user_subject.txt", ctx)
  text_content = "Hi!\nHow are you?\n"
  html_content = render_to_string("signup_codes/invite_user.txt", ctx)

  msg = EmailMultiAlternatives(subject, text_content, settings.DEFAULT_FROM_EMAIL, [self.email])
  msg.attach_alternative(html_content, "text/html")

  msg.send()

此外,还有一个官方的 SendGrid python 包,您可能需要考虑将其作为使用内置 Django 函数的替代方案。在这里查看:

https://github.com/sendgrid/sendgrid-python/

于 2013-01-29T22:58:11.347 回答