如何通过Django使用SMTP服务器发送邮件
关键要点
- 配置SMTP设置:在settings.py中设置EMAIL_BACKEND、EMAIL_HOST等参数
- 使用Django Environ保护凭证:通过环境变量管理敏感信息
- 生成应用专用密码:为Gmail启用两步验证并创建应用密码
- 使用send_mail发送邮件:通过Django shell、视图或辅助函数发送邮件
- 构建自动联系表单:集成Django表单与邮件发送功能
SMTP服务器与协议
SMTP(简单邮件传输协议)定义了邮件从发件人到收件人的传输规则。我们以Gmail为例:
创建Django项目
- 创建虚拟环境:
1
2
|
python -m venv .venv
source .venv/bin/activate
|
- 安装Django:
- 创建项目:
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应用密码
- 启用Google账户的两步验证
- 生成16字符的应用密码
使用Django Environ保护凭证
- 创建.env文件:
1
2
3
|
EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=YourEmail@address
EMAIL_HOST_PASSWORD=YourAppPassword
|
- 安装django-environ:
1
|
pip install django-environ
|
- 在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']
)
|
构建自动联系表单
- 创建contact应用:
1
|
python manage.py startapp contact
|
- 创建表单类(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]
)
|
- 创建视图(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']
)
|
最佳实践
- 创建可重用的邮件发送函数
- 编写单元测试验证邮件功能
- 发送HTML格式的富文本邮件
- 生产环境使用专业邮件服务(SendGrid/Mailgun等)
- 用户注册时实现邮件验证功能
常见问题解答
Q: 如何测试邮件发送而不实际发送?
A: 使用控制台后端:
1
|
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
|
Q: 如何接收Django中的邮件?
A: 配置IMAP服务器设置并使用imaplib库检索邮件
本教程详细介绍了Django邮件发送的完整流程,从基础配置到高级功能实现,帮助开发者快速集成邮件功能到自己的项目中。