Django Email
一、知识要点总览表
种别知识点根本设置SMTP设置、Email设置项发送方式同步发送、异步发送邮件范例纯文本、HTML邮件、带附件邮件异步任务Celery集成、任务队列高级特性邮件模板、批量发送二、Email根本设置
1. 设置settings.py
- # settings.py
- EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
- EMAIL_HOST = 'smtp.gmail.com' # 邮件服务器
- EMAIL_PORT = 587 # 端口号
- EMAIL_USE_TLS = True # 使用TLS加密
- EMAIL_HOST_USER = 'your-email@gmail.com' # 发件人邮箱
- EMAIL_HOST_PASSWORD = 'your-password' # 邮箱密码或应用专用密码
- DEFAULT_FROM_EMAIL = 'your-email@gmail.com' # 默认发件人
复制代码 2. 测试邮件设置
- # test_email.py
- from django.core.mail import send_mail
- from django.conf import settings
- def test_email_config():
- subject = '测试邮件'
- message = '这是一封测试邮件'
- from_email = settings.DEFAULT_FROM_EMAIL
- recipient_list = ['recipient@example.com']
-
- try:
- send_mail(
- subject,
- message,
- from_email,
- recipient_list,
- fail_silently=False,
- )
- return "邮件发送成功!"
- except Exception as e:
- return f"邮件发送失败:{str(e)}"
复制代码 三、发送各范例邮件
1. 发送HTML邮件
- # views.py
- from django.core.mail import EmailMultiAlternatives
- from django.template.loader import render_to_string
- from django.utils.html import strip_tags
- def send_html_email(request):
- subject = '欢迎订阅我们的服务'
- from_email = settings.DEFAULT_FROM_EMAIL
- to_email = 'subscriber@example.com'
- # 渲染HTML内容
- html_content = render_to_string('email_template.html', {
- 'username': 'John Doe',
- 'activation_link': 'http://example.com/activate'
- })
- text_content = strip_tags(html_content) # 生成纯文本内容
- email = EmailMultiAlternatives(
- subject,
- text_content,
- from_email,
- [to_email]
- )
- email.attach_alternative(html_content, "text/html")
- email.send()
复制代码- <!-- templates/email_template.html -->
- <!DOCTYPE html>
- <html>
- <head>
- <title>欢迎订阅</title>
- </head>
- <body>
- <h1>您好,{{ username }}!</h1>
- <p>感谢您订阅我们的服务。请点击以下链接激活您的账户:</p>
- <a href="{{ activation_link }}">激活账户</a>
- </body>
- </html>
复制代码 2. 发送带附件的邮件
- # views.py
- from django.core.mail import EmailMessage
- import os
- def send_attachment_email(request):
- subject = '月度报告'
- body = '请查收附件中的月度报告。'
- from_email = settings.DEFAULT_FROM_EMAIL
- to_email = ['manager@example.com']
-
- email = EmailMessage(
- subject,
- body,
- from_email,
- to_email
- )
-
- # 添加附件
- file_path = os.path.join(settings.MEDIA_ROOT, 'reports/monthly_report.pdf')
- with open(file_path, 'rb') as f:
- email.attach('monthly_report.pdf', f.read(), 'application/pdf')
-
- email.send()
复制代码 四、异步任务处理惩罚
1. Celery设置
- # celery.py
- from __future__ import absolute_import, unicode_literals
- import os
- from celery import Celery
- # 设置默认Django settings模块
- os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project.settings')
- app = Celery('your_project')
- app.config_from_object('django.conf:settings', namespace='CELERY')
- app.autodiscover_tasks()
复制代码 2. 创建异步邮件任务
- # tasks.py
- from celery import shared_task
- from django.core.mail import send_mail
- from django.conf import settings
- @shared_task
- def send_async_email(subject, message, recipient_list):
- """
- 异步发送邮件的任务
- """
- return send_mail(
- subject,
- message,
- settings.DEFAULT_FROM_EMAIL,
- recipient_list,
- fail_silently=False,
- )
- @shared_task
- def send_bulk_emails(email_data_list):
- """
- 批量发送邮件的任务
- """
- results = []
- for email_data in email_data_list:
- try:
- send_mail(
- email_data['subject'],
- email_data['message'],
- settings.DEFAULT_FROM_EMAIL,
- email_data['recipients'],
- fail_silently=False,
- )
- results.append({
- 'status': 'success',
- 'recipients': email_data['recipients']
- })
- except Exception as e:
- results.append({
- 'status': 'failed',
- 'recipients': email_data['recipients'],
- 'error': str(e)
- })
- return results
复制代码 3. 在视图中使用异步任务
- # views.py
- from .tasks import send_async_email, send_bulk_emails
- from django.http import JsonResponse
- def send_newsletter(request):
- # 获取订阅用户列表
- subscribers = ['user1@example.com', 'user2@example.com', 'user3@example.com']
-
- # 创建异步任务
- task = send_async_email.delay(
- '最新新闻订阅',
- '这是本周的新闻摘要...',
- subscribers
- )
-
- return JsonResponse({
- 'status': 'success',
- 'task_id': task.id,
- 'message': '邮件发送任务已创建'
- })
- def send_bulk_newsletter(request):
- # 批量邮件数据
- email_data_list = [
- {
- 'subject': '个性化新闻推送',
- 'message': '基于您的兴趣推荐...',
- 'recipients': ['user1@example.com']
- },
- {
- 'subject': '个性化新闻推送',
- 'message': '您可能感兴趣的内容...',
- 'recipients': ['user2@example.com']
- }
- ]
-
- # 创建批量发送任务
- task = send_bulk_emails.delay(email_data_list)
-
- return JsonResponse({
- 'status': 'success',
- 'task_id': task.id,
- 'message': '批量邮件发送任务已创建'
- })
复制代码 五、邮件发送流程图
六、监控 和错误处理惩罚
1. 邮件发送状态监控
- # utils.py
- from django.core.mail import get_connection
- from django.core.mail.message import EmailMessage
- from django.conf import settings
- import logging
- logger = logging.getLogger(__name__)
- class EmailSender:
- def __init__(self):
- self.connection = get_connection()
-
- def send_email_with_monitoring(self, subject, message, recipient_list):
- """
- 带监控
的邮件发送函数 - """
- try:
- email = EmailMessage(
- subject,
- message,
- settings.DEFAULT_FROM_EMAIL,
- recipient_list,
- connection=self.connection
- )
-
- # 记录发送开始
- logger.info(f"开始发送邮件到 {recipient_list}")
-
- # 发送邮件并记录结果
- result = email.send()
-
- if result:
- logger.info(f"邮件成功发送到 {recipient_list}")
- return True
- else:
- logger.error(f"邮件发送失败: {recipient_list}")
- return False
-
- except Exception as e:
- logger.error(f"邮件发送异常: {str(e)}")
- raise
复制代码 2. 重试机制
- # tasks.py
- from celery import shared_task
- from celery.exceptions import MaxRetriesExceededError
- @shared_task(bind=True, max_retries=3)
- def send_email_with_retry(self, subject, message, recipient_list):
- """
- 带重试机制的异步邮件发送任务
- """
- try:
- send_mail(
- subject,
- message,
- settings.DEFAULT_FROM_EMAIL,
- recipient_list,
- fail_silently=False,
- )
- except Exception as exc:
- try:
- # 重试任务,延迟5分钟
- self.retry(exc=exc, countdown=300)
- except MaxRetriesExceededError:
- # 超过最大重试次数,记录错误
- logger.error(f"邮件发送失败,超过最大重试次数: {recipient_list}")
- raise
复制代码 七、最佳实践发起
- 设置管理
- 将邮件干系的设置放在单独的设置文件中
- 使用情况变量管理敏感信息
- 为差异情况(开辟、测试、生产)设置差异的设置
- 性能优化
- 使用异步任务处理惩罚大量邮件发送
- 实现批量发送机制
- 公道设置重试隔断和最大重试次数
- 安全思量
- 使用TLS/SSL加密
- 定期更换邮箱暗码
- 使用应用专用暗码而不是邮箱主暗码
- 监控和日记
- 实现美满的日记记录
- 设置邮件发送失败告警
- 定期查抄发送统计数据
怎么样本日的内容还满足吗?再次感谢朋侪们的观看,关注GZH:凡人的AI工具箱,复兴666,送您代价199的AI大礼包。末了,祝您早日实现财政自由,还请给个赞,谢谢!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |