【问题标题】:Sending email notification in Django在 Django 中发送电子邮件通知
【发布时间】:2020-05-17 07:12:05
【问题描述】:

我正在构建一个简单的博客应用程序。我的博客在开发服务器上启动并运行。现在,我希望每次我/管理员创建新博客文章时向所有订阅者发送邮件。我知道使用 Django 的 send_email 库,但我不知道如何自动化该过程,即每次创建另一个“blog_post”对象时如何使用 send_email() 自动发送电子邮件?

注意:我正在使用 Django 的管理界面创建新的“blog_post”对象,所以基本上当我“保存”对象时,我想发送电子邮件。

我是 Django 新手,任何建议、指导都会有很大帮助

代码如下: 信号.py

@receiver(signals.post_save, sender=Post)
def send_post_mail(sender, instance, created, **kwargs):
    print('signal send')
    subject = "Thank you for registering with us"
    send_mail(subject, 'Body', 'sender@gmail.com', 
    ['reciever@gmail.com'], fail_silently=False,)

模型.py

class Post(models.Model):
STATUS_CHOICES = (
    ('draft', 'Draft'),
    ('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, 
                        unique = True)
author = models.ForeignKey(User,
                           related_name='blog_posts', 
 on_delete=models.CASCADE)
audio = models.URLField(max_length = 200, default = 
"spotify:episode:0Vbl7RvX3KE0lSkRmy9Wjj") 
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

apps.py

    from django.apps import AppConfig


   class BlogConfig(AppConfig):
         name = 'blog'


         def ready(self):
         import blog.signals

views.py

     def post_list(request):
        posts = Post.objects.order_by('-publish')
        return render(request, 'template.html', context = {'post':posts})

博客/urls.py

urlpatterns = [
#path('', views.Postlist, name='main-view'),
path('', views.get_name, name='main-form-view'),
path('<slug:slug>', views.detail_post, name='detail-post')

]

settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'sender@gmail.com'
EMAIL_HOST_PASSWORD = 'seder's account password'
EMAIL_USE_TLS = False

init.py

default_app_config = 'blog.apps.BlogConfig'

编辑 :如上图配置app.py和init.py后生效。

【问题讨论】:

  • 你试过信号吗?
  • @HeisAif,感谢您的快速回复。信号的问题是我正在使用 Django 的管理界面来创建和保存对象。如果我明确创建了另一个表单,那么我可以创建该表单的一个实例,并在每次调用它时使用信号发送邮件,但就像我说的那样,我在这里使用的是 Django 的管理界面
  • 博文的模型是什么?即使从管理界面创建模型,您也可以在创建模型时使用信号。
  • 好的,所以我有一个名为“blog_post”的模型,其中包含 4 个字段。然后我使用管理员界面创建 blog_posts 对象,然后使用视图创建所有 blog_posts 对象并将它们显示在我的网站上。我知道在我创建的表单中使用信号,但是当我从管理员站点创建对象时如何使用信号?

标签: django django-email


【解决方案1】:
  1. 在与您的 models.py 相同的文件夹中创建一个名为 signals.py 的文件。
  2. 将以下导入添加到 signals.py
from django.dispatch import receiver
from django.db.models import signals
from .models import Blog_post
  1. 创建一个方法并使用您的电子邮件库
@receiver(signals.post_save, sender=Blog_post)
def send_mail(sender, instance, created, **kwargs):
    # to test if the signal is working
    print('signal send')
    # replace it with your code once it works
  1. 将信号添加到与您的models.py 位于同一文件夹中的apps.py
from django.apps import AppConfig


class YourAppConfig(AppConfig):
    name = 'yourapp'

    # Add this to use signals
    def ready(self):
        from . import signals

【讨论】:

  • 您好,抱歉回复晚了。我试过这个,但似乎没有用。我既没有收到邮件,也没有收到关于对象创建的打印消息。我添加了必要的代码 sn-ps,如果我做错了什么,请告诉我。
  • 首先尝试使信号正常工作,然后您可以使其与电子邮件一起工作。
【解决方案2】:

如果您需要向所有订阅者发送电子邮件,请使用如下信号:

You can create a signal in blog post view like this:

@receiver(post_save, sender=BlogPost)
def send_mail_to_subs(sender, instance, created, **kwargs):
    if created:
        for subs in instance.author.subscribed.all():
            send_mail(
                f'New Post from {instance.author}',
                f'Title: {instance.post_title}',
                'youremail',
                [subs.email],
            )

良好的编码:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多