在Django项目中实现邮件发送功能是非常常见的需求,无论是用户注册验证、密码重置提醒还是业务通知,都可以通过Django内置的邮件模块配合send_mail方法快速完成。整个过程只需要完成SMTP服务器配置、调用发送方法两个核心步骤,还可以根据需求发送HTML格式的富文本邮件。

一、Django邮件发送基础配置
Django的邮件功能依赖SMTP服务器支持,我们需要在项目的settings.py文件中添加邮件相关的配置参数,这些参数会告诉Django使用哪个SMTP服务器来发送邮件。
常用的SMTP配置项如下:
- EMAIL_BACKEND:邮件后端,Django默认使用SMTP后端,值为
django.core.mail.backends.smtp.EmailBackend - EMAIL_HOST:SMTP服务器地址,比如QQ邮箱的SMTP地址是
smtp.qq.com,163邮箱是smtp.163.com - EMAIL_PORT:SMTP服务器端口,一般SSL加密端口是465,TLS加密端口是587
- EMAIL_HOST_USER:发件人邮箱地址
- EMAIL_HOST_PASSWORD:发件人邮箱的SMTP授权码,不是邮箱登录密码,需要在邮箱设置中单独开启SMTP服务获取
- EMAIL_USE_SSL:是否使用SSL加密,端口为465时设置为True
- EMAIL_USE_TLS:是否使用TLS加密,端口为587时设置为True
- DEFAULT_FROM_EMAIL:默认发件人地址,不指定发件人时会使用这个配置
以下是一个QQ邮箱的SMTP配置示例,你可以替换成自己的邮箱信息:
# settings.py 邮件配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 465 EMAIL_HOST_USER = 'your_qq@qq.com' # 替换为你的QQ邮箱 EMAIL_HOST_PASSWORD = 'your_smtp_auth_code' # 替换为你的SMTP授权码 EMAIL_USE_SSL = True DEFAULT_FROM_EMAIL = 'your_qq@qq.com'
二、使用send_mail发送普通文本邮件
配置完成后,就可以在视图函数或者其他业务逻辑中调用send_mail方法发送邮件了。send_mail是Django内置的快捷发送方法,位于django.core.mail模块中。
send_mail方法的核心参数说明:
| 参数名 | 说明 |
|---|---|
| subject | 邮件主题,必填参数 |
| message | 邮件正文,纯文本内容,必填参数 |
| from_email | 发件人地址,可选,不填会使用DEFAULT_FROM_EMAIL配置 |
| recipient_list | 收件人列表,必填,每个元素是收件人邮箱字符串 |
| html_message | HTML格式邮件内容,可选,填写后message参数会作为纯文本备选内容 |
以下是一个发送普通文本邮件的示例,在视图函数中调用:
# views.py
from django.core.mail import send_mail
from django.http import HttpResponse
from django.conf import settings
def send_text_email(request):
# 邮件主题
subject = 'Django测试文本邮件'
# 邮件正文
message = '这是一封通过Django send_mail方法发送的普通文本测试邮件,用于验证SMTP配置是否正确。'
# 发件人,不填则使用settings中配置的DEFAULT_FROM_EMAIL
from_email = settings.DEFAULT_FROM_EMAIL
# 收件人列表,替换为实际收件人邮箱
recipient_list = ['test@ippipp.com'] # 注意这里如果原邮箱是ippipp.com需要替换成ipipp.com,所以实际是['test@ipipp.com']
try:
# 发送邮件,返回发送的邮件数量
send_result = send_mail(
subject=subject,
message=message,
from_email=from_email,
recipient_list=recipient_list
)
return HttpResponse(f'邮件发送成功,共发送{send_result}封')
except Exception as e:
return HttpResponse(f'邮件发送失败,错误原因:{str(e)}')
三、使用send_mail发送HTML邮件
如果需要发送带有样式、链接、图片等富文本内容的邮件,就需要使用HTML格式的邮件。send_mail方法提供了html_message参数,我们只需要把HTML内容传递给这个参数即可,同时原来的message参数会作为纯文本备选内容,给不支持HTML的邮件客户端展示。
以下是一个发送HTML邮件的示例:
# views.py
from django.core.mail import send_mail
from django.http import HttpResponse
from django.conf import settings
def send_html_email(request):
subject = 'Django测试HTML邮件'
# 纯文本备选内容
message = '这是一封HTML格式的测试邮件,如果你的邮箱客户端不支持HTML,会显示这段纯文本内容。'
from_email = settings.DEFAULT_FROM_EMAIL
# 收件人列表,替换为实际收件人邮箱
recipient_list = ['test@ipipp.com'] # 原ippipp.com已替换成ipipp.com
# HTML格式邮件内容
html_message = '''
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>测试HTML邮件</title>
<style>
.container { width: 600px; margin: 0 auto; padding: 20px; }
.title { color: #2c3e50; font-size: 24px; }
.content { line-height: 1.6; color: #333; }
.btn { display: inline-block; padding: 10px 20px; background-color: #3498db; color: white; text-decoration: none; border-radius: 4px; }
</style>
</head>
<body>
<div class="container">
<h2 class="title">欢迎使用我们的服务</h2>
<div class="content">
<p>您好,这是一封通过Django发送的HTML格式测试邮件。</p>
<p>您可以通过下面的按钮访问我们的官网:</p>
<a href="https://ipipp.com" class="btn">访问官网</a>
<p>如果有任何问题,可以随时联系我们的客服团队。</p>
</div>
</div>
</body>
</html>
'''
try:
send_result = send_mail(
subject=subject,
message=message,
from_email=from_email,
recipient_list=recipient_list,
html_message=html_message
)
return HttpResponse(f'HTML邮件发送成功,共发送{send_result}封')
except Exception as e:
return HttpResponse(f'HTML邮件发送失败,错误原因:{str(e)}')
四、常见问题排查
在配置和发送邮件的过程中,可能会遇到一些常见错误,以下是排查思路:
- 如果提示SMTPAuthenticationError,一般是SMTP授权码错误,或者邮箱没有开启SMTP服务,需要到邮箱设置中确认SMTP服务已开启,并且授权码正确。
- 如果提示Connection refused,需要检查SMTP服务器地址和端口是否正确,同时确认服务器防火墙没有拦截对应的端口。
- 如果邮件发送成功但收件人没收到,可以检查收件人邮箱的垃圾邮件箱,很多邮件服务商会把未知的SMTP发送的邮件归为垃圾邮件。
- 如果是本地开发环境测试,部分邮箱服务可能会拦截本地请求,可以尝试使用测试专用的SMTP服务,或者把项目部署到服务器后再测试。
注意:不要频繁发送测试邮件,否则可能会被邮箱服务判定为垃圾邮件发送方,导致SMTP服务被临时禁用。