使用Django通过SMTP服务器发送邮件的完整指南

本教程详细介绍了如何在Django项目中配置SMTP服务器发送邮件,包括Gmail设置、安全凭证管理、构建自动联系表单以及异步邮件发送等实用技术。

如何通过Django使用SMTP服务器发送邮件

关键要点

  • 配置SMTP设置:在settings.py中设置EMAIL_BACKEND、EMAIL_HOST等参数
  • 使用Django Environ保护凭证:通过环境变量管理敏感信息
  • 生成应用专用密码:为Gmail启用两步验证并创建应用密码
  • 使用send_mail发送邮件:通过Django shell、视图或辅助函数发送邮件
  • 构建自动联系表单:集成Django表单与邮件发送功能

SMTP服务器与协议

SMTP(简单邮件传输协议)定义了邮件从发件人到收件人的传输规则。我们以Gmail为例:

  • 地址:smtp.gmail.com
  • 端口:587

创建Django项目

  1. 创建虚拟环境:
1
2
python -m venv .venv
source .venv/bin/activate
  1. 安装Django:
1
pip install django
  1. 创建项目:
1
2
3
django-admin startproject EmailProject
cd EmailProject
python manage.py runserver

配置SMTP后端

在settings.py中添加:

1
2
3
4
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

设置Gmail应用密码

  1. 启用Google账户的两步验证
  2. 生成16字符的应用密码

使用Django Environ保护凭证

  1. 创建.env文件:
1
2
3
EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=YourEmail@address
EMAIL_HOST_PASSWORD=YourAppPassword
  1. 安装django-environ:
1
pip install django-environ
  1. 在settings.py中读取环境变量:
1
2
3
4
5
6
7
import environ
env = environ.Env()
environ.Env.read_env()

EMAIL_HOST = env('EMAIL_HOST')
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')

通过Django Shell发送邮件

1
2
3
4
5
6
7
from django.core.mail import send_mail
send_mail(
    subject='测试主题',
    message='测试内容',
    from_email=settings.EMAIL_HOST_USER,
    recipient_list=['recipient@example.com']
)

构建自动联系表单

  1. 创建contact应用:
1
python manage.py startapp contact
  1. 创建表单类(forms.py):
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class ContactForm(forms.Form):
    name = forms.CharField(max_length=120)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)
    
    def send(self):
        send_mail(
            subject=f"来自{self.cleaned_data['name']}的留言",
            message=self.cleaned_data['message'],
            from_email=settings.EMAIL_HOST_USER,
            recipient_list=[settings.RECIPIENT_ADDRESS]
        )
  1. 创建视图(views.py):
1
2
3
4
5
6
7
class ContactView(FormView):
    template_name = 'contact/contact.html'
    form_class = ContactForm
    
    def form_valid(self, form):
        form.send()
        return super().form_valid(form)

异步邮件发送(Django 4.x+)

1
2
3
4
5
6
7
async def send_async_email():
    await send_mail(
        subject="异步邮件测试",
        message="这封邮件通过Django异步发送",
        from_email=settings.EMAIL_HOST_USER,
        recipient_list=['recipient@example.com']
    )

最佳实践

  1. 创建可重用的邮件发送函数
  2. 编写单元测试验证邮件功能
  3. 发送HTML格式的富文本邮件
  4. 生产环境使用专业邮件服务(SendGrid/Mailgun等)
  5. 用户注册时实现邮件验证功能

常见问题解答

Q: 如何测试邮件发送而不实际发送? A: 使用控制台后端:

1
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

Q: 如何接收Django中的邮件? A: 配置IMAP服务器设置并使用imaplib库检索邮件

本教程详细介绍了Django邮件发送的完整流程,从基础配置到高级功能实现,帮助开发者快速集成邮件功能到自己的项目中。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计