You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置Django本地项目并发送类Google风格的报告邮件

嘿,我来帮你搞定Django自动发邮件的问题!你现在的配置问题主要出在SMTP服务器的设置上——用localhost意味着你本地得有一个运行的邮件服务,而且空的用户名密码肯定没法完成认证。下面分步骤给你解决:

一、修正SMTP配置(推荐用公共邮箱服务)

新手开发最省心的方式是用Gmail、QQ邮箱这类公共服务的SMTP,不用自己搭邮件服务器。这里以Gmail和QQ邮箱为例给你配置:

示例1:Gmail配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True  # Gmail用TLS协议,对应端口587
EMAIL_USE_SSL = False
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = '你的gmail邮箱地址@gmail.com'
EMAIL_HOST_PASSWORD = '你的应用专用密码'  # 划重点:不是普通登录密码!
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = '你的gmail邮箱地址@gmail.com'
  • 关于EMAIL_HOST_PASSWORD:如果你的Gmail开启了两步验证,得去谷歌账号后台生成应用专用密码;如果没开,可以暂时允许“不太安全的应用”(但生产环境绝对不推荐这么做)。

示例2:QQ邮箱配置

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_SSL = True  # QQ邮箱用SSL协议,对应端口465
EMAIL_USE_TLS = False
EMAIL_HOST = 'smtp.qq.com'
EMAIL_HOST_USER = '你的QQ邮箱@qq.com'
EMAIL_HOST_PASSWORD = '你的QQ邮箱授权码'  # 在QQ邮箱设置里生成的授权码,不是登录密码
EMAIL_PORT = 465
DEFAULT_FROM_EMAIL = '你的QQ邮箱@qq.com'

如果你非要用本地SMTP服务器(比如Postfix),那得先在本地安装并配置服务(比如Ubuntu上sudo apt install postfix,选择“本地仅”模式),然后EMAIL_HOST设为localhost,端口25,EMAIL_HOST_USER和密码可以留空,但这种方式只能发本地邮件,新手不推荐。

二、实现类似Google报告的邮件样式

Google的报告邮件走的是简洁清爽的风格,用HTML邮件就能实现。Django推荐用EmailMultiAlternatives来同时发HTML和纯文本版本(兼容老邮件客户端):

1. 写HTML邮件模板

在你的Django项目templates文件夹下新建report_email.html,模仿Google的样式:

<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; color: #202124; }
        .header { background-color: #f8f9fa; padding: 18px; border-radius: 4px; }
        .header h1 { font-size: 20px; margin: 0; font-weight: 500; }
        .content { margin-top: 20px; line-height: 1.6; }
        .stats-block { background-color: #f1f3f4; padding: 15px; border-radius: 4px; margin-top: 15px; }
        .footer { margin-top: 30px; padding-top: 15px; border-top: 1px solid #dadce0; color: #5f6368; font-size: 14px; }
    </style>
</head>
<body>
    <div class="header">
        <h1>你的网站活动报告</h1>
    </div>
    <div class="content">
        <p>您好,以下是您的网站最新统计数据:</p>
        <div class="stats-block">
            <p><strong>总访问量:</strong>{{ report_data.page_views }}</p>
            <p><strong>新增用户:</strong>{{ report_data.new_users }}</p>
            <p><strong>转化次数:</strong>{{ report_data.conversions }}</p>
        </div>
    </div>
    <div class="footer">
        <p>这是自动发送的邮件,无需回复。</p>
    </div>
</body>
</html>

2. 写发送邮件的函数

在你的app里新建一个工具函数,比如utils.py

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.conf import settings

def send_website_report(to_email, report_data):
    # 渲染HTML模板
    html_content = render_to_string('report_email.html', {'report_data': report_data})
    # 纯文本备用(兼容不支持HTML的客户端)
    text_content = f"你的网站活动报告:\n总访问量:{report_data['page_views']}\n新增用户:{report_data['new_users']}\n转化次数:{report_data['conversions']}"

    msg = EmailMultiAlternatives(
        subject="【自动报告】你的网站最新数据",
        body=text_content,
        from_email=settings.DEFAULT_FROM_EMAIL,
        to=[to_email]
    )
    msg.attach_alternative(html_content, "text/html")
    # 发送邮件,fail_silently设为False方便调试
    msg.send(fail_silently=False)

三、测试你的配置

打开Django shell快速测试:

python manage.py shell

然后输入:

from your_app.utils import send_website_report
send_website_report("收件人邮箱@example.com", {"page_views": 1200, "new_users": 45, "conversions": 12})

如果报错,看错误提示:

  • 认证失败:检查用户名和密码/授权码是否正确
  • 连接超时:检查EMAIL_HOSTEMAIL_PORT是否对应,以及防火墙是否允许出站连接
  • 被拒绝:可能触发了邮箱服务商的垃圾邮件规则,换个收件人或者调整邮件内容

最后提醒

  • 生产环境一定要用应用专用密码/授权码,不要开启“不太安全的应用”
  • 注意邮箱服务商的发送频率限制,避免被标记为垃圾邮件
  • HTML邮件尽量用简单的CSS和布局,因为很多邮件客户端不支持复杂样式

内容的提问来源于stack exchange,提问作者Huy Vu The

火山引擎 最新活动