【问题标题】:Django 1.7: how to send emails by using an html/css file as templateDjango 1.7:如何使用 html/css 文件作为模板发送电子邮件
【发布时间】:2016-02-20 14:28:00
【问题描述】:

从 Django 1.7 开始,可以使用新参数 send_email()html_message。不幸的是,没有关于如何使用它的综合指南(对新手友好)(或者至少我找不到它)。

我需要使已发送的电子邮件更美观,因此,我试图弄清楚如何将我的消息包含到 html/css 模板中。 我已经阅读了很多关于这个主题的帖子,但其中大多数都引用了以前版本的 Django。 This 帖子适用于 Django 1.7,但答案显示了一个非常基本的 html 文件的用法。

my_html_message.html

<html lang="en">
 <head>
  <link href="path/to/application.css" rel="stylesheet">
 </head>
 <body>
  <div class="email_header">
    [..]
    <a href="http://mysite.it"><img src="images/logo.png"/></a>
  </div>
  <div class="email_body">
   [..]
   {{my_message}}
  </div>
 </body>

my_message.txt

 Dear {{username}}, 
 you won {{money}}.

my_function.py

def my_send_email(request):
 subject = 'Test html email'
 from = 'my@email.com'
 to = 'yours@email.com'
 my_context = Context({'username': user.username,
             'money': user.money})
 html_message = render_to_string('mail/my_html_message.html', c)
 message = render_to_string('mail/my_message.txt', c)
 send_mail(subject,
          message,
          from,
          [to],
          html_message=html_message)

如何将文件my_message.txtmy_context 传递给my_html_message.html 并发送带有自定义样式的电子邮件?

【问题讨论】:

    标签: python html css django email


    【解决方案1】:

    include

    <html lang="en">
     <head>
      <link href="path/to/application.css" rel="stylesheet">
     </head>
     <body>
      <div class="email_header">
        [..]
        <a href="http://mysite.it"><img src="images/logo.png"/></a>
      </div>
      <div class="email_body">
       [..]
       {% include "my_message.txt" %}
      </div>
     </body>
    

    【讨论】:

      【解决方案2】:

      当您为电子邮件编写 HTML 模板时,您应该考虑内联编写您的样式:

      <div style="display: none;"></div>
      

      因为某些电子邮件客户端不会按您的预期显示您的样式。顺便说一句,假设您有一个样式方便的模板。

      <html lang="en">
       <head>
        <link href="path/to/application.css" rel="stylesheet">
       </head>
       <body>
        <div class="email_header">
          [..]
          <a href="http://mysite.it"><img src="images/logo.png"/></a>
        </div>
        <div class="email_body">
         [..]
         Dear {{ name }}
         You won {{ money }}
      
         {# Or you could use include #}
        </div>
       </body>
      

      我假设您已经为您的模板配置了一个目录,并且它运行良好。要发送带有上下文的 HTML 模板,您可以这样做:

      from django.core.mail import EmailMultiAlternatives
      from django.template.loader import get_template
      from django.template import Context
      
      class Email():
      
          @staticmethod
          def send_html_email(*args, **kwargs):
              from_email = kwargs.get('from_email', 'default@email.from')
              context = Context(kwargs.get('context'))
              template = get_template(kwargs.get('template_name'))
              body = template.render(context)
              subject = kwargs.get('subject', 'Default subject here')
              headers = kwargs.get('headers', {})
      
              message = EmailMultiAlternatives(
                      subject,
                      from_email,
                      kwargs.get('to'),
                      headers=headers
                  )
      
              message.attach_alternative(body, 'text/html')
              message.send(fail_silently=False)
      

      然后,当您要发送电子邮件时,请使用send_html_email 方法:

      # views.py
      ...
      data = {
                'from_email': 'my_email@whatever.com',
                'subject': 'My pretty subject',
                'to': ['recipient@email.com', ],
                'template_name': 'templates_dir/my_html_message.html',
                'context': {'name': 'Name of user', 'money': 1000},
              }
      
      Email.send_html_email(**data)
      ...
      

      【讨论】:

      • 谢谢@Gocht,但实际上您的答案是针对较旧(当时是 1.7)的 Django 版本
      • @user123892 我在 Django 1.8 项目中使用此代码,改变的是现在您可以将 reply-to 标头定义为参数。
      • 对不起@Gocht 我不是说你的解决方案不起作用,而是我想使用 Django 1.7 的 send_mail() 中提供的新参数 html_message (docs.djangoproject.com/en/1.8/topics/email/#send-mail)
      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2012-05-17
      • 2017-01-12
      相关资源
      最近更新 更多