在 Django 中发送电子邮件通知
Sending email notification in Django
我正在构建一个简单的博客应用程序。我在开发服务器上建立了我的博客和 运行。现在,我/管理员每次创建新博客 post 时,我都希望向所有订阅者发送邮件。我知道使用 Django 的 sending_email 库,但我不知道如何使该过程自动化,即每次我创建另一个时如何使用 send_email() 自动发送电子邮件 ' blog_post' 对象?
注意:我正在使用 Django 的管理界面创建新的“blog_post”对象,所以基本上当我 'save' 对象时,我想发送电子邮件。
我是 Django 的新手,任何建议、指导都会有很大帮助
代码如下:
signals.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,)
Models.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})
blog/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'
Edit : 如上所示配置 app.py 和 init.py 后有效。
- 在 models.py.
所在的同一文件夹中创建名称为 signals.py 的文件
- 将以下导入添加到 signals.py
from django.dispatch import receiver
from django.db.models import signals
from .models import Blog_post
- 创建方法并使用您的电子邮件库
@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
- 将信号添加到 apps.py 与您的 models.py
相同的文件夹中
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
# Add this to use signals
def ready(self):
from . import signals
如果您需要向所有订阅者发送电子邮件,请使用这样的信号:
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],
)
写得很好 :)
我正在构建一个简单的博客应用程序。我在开发服务器上建立了我的博客和 运行。现在,我/管理员每次创建新博客 post 时,我都希望向所有订阅者发送邮件。我知道使用 Django 的 sending_email 库,但我不知道如何使该过程自动化,即每次我创建另一个时如何使用 send_email() 自动发送电子邮件 ' blog_post' 对象?
注意:我正在使用 Django 的管理界面创建新的“blog_post”对象,所以基本上当我 'save' 对象时,我想发送电子邮件。
我是 Django 的新手,任何建议、指导都会有很大帮助
代码如下: signals.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,)
Models.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})
blog/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'
Edit : 如上所示配置 app.py 和 init.py 后有效。
- 在 models.py. 所在的同一文件夹中创建名称为 signals.py 的文件
- 将以下导入添加到 signals.py
from django.dispatch import receiver
from django.db.models import signals
from .models import Blog_post
- 创建方法并使用您的电子邮件库
@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
- 将信号添加到 apps.py 与您的 models.py 相同的文件夹中
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'yourapp'
# Add this to use signals
def ready(self):
from . import signals
如果您需要向所有订阅者发送电子邮件,请使用这样的信号:
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],
)
写得很好 :)