如何使用django“Rest Framwork”发送电子邮件?

Don*_*Ryu 2 python django django-rest-framework

我正在使用小型 Rest api 项目,它的效果非常好。

但不知何故我必须在那里发送电子邮件功能。

所以我在 settings.py 中添加了电子邮件配置

// 设置.py

# SMTP Mail service with decouple
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.gmail.com"
EMAIL_HOST_USER = config('EM_ACCOUNT')
EMAIL_HOST_PASSWORD = config('EM_PASSWORD')
EMAIL_PORT = 587
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
Run Code Online (Sandbox Code Playgroud)

//视图.py

from rest_framework import viewsets
from consult.models import Consult
from consult.serializers import ConsultSerializer
from django.core.mail import EmailMessage


class ConsultViewSet(viewsets.ModelViewSet):
    queryset = Consult.objects.all()
    serializer_class = ConsultSerializer


def send_email(request):
    email = EmailMessage(
        'Title',
        (ConsultSerializer.name, ConsultSerializer.email, ConsultSerializer.phone),
        'my-email',
        ['my-receive-email']
    )
    email.attach_file(ConsultSerializer.file)
    email.send()
Run Code Online (Sandbox Code Playgroud)

// 模型.py

from django.db import models


# Create your models here.
class Consult(models.Model):
    name = models.CharField(max_length=16)
    position = models.CharField(max_length=16, null=True)
    group = models.CharField(max_length=50)
    email = models.CharField(max_length=50, null=True)
    phone = models.CharField(max_length=14)
    describe = models.TextField(blank=True, null=True)
    file = models.FileField(blank=True, null=True)
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'Consult'
Run Code Online (Sandbox Code Playgroud)

// 序列化器.py

from rest_framework import serializers
from .models import Consult


class ConsultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Consult
        fields = ('id', 'name', 'position', 'group', 'email', 'phone', 'describe', 'file', 'create_date')
Run Code Online (Sandbox Code Playgroud)

是的。这是我所有的代码。我在视图中设置了 send_mail 函数。

老实说,我想要在我的数据库中查询数据时自动发送邮件功能。但我只能找到正常的 Django 解释。

你能帮我设置一个创建数据时自动发送邮件的功能吗??

Ali*_*ani 7

实际上,更好的做法是使用Signals而不是覆盖该create()方法。例如,您可以在 models.py 文件中使用以下代码:

@receiver(post_save, sender=settings.CONSULT_MODEL)
def send_mail_on_create(sender, instance=None, created=False, **kwargs):
    if created:
        send_email() # call send mail function
Run Code Online (Sandbox Code Playgroud)

它的作用是在创建模型实例时接收信号并执行您希望它执行的任何操作。您还可以更改post_savetopre_save和/或其他可用的默认信号,甚至定义您自己的信号并从模型create()函数内部发送它。


JPG*_*JPG 6

方法一:覆盖ConsultViewSet的create()方法

def send_email():
    email = EmailMessage(
        'Title',
        (ConsultSerializer.name, ConsultSerializer.email, ConsultSerializer.phone),
        'my-email',
        ['my-receive-email']
    )
    email.attach_file(ConsultSerializer.file)
    email.send()


class ConsultViewSet(viewsets.ModelViewSet):
    queryset = Consult.objects.all()
    serializer_class = ConsultSerializer

    def create(self, request, *args, **kwargs):
        response = super(ConsultViewSet, self).create(request, *args, **kwargs)
        send_email()  # sending mail
        return response
Run Code Online (Sandbox Code Playgroud)