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

Inserting a Django URL into a custom email template

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

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

有谁知道如何进行这项工作?

这是我的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' %}

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

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>

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

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

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

<a> 将如下所示:

<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)