如何通过Django发送包含iframe的邮件?
Django 发送嵌入谷歌地图iframe的HTML邮件实现步骤
前置说明
绝大多数邮件客户端默认会拦截iframe内容以防范恶意代码,发送前请先确认目标用户常用的邮件客户端是否支持iframe加载,无法支持的场景建议替换为谷歌地图静态图片,点击图片跳转至网页版地图地址
步骤1:配置Django邮件基础参数
在项目settings.py中添加SMTP服务配置,示例如下:
# settings.py 邮件配置示例 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = '你的SMTP服务地址' # 如smtp.gmail.com、smtp.qq.com EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的发件邮箱' EMAIL_HOST_PASSWORD = '你的邮箱授权码' DEFAULT_FROM_EMAIL = '发件人展示名称 <你的发件邮箱>'
步骤2:准备带iframe的HTML邮件模板
在项目templates目录下新建邮件HTML模板,例如activity_map_email.html,直接写入你已有的带谷歌地图iframe的模板代码即可,注意iframe的src必须使用HTTPS协议:
<!-- templates/activity_map_email.html 示例 --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>活动位置通知</title> </head> <body> <p>您好,本次活动的具体位置如下:</p> <!-- 替换为你自己的谷歌地图iframe代码 --> <iframe src="https://www.google.com/maps/embed?pb=你的地图专属参数" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy" ></iframe> </body> </html>
步骤3:编写邮件发送逻辑
使用Django内置的EmailMultiAlternatives类发送带HTML内容的邮件,同时提供纯文本兜底内容适配不支持HTML的客户端:
# 你的业务逻辑文件,如views.py、tasks.py from django.core.mail import EmailMultiAlternatives from django.template.loader import render_to_string def send_activity_map_email(receiver_list): # 渲染HTML邮件模板,需要传递动态参数时可添加第二个参数context={'key':value} html_content = render_to_string('activity_map_email.html') # 纯文本兜底内容 text_content = '您的邮件客户端不支持HTML内容,可点击链接查看活动位置:https://www.google.com/maps/place/你的位置地址' # 构造邮件对象 mail_msg = EmailMultiAlternatives( subject="本次活动位置通知", body=text_content, to=receiver_list ) # 附加HTML格式内容 mail_msg.attach_alternative(html_content, "text/html") # 执行发送 mail_msg.send()
注意事项
- 正式发送前先做多邮箱测试,向Gmail、Outlook、国内常用邮箱发送测试邮件确认iframe可正常加载,部分企业邮箱、国内个人邮箱会完全拦截iframe
- 不要在iframe内添加任何脚本代码,所有邮件客户端都会禁止iframe内的脚本执行
- 批量发送邮件建议搭配Celery做异步处理,避免阻塞主业务流程
内容的提问来源于stack exchange,提问作者Alexei Safronov
相关产品推荐
相关产品推荐

