Django基础教程(169)Django发送邮件:别挠头了!Django发邮件就像“网购”一样简单,保姆级教程带你一键搞定!

深度分析Django基础教程之Django发送邮件的“骚操作”

兄弟们,姐妹们,各位在代码世界里“搬砖”的小伙伴们,今天咱们来聊一个几乎每个Django项目都绕不开,但又经常让人抓耳挠腮的功能——发送邮件

想象一下这个场景:用户在你的网站注册了,你得给他发个验证链接吧?用户下单买了东西,你得发个订单确认邮件吧?网站出了点小毛病,你得赶紧给管理员发个报警邮件吧?

这些需求,说白了,就是让你的Django应用学会“张嘴说话”,主动联系用户。但这个过程,你是不是也经历过这样的心路历程:

  1. “啊?发邮件?听起来好复杂,是不是要自己搭个邮件服务器?” (内心OS:告辞!)
  2. “哦,原来可以用第三方服务。那代码怎么写?API会不会很难调?” (开始头秃)
  3. “调试的时候邮件发不出去,报错信息看得我一脸懵逼…” (逐渐暴躁)

打住!今天,我就要用最“人话”的方式,把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 方法就是这么强大,不管是本地文件还是内存中的数据,都能轻松变成邮件附件,一起寄出去。

第四章:完整示例——用户注册后,一键三连发

理论说再多,不如一个完整的“全家桶”示例来得实在。假设我们有一个用户注册功能,注册成功后,我们要做三件事:

  1. 给用户发欢迎邮件(HTML格式)。
  2. 给管理员发新用户通知邮件。
  3. 给用户发一个优惠券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发邮件这事儿,从“高山仰止”变成了“不过如此”?

我们来快速复盘一下核心步骤:

  1. 找邮局:在 settings.py 里配置SMTP参数(特别是授权码!)。
  2. 打包:用 send_mail 发简单文本,用 EmailMessageEmailMultiAlternatives 发HTML和附件。
  3. 寄出:调用 .send() 方法。

下次当你的产品经理再跟你说“这里需要加个邮件通知”时,你就可以自信地回他一句:“小事一桩,分分钟搞定!

希望这篇“保姆级”+“网购”比喻的教程,能真正帮你把Django发送邮件这个技能点稳稳点亮。代码写起来,邮件发起来吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值