在send_email()

时间:2016-04-13 00:08:20

标签: python django django-email

我在一封电子邮件中使用html作为消息,并传递一些这样的变量:

subject = 'Some Subject'
plain = render_to_string('templates/email/message.txt',{'name':variableWithSomeValue,'email':otherVariable})
html = render_to_string('templates/email/message.html',{'name':variableWithSomeValue,'email':otherVariable})
from_email = setting.EMAIL_HOST_USER
send_email(subject, plain, from_email, [variableToEmail], fail_silently=False, html_message=html)

这样做很好但是现在我需要从数据库中的一个表中获取消息内容,该表有三列,在第一个寄存器中每列都有这个值。列subject包含Account Info,列plain包含Hello {{name}}. Now you can access to the site using this email address {{email}}.,列html包含<p>Hello <strong>{{name}}</strong>.</p> <p>Now you can access to the site using this email address <strong>email</strong>.</p>

因此,为了从数据库中获取值,我执行此操作obj = ModelTable.objects.get(id=1),然后执行以下操作:

subject = obj.subject
plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable})
html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable})
from_email = setting.EMAIL_HOST_USER
send_email(subject, plain, from_email, [variableToEmail], fail_silently=False, html_message=html)

但是这给了我错误

  

AttributeError:'tuple'对象没有属性'encode'

所以我尝试传递值.encode(´utf-8´)并给出相同的错误,然后更改每个变量的值,发现问题来自plain = (obj.plain,{'name':variableWithSomeValue,'email':otherVariable})html = (obj.html,{'name':variableWithSomeValue,'email':otherVariable})所以我认为我以错误的方式传递变量,所以我怎么能以正确的方式做到?或者可能是对数据库的编码,但我认为使用.encode(utf-8)应该解决那个问题,但我真的认为我以错误的方式传递变量nameemail

很抱歉长篇文章和我的语法不好,如果需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

我假设obj.plain和obj.html是表示模板的字符串(存储在数据库中)?

如果是这种情况,那么您仍需要呈现电子邮件内容。但是,您需要根据字符串创建模板,然后再渲染该模板,而不是使用render_to_string作为模板路径的第一个参数。考虑以下内容:

...
from django.template import Context, Template
plain_template = Template(obj.plain)
context = Context({'name':variableWithSomeValue,'email':otherVariable})
email_context = plain_template.render(context)
...
send_email(...)

这是一个更好地解释渲染字符串模板的链接,而不是渲染模板文件。

https://docs.djangoproject.com/en/1.7/ref/templates/api/#rendering-a-context