每天40分玩转Django:Django Email

[复制链接]
发表于 2025-11-18 19:15:23 | 显示全部楼层 |阅读模式
Django Email

一、知识要点总览表

种别知识点根本设置SMTP设置、Email设置项发送方式同步发送、异步发送邮件范例纯文本、HTML邮件、带附件邮件异步任务Celery集成、任务队列高级特性邮件模板、批量发送二、Email根本设置

1. 设置settings.py

  1. # settings.py
  2. EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  3. EMAIL_HOST = 'smtp.gmail.com'  # 邮件服务器
  4. EMAIL_PORT = 587  # 端口号
  5. EMAIL_USE_TLS = True  # 使用TLS加密
  6. EMAIL_HOST_USER = 'your-email@gmail.com'  # 发件人邮箱
  7. EMAIL_HOST_PASSWORD = 'your-password'  # 邮箱密码或应用专用密码
  8. DEFAULT_FROM_EMAIL = 'your-email@gmail.com'  # 默认发件人
复制代码
2. 测试邮件设置

  1. # test_email.py
  2. from django.core.mail import send_mail
  3. from django.conf import settings
  4. def test_email_config():
  5.     subject = '测试邮件'
  6.     message = '这是一封测试邮件'
  7.     from_email = settings.DEFAULT_FROM_EMAIL
  8.     recipient_list = ['recipient@example.com']
  9.    
  10.     try:
  11.         send_mail(
  12.             subject,
  13.             message,
  14.             from_email,
  15.             recipient_list,
  16.             fail_silently=False,
  17.         )
  18.         return "邮件发送成功!"
  19.     except Exception as e:
  20.         return f"邮件发送失败:{str(e)}"
复制代码
三、发送各范例邮件

1. 发送HTML邮件

  1. # views.py
  2. from django.core.mail import EmailMultiAlternatives
  3. from django.template.loader import render_to_string
  4. from django.utils.html import strip_tags
  5. def send_html_email(request):
  6.     subject = '欢迎订阅我们的服务'
  7.     from_email = settings.DEFAULT_FROM_EMAIL
  8.     to_email = 'subscriber@example.com'
  9.     # 渲染HTML内容
  10.     html_content = render_to_string('email_template.html', {
  11.         'username': 'John Doe',
  12.         'activation_link': 'http://example.com/activate'
  13.     })
  14.     text_content = strip_tags(html_content)  # 生成纯文本内容
  15.     email = EmailMultiAlternatives(
  16.         subject,
  17.         text_content,
  18.         from_email,
  19.         [to_email]
  20.     )
  21.     email.attach_alternative(html_content, "text/html")
  22.     email.send()
复制代码
  1. <!-- templates/email_template.html -->
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5.     <title>欢迎订阅</title>
  6. </head>
  7. <body>
  8.     <h1>您好,{{ username }}!</h1>
  9.     <p>感谢您订阅我们的服务。请点击以下链接激活您的账户:</p>
  10.     <a href="{{ activation_link }}">激活账户</a>
  11. </body>
  12. </html>
复制代码
2. 发送带附件的邮件

  1. # views.py
  2. from django.core.mail import EmailMessage
  3. import os
  4. def send_attachment_email(request):
  5.     subject = '月度报告'
  6.     body = '请查收附件中的月度报告。'
  7.     from_email = settings.DEFAULT_FROM_EMAIL
  8.     to_email = ['manager@example.com']
  9.    
  10.     email = EmailMessage(
  11.         subject,
  12.         body,
  13.         from_email,
  14.         to_email
  15.     )
  16.    
  17.     # 添加附件
  18.     file_path = os.path.join(settings.MEDIA_ROOT, 'reports/monthly_report.pdf')
  19.     with open(file_path, 'rb') as f:
  20.         email.attach('monthly_report.pdf', f.read(), 'application/pdf')
  21.    
  22.     email.send()
复制代码
四、异步任务处理惩罚

1. Celery设置

  1. # celery.py
  2. from __future__ import absolute_import, unicode_literals
  3. import os
  4. from celery import Celery
  5. # 设置默认Django settings模块
  6. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
  7. app = Celery('your_project')
  8. app.config_from_object('django.conf:settings', namespace='CELERY')
  9. app.autodiscover_tasks()
复制代码
2. 创建异步邮件任务

  1. # tasks.py
  2. from celery import shared_task
  3. from django.core.mail import send_mail
  4. from django.conf import settings
  5. @shared_task
  6. def send_async_email(subject, message, recipient_list):
  7.     """
  8.     异步发送邮件的任务
  9.     """
  10.     return send_mail(
  11.         subject,
  12.         message,
  13.         settings.DEFAULT_FROM_EMAIL,
  14.         recipient_list,
  15.         fail_silently=False,
  16.     )
  17. @shared_task
  18. def send_bulk_emails(email_data_list):
  19.     """
  20.     批量发送邮件的任务
  21.     """
  22.     results = []
  23.     for email_data in email_data_list:
  24.         try:
  25.             send_mail(
  26.                 email_data['subject'],
  27.                 email_data['message'],
  28.                 settings.DEFAULT_FROM_EMAIL,
  29.                 email_data['recipients'],
  30.                 fail_silently=False,
  31.             )
  32.             results.append({
  33.                 'status': 'success',
  34.                 'recipients': email_data['recipients']
  35.             })
  36.         except Exception as e:
  37.             results.append({
  38.                 'status': 'failed',
  39.                 'recipients': email_data['recipients'],
  40.                 'error': str(e)
  41.             })
  42.     return results
复制代码
3. 在视图中使用异步任务

  1. # views.py
  2. from .tasks import send_async_email, send_bulk_emails
  3. from django.http import JsonResponse
  4. def send_newsletter(request):
  5.     # 获取订阅用户列表
  6.     subscribers = ['user1@example.com', 'user2@example.com', 'user3@example.com']
  7.    
  8.     # 创建异步任务
  9.     task = send_async_email.delay(
  10.         '最新新闻订阅',
  11.         '这是本周的新闻摘要...',
  12.         subscribers
  13.     )
  14.    
  15.     return JsonResponse({
  16.         'status': 'success',
  17.         'task_id': task.id,
  18.         'message': '邮件发送任务已创建'
  19.     })
  20. def send_bulk_newsletter(request):
  21.     # 批量邮件数据
  22.     email_data_list = [
  23.         {
  24.             'subject': '个性化新闻推送',
  25.             'message': '基于您的兴趣推荐...',
  26.             'recipients': ['user1@example.com']
  27.         },
  28.         {
  29.             'subject': '个性化新闻推送',
  30.             'message': '您可能感兴趣的内容...',
  31.             'recipients': ['user2@example.com']
  32.         }
  33.     ]
  34.    
  35.     # 创建批量发送任务
  36.     task = send_bulk_emails.delay(email_data_list)
  37.    
  38.     return JsonResponse({
  39.         'status': 'success',
  40.         'task_id': task.id,
  41.         'message': '批量邮件发送任务已创建'
  42.     })
复制代码
五、邮件发送流程图


六、监控监控和错误处理惩罚

1. 邮件发送状态监控监控

  1. # utils.py
  2. from django.core.mail import get_connection
  3. from django.core.mail.message import EmailMessage
  4. from django.conf import settings
  5. import logging
  6. logger = logging.getLogger(__name__)
  7. class EmailSender:
  8.     def __init__(self):
  9.         self.connection = get_connection()
  10.    
  11.     def send_email_with_monitoring(self, subject, message, recipient_list):
  12.         """
  13.         带监控监控的邮件发送函数
  14.         """
  15.         try:
  16.             email = EmailMessage(
  17.                 subject,
  18.                 message,
  19.                 settings.DEFAULT_FROM_EMAIL,
  20.                 recipient_list,
  21.                 connection=self.connection
  22.             )
  23.             
  24.             # 记录发送开始
  25.             logger.info(f"开始发送邮件到 {recipient_list}")
  26.             
  27.             # 发送邮件并记录结果
  28.             result = email.send()
  29.             
  30.             if result:
  31.                 logger.info(f"邮件成功发送到 {recipient_list}")
  32.                 return True
  33.             else:
  34.                 logger.error(f"邮件发送失败: {recipient_list}")
  35.                 return False
  36.                
  37.         except Exception as e:
  38.             logger.error(f"邮件发送异常: {str(e)}")
  39.             raise
复制代码
2. 重试机制

  1. # tasks.py
  2. from celery import shared_task
  3. from celery.exceptions import MaxRetriesExceededError
  4. @shared_task(bind=True, max_retries=3)
  5. def send_email_with_retry(self, subject, message, recipient_list):
  6.     """
  7.     带重试机制的异步邮件发送任务
  8.     """
  9.     try:
  10.         send_mail(
  11.             subject,
  12.             message,
  13.             settings.DEFAULT_FROM_EMAIL,
  14.             recipient_list,
  15.             fail_silently=False,
  16.         )
  17.     except Exception as exc:
  18.         try:
  19.             # 重试任务,延迟5分钟
  20.             self.retry(exc=exc, countdown=300)
  21.         except MaxRetriesExceededError:
  22.             # 超过最大重试次数,记录错误
  23.             logger.error(f"邮件发送失败,超过最大重试次数: {recipient_list}")
  24.             raise
复制代码
七、最佳实践发起


  • 设置管理

    • 将邮件干系的设置放在单独的设置文件中
    • 使用情况变量管理敏感信息
    • 为差异情况(开辟、测试、生产)设置差异的设置

  • 性能优化

    • 使用异步任务处理惩罚大量邮件发送
    • 实现批量发送机制
    • 公道设置重试隔断和最大重试次数

  • 安全思量

    • 使用TLS/SSL加密
    • 定期更换邮箱暗码
    • 使用应用专用暗码而不是邮箱主暗码

  • 监控和日记

    • 实现美满的日记记录
    • 设置邮件发送失败告警
    • 定期查抄发送统计数据


怎么样本日的内容还满足吗?再次感谢朋侪们的观看,关注GZH:凡人的AI工具箱,复兴666,送您代价199的AI大礼包。末了,祝您早日实现财政自由,还请给个赞,谢谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表