如何在Django联系表单中用模板渲染接收邮件的内容?
实现HTML格式的联系表单邮件
你需要创建一个HTML邮件模板,把表单提交的数据渲染到这个模板里,再作为HTML邮件发送即可,不需要把表单和模板直接关联。具体操作步骤如下:
1. 创建HTML邮件模板
在你的Django项目模板目录下新建一个HTML文件,比如email_contact_template.html,可以参考下面的排版(样式可按需调整):
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>新咨询邮件</title> <style> .mail-box { max-width: 600px; margin: 20px auto; padding: 25px; border: 1px solid #e0e0e0; border-radius: 8px; } .info-row { margin-bottom: 18px; line-height: 1.6; } .info-label { font-weight: 600; color: #2d3748; display: inline-block; width: 80px; } .message-block { margin-top: 25px; padding: 18px; background-color: #f7fafc; border-radius: 4px; } </style> </head> <body> <div class="mail-box"> <h3>收到新的咨询请求</h3> <div class="info-row"> <span class="info-label">姓名:</span>{{ full_name }} </div> <div class="info-row"> <span class="info-label">邮箱:</span>{{ email }} </div> <div class="message-block"> <span class="info-label">内容:</span><br>{{ message|linebreaks }} </div> </div> </body> </html>
2. 修改视图函数
导入Django的render_to_string工具,用它把表单数据渲染到刚才的HTML模板里,再通过send_mail的html_message参数发送HTML格式邮件。修改后的代码如下:
from django.shortcuts import render, redirect from django.core.mail import send_mail, BadHeaderError from django.http import HttpResponse from django.template.loader import render_to_string # 新增导入 def contactPage(request): if request.method == 'POST': form = contactForm(request.POST) if form.is_valid(): subject = "INQUIRY" # 提取表单清理后的数据 full_name = form.cleaned_data['full_name'] email = form.cleaned_data['email_address'] message = form.cleaned_data['message'] # 渲染HTML邮件模板 html_content = render_to_string('email_contact_template.html', { 'full_name': full_name, 'email': email, 'message': message, }) # 同时准备纯文本版本,兼容不支持HTML的邮箱 plain_text_content = f"姓名:{full_name}\n邮箱:{email}\n咨询内容:\n{message}" try: send_mail( subject, plain_text_content, # 纯文本内容作为 fallback '', # 留空则使用settings里配置的DEFAULT_FROM_EMAIL ['your-receive-email@example.com'], # 替换为实际收件邮箱 html_message=html_content # 指定HTML格式内容 ) except BadHeaderError: return HttpResponse('Invalid header found.') return redirect('thankyou') form = contactForm() return render(request, "contact.html", {'form':form})
关键说明
- 核心逻辑是把表单数据传递给邮件模板,渲染成HTML后发送,不需要给表单本身绑定模板。
- 保留纯文本版本是为了兼容老旧邮箱或禁用HTML显示的邮箱,确保所有收件人都能正常查看内容。
- 记得把代码里的收件邮箱替换成你实际要接收邮件的地址,同时确保Django配置文件里的
DEFAULT_FROM_EMAIL已正确设置(如果发件人留空的话)。
内容的提问来源于stack exchange,提问作者David Henson
相关产品推荐
相关产品推荐

