在Django项目中使用SendGrid发送带HTML模板的邮件
当然可以实现!在Django项目里结合SendGrid发送带模板、支持上下文传参的美观HTML邮件,有两种实用方案,我给你一步步拆解:
方案一:用Django内置模板系统渲染HTML邮件
这种方式最贴合Django项目的开发习惯,你可以像写普通Django模板一样维护邮件HTML,还能用上Django的模板标签和过滤器。
步骤1:创建HTML邮件模板
在你的Django项目模板目录下(比如templates/email/)新建一个HTML模板文件,比如welcome_email.html:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{{ email_subject }}</title> <style> /* 可以在这里添加CSS样式,让邮件更美观 */ body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; } .container { max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 8px; } .greeting { font-size: 1.2em; font-weight: bold; } </style> </head> <body> <div class="container"> <p class="greeting">Hi {{ username }}!</p> <p>感谢你注册我们的服务,这是一封测试邮件。</p> <p>你的注册邮箱是:<strong>{{ user_email }}</strong></p> <p>如果有任何问题,随时联系我们~</p> <p>祝好,<br>我们的团队</p> </div> </body> </html>
步骤2:用Django模板渲染并发送邮件
修改你的SendGrid代码,用render_to_string渲染模板并传入上下文:
from django.template.loader import render_to_string import sendgrid import os from sendgrid.helpers.mail import Email, Content, Mail # 准备要传入模板的上下文数据 email_context = { 'username': '张三', 'user_email': 'user@example.com', 'email_subject': '欢迎加入我们的平台!' } # 用Django模板渲染HTML内容 html_content = render_to_string('email/welcome_email.html', email_context) # 初始化SendGrid客户端 sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY')) from_email = Email("admin@example.com") to_email = Email(email_context['user_email']) subject = email_context['email_subject'] # 创建HTML类型的邮件内容对象 content = Content("text/html", html_content) mail = Mail(from_email, subject, to_email, content) # 发送邮件并打印响应 response = sg.client.mail.send.post(request_body=mail.get()) print(response.status_code) print(response.body) print(response.headers)
注意事项
- 确保你的模板路径在Django的
TEMPLATES配置中能被找到:要么把模板所在的app加入INSTALLED_APPS,要么在TEMPLATES['DIRS']里添加模板目录路径。 - 邮件里的CSS尽量用内联样式,因为部分邮件客户端对外部样式支持不好。
方案二:使用SendGrid官方动态模板
如果你的团队有专门的运营人员维护邮件模板,或者想在SendGrid后台统一管理模板,这种方案更合适。
步骤1:在SendGrid后台创建动态模板
- 登录SendGrid后台,进入「Email API」→「Dynamic Templates」
- 创建新模板,设计HTML内容并设置动态变量(比如
{{username}}、{{user_email}}) - 记录模板的ID
步骤2:用模板ID发送邮件
直接在代码中指定模板ID,并传入动态上下文数据:
import sendgrid import os from sendgrid.helpers.mail import Email, Mail sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY')) from_email = Email("admin@example.com") to_email = Email("user@example.com") # 初始化邮件对象 mail = Mail(from_email, to_email) # 设置你的SendGrid动态模板ID mail.template_id = "your-sendgrid-template-id-here" # 传入动态上下文数据,对应模板里的变量 mail.dynamic_template_data = { 'username': '张三', 'user_email': 'user@example.com', 'email_subject': '欢迎加入我们的平台!' } # 发送邮件 response = sg.client.mail.send.post(request_body=mail.get()) print(response.status_code) print(response.body) print(response.headers)
两种方案各有优势:方案一适合开发者自主维护模板,能复用Django的模板能力;方案二更适合非技术人员管理模板,模板修改不需要改动代码。
内容的提问来源于stack exchange,提问作者darkhorse
相关产品推荐
相关产品推荐

