当我们创建一个网站时,经常会有发送邮件的需要。无论是用户注册,还是用户忘记密码,又或者是用户下单后进行付款确认,都需要发
送不同的邮件。所以发送邮件的需求实际上是非常重要的,而且如果如果不在一开始就建造结构清晰的邮件服务,到后面可能会是一团糟。
基本的邮件发送
假设我们希望在用户注册到我们的网站。我们可以参照Django文档,向验证通过并创建成功的用户发送邮件。具体实现如下:
import logging
from rest_framework.views import APIView
from django.http import JsonResponse
from django.core.mail import send_mail
from users.models import User
logger = logging.getLogger('django')
class RegisterView(APIView):
def post(self, request):
# Run validations
if not request.data:
return JsonResponse({'errors': 'User data must be provided'}, status=400)
if User.objects.filter(email=request.data['email']).exists():
return JsonResponse({'errors': 'Email already in use'}, status=400)
try:
# Create new user
user = User.objects.create_user(email=request.data['email'].lower())
user.set_password(request.data['password'])
user.save()
# Send welcome email
send_mail(
subject='Welcome!',
message='Hey there! Welcome to our platform.',
html_message='Het there! Welcome to our platform.
'
from_email='from@example.com',
recipient_list=[user.email],
fail_silently=False,
)
return JsonResponse({'status': 'ok'})
except Exception as e:
logger.error('Error at %s', 'register view', exc_info=e)
return JsonResponse({'errors': 'Wrong data provided'}, status=400)当然肯定文档中所说的那样,你也必须提前设定好一些重要的配置项,例如EMAIL_HOST和EMAIL_PORT。
很好!现在我们已经发送了欢迎邮件!
创建一个mailer类
正如我之前所说,在我们的应用中不同的模块可能都需要发送邮件,所以**好有一个电子邮件服务或者mailer类来处理所有的邮件请求。更简单,因为我们不再需要每次都去翻遍全部代码。
iimport logging
from django.conf import settings
from django.core.mail import send_mail
from users.models import User
logger = logging.getLogger('django')
class BaseMailer():
def __init__(self, to_email, subject, message, html_message):
self.to_email = to_email
self.subject = subject
self.message = message
self.html_message = html_message
def send_email(self):
send_mail(
subject=self.subject,
message=self.message,
html_message=self.html_message,
from_email='from@example.com',
recipient_list=[self.to_email],
fail_silently=False,
)让我们来看看经过这次改变后,注册服务的视图层是某种子:
import logging
from rest_framework.views import APIView
from django.http import JsonResponse
from django.core.mail import send_mail
from users.models import User
from users.mailers import BasicMailer
logger = logging.getLogger('django')
class RegisterView(APIView):
def post(self, request):
# Run validations
if not request.data:
return JsonResponse({'errors': 'User data must be provided'}, status=400)
if User.objects.filter(email=request.data['email']).exists():
return JsonResponse({'errors': 'Email already in use'}, status=400)
try:
# Create new user
user = User.objects.create_user(email=request.data['email'].lower())
user.set_password(request.data['password'])
user.save()
# Send welcome email
BasicMailer(to_email=user.email,
subject='Welcome!',
message='Hey there! Welcome to our platform.',
html_message='Het there! Welcome to our platform.
').send_email()
return JsonResponse({'status': 'ok'})
except Exception as e:
logger.error('Error at %s', 'register view', exc_info=e)
return JsonResponse({'errors': 'Wrong data provided'}, status=400)
作者:cyril_lee
链接:https://juejin.im/post/5eb6171c5188256d7a3cac97


