简体   繁体   English

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

[英]How to send email with django "Rest Framwork"?

I'm using small Rest api project and it works fantastic.我正在使用小型 Rest api 项目,它的效果非常好。

But somehow i have to make send email function in there.但不知何故我必须在那里发送电子邮件功能。

so i added email config in settings.py like that所以我在 settings.py 中添加了电子邮件配置

// 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

//views.py //视图.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()

// models.py // 模型.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'

// serializers.py // 序列化器.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')

Yup.是的。 that is all of my codes.这是我所有的代码。 And i setted send_mail function in views.我在视图中设置了 send_mail 函数。

Honestly I want automatic send mail function when the consult data in my DB.老实说,我想要在我的数据库中查询数据时自动发送邮件功能。 but I can find only normal django explanation.但我只能找到正常的 Django 解释。

Can you help me set a automatic send mail function when data created??你能帮我设置一个创建数据时自动发送邮件的功能吗??

Actually, it's better practice to use Signals instead of overriding the create() method.实际上,更好的做法是使用Signals而不是覆盖create()方法。 As an example, you can use below code in your models.py file:例如,您可以在 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

What this does is that it receives a signal when an instance of your model is created and does whatever thing you want it to.它的作用是在创建模型实例时接收信号并执行您希望它执行的任何操作。 you can also change the post_save to pre_save and/or other available default signals, or even define your own signal and send it from inside the model create() function.您还可以将post_save更改为pre_save和/或其他可用的默认信号,甚至定义您自己的信号并从模型create()函数内部发送它。

Method-1 : override the create() method of ConsultViewSet方法 1 :覆盖ConsultViewSetcreate()方法

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM