深度分析Django基础教程之Django发送邮件的“骚操作”
兄弟们,姐妹们,各位在代码世界里“搬砖”的小伙伴们,今天咱们来聊一个几乎每个Django项目都绕不开,但又经常让人抓耳挠腮的功能——发送邮件。
想象一下这个场景:用户在你的网站注册了,你得给他发个验证链接吧?用户下单买了东西,你得发个订单确认邮件吧?网站出了点小毛病,你得赶紧给管理员发个报警邮件吧?
这些需求,说白了,就是让你的Django应用学会“张嘴说话”,主动联系用户。但这个过程,你是不是也经历过这样的心路历程:
- “啊?发邮件?听起来好复杂,是不是要自己搭个邮件服务器?” (内心OS:告辞!)
- “哦,原来可以用第三方服务。那代码怎么写?API会不会很难调?” (开始头秃)
- “调试的时候邮件发不出去,报错信息看得我一脸懵逼…” (逐渐暴躁)
打住!今天,我就要用最“人话”的方式,把Django发送邮件这事儿给你捋得明明白白。咱们不整那些高深莫测的理论,就把这事儿比作我们熟悉的 “网购” ,你会发现,它其实简单得一塌糊涂。
第一章:出发前,先找好“邮局”(配置篇)
你想寄包裹,总得先找到一家邮局或者快递公司吧?在Django的世界里,这个“邮局”就是你的邮件后端(Email Backend) 和 SMTP服务器。
绝大多数情况下,我们不需要自己建邮局(架设邮件服务器),直接用现成的大快递公司就行,比如:
- QQ邮箱/163邮箱的SMTP服务:像本地的便民快递点,免费好用,适合个人项目或测试。
- SendGrid, Mailgun:像顺丰、京东这样的专业物流公司,功能强大,送达率高,适合生产环境的商业项目。
好,选定“快递公司”后,我们就要在Django的settings.py文件里,填写收货地址(配置信息)了。
# settings.py # 这是你的“快递公司合作合同”
# 指定你用哪家邮局(后端),这里我们用的是万能的SMTP邮局
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# 你的“快递公司”地址 (SMTP服务器地址)
# 以QQ邮箱为例,它的“仓库”在 smtp.qq.com
EMAIL_HOST = 'smtp.qq.com'
# “仓库”的端口号,通常用587这个安全端口
EMAIL_PORT = 587
# 你的“发货人”账号 (你的邮箱地址)
EMAIL_HOST_USER = 'your_email@qq.com'
# 这不是你的邮箱密码!是专门的“授权码”
# (在邮箱设置里开启SMTP服务后获取,相当于快递员的工牌)
EMAIL_HOST_PASSWORD = 'your_authorization_code'
# 必须开启,保证包裹在运输过程中是加密的,不会被偷看
EMAIL_USE_TLS = True
# 默认的发件人署名,如果不单独指定,就用这个
DEFAULT_FROM_EMAIL = '你的酷炫网站 <your_email@qq.com>'
划重点:
EMAIL_HOST_PASSWORD填的不是你的邮箱登录密码,而是授权码!这是为了保护你的账号安全。去你的邮箱设置里,找到“POP3/SMTP服务”,开启它就能拿到这个码。EMAIL_USE_TLS = True就像是给包裹贴上了“防拆封”条,非常重要。
配置写完,你的Django项目就已经和“邮局”建立好合作关系了!
第二章:打包你的“宝贝”(编写邮件内容)
邮局找好了,接下来我们要准备要寄出的“宝贝”——也就是邮件本身。一封邮件,最基本的需要有:收件人地址、主题、内容。
Django非常贴心地为我们准备了一个打包工具——django.core.mail.send_mail函数。
# views.py 或者你任何想发邮件的地方
from django.core.mail import send_mail
def send_welcome_email(request):
# 想象一下,这就是你在填写快递单
subject = '欢迎来到我的酷炫网站!' # 快递单上的“物品名称”
message = f'''
嗨,亲爱的用户!
感谢你注册我们的网站,你的到来让蓬荜生辉!
开始你的探索之旅吧!
''' # 这是放在包裹里的“纯文字信件”
from_email = DEFAULT_FROM_EMAIL # 发货地址,直接用我们合同里写的默认地址
recipient_list = ['customer@example.com'] # 收件人地址,可以是一个列表,表示可以群发!
# 最关键的一步:把包裹交给邮局!
send_mail(subject, message, from_email, recipient_list)
return HttpResponse("欢迎邮件已发送!")
看,就这么简单!一个send_mail函数,参数一目了然,是不是跟填快递单一模一样?调用这个函数,Django就会拿着你打包好的“邮件包裹”,通过刚才配置好的“邮局”,稳稳地送到收件人手里。
第三章:进阶玩法——寄出“豪华大礼包”(HTML邮件与附件)
如果只会发纯文本邮件,那就像你网购只收到了一个干巴巴的纸盒子。我们想要的是那种带着精美海报、产品小样的“豪华礼盒”,对吧?这就是 HTML邮件 和 附件。
这时候,我们的打包工具要升级了,从send_mail换成更强大的 EmailMessage 类。
1. 寄出“带海报的礼盒”(HTML邮件)
from django.core.mail import EmailMessage
def send_fancy_email(request):
# 创建 EmailMessage 对象,这是一个更高级的“打包台”
email = EmailMessage(
subject='这是你的豪华版HTML邮件', # 主题
body='<h1>哇!我是带样式的标题!</h1><p>还有<strong>加粗</strong>的文字!</p>', # 这里是HTML内容!
from_email=DEFAULT_FROM_EMAIL,
to=['customer@example.com'],
)
# 最关键的一步:告诉邮局,我这个包裹里的信是HTML格式的!
email.content_subtype = "html" # 默认是 "plain"(纯文本)
email.send()
return HttpResponse("豪华HTML邮件已发送!")
收件人收到这封邮件,看到的就是渲染好的HTML样式,不再是单调的纯文本了!
2. 给礼盒里“塞点小礼物”(添加附件)
def send_email_with_attachment(request):
email = EmailMessage(
subject='您的购买凭证及电子书',
body='请查收您的订单发票和赠送的电子书。',
from_email=DEFAULT_FROM_EMAIL,
to=['customer@example.com'],
)
# 塞入第一个礼物:一张图片附件
with open('/path/to/your/invoice.pdf', 'rb') as file:
email.attach('我的发票.pdf', file.read(), 'application/pdf')
# 塞入第二个礼物:一个电子书
with open('/path/to/your/ebook.epub', 'rb') as file:
email.attach('精选电子书.epub', file.read(), 'application/epub+zip')
# 甚至,你还可以直接“现场制作”一个附件,而不依赖本地文件
email.attach('debug_info.txt', '这是一些现场生成的调试信息。。。', 'text/plain')
email.send()
return HttpResponse("带附件的邮件已发送!")
attach 方法就是这么强大,不管是本地文件还是内存中的数据,都能轻松变成邮件附件,一起寄出去。
第四章:完整示例——用户注册后,一键三连发
理论说再多,不如一个完整的“全家桶”示例来得实在。假设我们有一个用户注册功能,注册成功后,我们要做三件事:
- 给用户发欢迎邮件(HTML格式)。
- 给管理员发新用户通知邮件。
- 给用户发一个优惠券PDF附件。
# views.py
from django.http import HttpResponse
from django.core.mail import EmailMultiAlternatives # 可以同时发文本和HTML版本
from django.template.loader import render_to_string # 用于渲染HTML模板
import os
def user_registration(request):
# 假设这里是你的注册逻辑,我们模拟一个注册成功的用户
user_email = 'new_user@example.com'
username = '码农小张'
# 1. 准备给用户的豪华欢迎邮件
html_content = render_to_string('welcome_email.html', {
'username': username,
})
text_content = '欢迎你{}!感谢注册,请访问我们的网站开始探索。'.format(username)
email_to_user = EmailMultiAlternatives(
subject='欢迎加入我们,{}!'.format(username),
body=text_content, # 纯文本内容,给不支持HTML的邮件客户端看
from_email=DEFAULT_FROM_EMAIL,
to=[user_email],
)
email_to_user.attach_alternative(html_content, "text/html") # 附加HTML版本
# 模拟一个优惠券PDF(实际中你可能是生成的)
coupon_path = '/path/to/generated/coupon.pdf'
if os.path.exists(coupon_path):
with open(coupon_path, 'rb') as pdf:
email_to_user.attach('专属优惠券.pdf', pdf.read(), 'application/pdf')
# 寄出!
email_to_user.send()
# 2. 给管理员发个简单的通知
send_mail(
subject='有新用户注册啦!',
message='用户 {} ({}) 刚刚注册了网站。'.format(username, user_email),
from_email=DEFAULT_FROM_EMAIL,
recipient_list=['admin@yourwebsite.com'], # 管理员的邮箱
)
return HttpResponse("注册成功!欢迎邮件和优惠券已经发送到你的邮箱!")
对应的模板文件 welcome_email.html:
<!DOCTYPE html>
<html>
<body>
<h1 style="color: #4CAF50;">嗨,{{ username }}!</h1>
<p>恭喜你成功解锁我们的全部会员权益!</p>
<p>你的编程之旅即将开启,我们为你准备了一份 <strong>专属优惠券</strong>,详见附件。</p>
<br>
<p><a href="https://yourwebsite.com" style="background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none;">立刻开始探索</a></p>
<hr>
<p><small>如果按钮点击无效,请复制以下链接到浏览器:<br>https://yourwebsite.com</small></p>
</body>
</html>
结语:别再让邮件成为你的心结
看到这里,你是不是已经感觉Django发邮件这事儿,从“高山仰止”变成了“不过如此”?
我们来快速复盘一下核心步骤:
- 找邮局:在
settings.py里配置SMTP参数(特别是授权码!)。 - 打包:用
send_mail发简单文本,用EmailMessage或EmailMultiAlternatives发HTML和附件。 - 寄出:调用
.send()方法。
下次当你的产品经理再跟你说“这里需要加个邮件通知”时,你就可以自信地回他一句:“小事一桩,分分钟搞定!”
希望这篇“保姆级”+“网购”比喻的教程,能真正帮你把Django发送邮件这个技能点稳稳点亮。代码写起来,邮件发起来吧!

被折叠的 条评论
为什么被折叠?



