将 Django URL 插入自定义电子邮件模板

Posted

技术标签:

【中文标题】将 Django URL 插入自定义电子邮件模板【英文标题】:Inserting a Django URL into a custom email template 【发布时间】:2020-02-09 23:49:26 【问题描述】:

我正在尝试在我为我的网站制作的自定义模板中发送一封 Django 电子邮件。

但是,我无法让 Django URL 链接正常工作。没有模板,我可以让链接工作。用户名可供参考。

有人知道怎么做吗?

这是我的 views.py

    #This code is in the view that sends the email
    from django.core.mail import EmailMessage
    from django.core.mail import EmailMultiAlternatives
    from django.template.loader import get_template
    from django.template import Context

    subject, from_email = 'subject', '<info@mysite.com>'
    plaintext = get_template('email.txt')
    htmly = get_template('email.html')
    username = user.username
    d =  'username': username 
    text_content = plaintext.render(d)
    html_content = htmly.render(d)            
    msg = EmailMultiAlternatives(subject, text_content, from_email, [user.email])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

此设置基于此答案:Creating email templates with Django

这里是 email.html 文件:

    <h3>Hi <strong> username </strong>,</h6>
    <p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
    <a href="http://domain% url 'home' %">Check Now</a>

这是 email.txt:

    Hi  username ,
    disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:
    http://domain% url 'home' %

【问题讨论】:

您遇到了什么错误或任何回溯? @ParthS007 没有错误,电子邮件发送。链接只是空白。什么都没有显示。 【参考方案1】:

我认为您在电子邮件模板中的链接中缺少绝对 URL。

当您发送电子邮件时,Django 会使用相对 URL 填充 URL,并且您的 Gmail 邮件客户端可能正在使用自己的域和语言前缀路径填充 URL。

您需要在 Django 模板中添加当前站点的域名。

&lt;a&gt; 将如下所示:

<a href=" request.scheme :// request.get_host % url 'home' %">Check Now</a>

为电子邮件呈现模板,这是您需要主机值的情况之一:

from django.template.loader import render_to_string

def view(request):
    ...
    email_body = render_to_string(
        'template.txt', context, request=request)

【讨论】:

【参考方案2】:

不确定您的模板,但如果我没记错 Django 网址,您可以在代码中使用 reverse 并通过上下文将解析后的网址传递给您的模板。所以它会是这样的:

from django.core.mail import EmailMessage
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context
from django.urls import reverse

subject, from_email = 'subject', '<info@mysite.com>'
plaintext = get_template('email.txt')
htmly = get_template('email.html')
username = user.username
d =  'username': username, 'url': reverse('home') 
text_content = plaintext.render(d)
html_content = htmly.render(d)            
msg = EmailMultiAlternatives(subject, text_content, from_email, [user.email])
msg.attach_alternative(html_content, "text/html")
msg.send()

模板:

<h3>Hi <strong> username </strong>,</h6>
<p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
<a href="http://domain url ">Check Now</a>

【讨论】:

太棒了,让我试试这个。我会告诉你它是否有效。

以上是关于将 Django URL 插入自定义电子邮件模板的主要内容,如果未能解决你的问题,请参考以下文章

使用操作 URL 将电子邮件模板中的 Firebase 项目名称替换为自定义域

自定义激活电子邮件在 Django 中不起作用

如何自定义 django rest auth 密码重置电子邮件内容/模板

Django 模板标签插入或替换 URL 参数

如何根据 django 模板中的不同提交按钮在更新视图中自定义成功 url?

在 Django 中使用自定义用户模型总是在模板中返回匿名用户