基于from django.core.mail import send_mail 抽取公共的逻辑封装成基本的EmailSender,其他类型的邮件则继承该类,定义好邮件内容模板路径以及模板上下文参数即可。这里利用django的template将邮件内容抽离出来变成模板,也方便了后期页面样式调整。
from django.urls import reverse
from django.utils.crypto import get_random_string
from system.models import EmailRecord, User
from django.core.mail import send_mail
from django.template.loader import render_to_string
from myblog.email_settings import EMAIL_FROM
from myblog.settings import SITE_URL, SITE_NAME
import logging
logger = logging.getLogger(__name__)
class EmailSender(object):
template_name = ""
from_email = EMAIL_FROM
site_url = SITE_URL
site_name = SITE_NAME
def __init__(self, email_type="", username=""):
self.email_type = email_type
self.receiver = self.get_receiver(username)
self.record = EmailRecord(email_type=email_type, code=get_random_string(16), receiver=self.receiver)
self.title = self.record.get_email_type_display()
@staticmethod
def get_receiver(username=""):
try:
user = User.objects.only("username", "id", "email").get(username=username)
return user
except User.DoesNotExist:
raise ValueError("用户名不存在")
def get_template_context(self):
return https://blog.csdn.net/weixin_39800080/article/details/{"title": self.title, "receiver": self.receiver, "site_name": self.site_name,
"site_url": self.site_url}
def send(self, *args, **kwargs):
context = self.get_template_context(*args, **kwargs)
subject = f"https://blog.csdn.net/weixin_39800080/article/details/{self.site_name}https://blog.csdn.net/weixin_39800080/article/details/{self.title}邮件"
html_message = render_to_string(self.template_name, context)
try:
send_mail(from_email=self.from_email,
subject=subject,
message="",
recipient_list=[self.receiver.email],
html_message=html_message)
self.record.succeed = True
logger.info(f"[receiver: https://blog.csdn.net/weixin_39800080/article/details/{self.receiver.email}]邮件发送成功")
except Exception as e:
self.record.succeed = False
logger.info(f"[receiver: https://blog.csdn.net/weixin_39800080/article/details/{self.receiver.email}][msg:https://blog.csdn.net/weixin_39800080/article/details/{e}]邮件发送失败")
self.record.save()
注册激活模板
新建myblogtemplatesuseremail-register-active.html
https://blog.csdn.net/weixin_39800080/article/details/{{ title|default:'个人博客' }}通知邮件



