私のDjangoアプリケーションはかなりの量の電子メールを送信し、徹底的にテストしてみました。ただし、最初の数か月は、すべてがスムーズに機能するように、すべての送信メールをログに記録したいと思います。これを可能にし、管理パネルから送信メールを表示できるDjangoモジュールはありますか?
ありがとう。
私のDjangoアプリケーションはかなりの量の電子メールを送信し、徹底的にテストしてみました。ただし、最初の数か月は、すべてがスムーズに機能するように、すべての送信メールをログに記録したいと思います。これを可能にし、管理パネルから送信メールを表示できるDjangoモジュールはありますか?
ありがとう。
モデルにデータを記録するカスタムメールバックエンドを作成しました。
これが私のバックエンドです:
from django.core.mail.backends.smtp import *
from django.db import transaction
from modules.common.models import *
class LoggingEmailBackend(EmailBackend):
"""
A wrapper around the SMTP backend that logs all emails to the DB.
"""
def send_messages(self, email_messages):
"""
A helper method that does the actual logging
"""
with transaction.commit_on_success():
for email_message in email_messages:
email_record = Email.objects.create(
to='; '.join(email_message.recipients()),
subject=email_message.subject, body=email_message.body,
)
try:
return super(LoggingEmailBackend, self)._send(
email_message
)
except:
email_record.ok = False
return False
finally:
email_record.ok = True
return True
モデルは次のとおりです。
class Email(models.Model):
"""
Model to store all the outgoing emails.
"""
when = models.DateTimeField(
null=False, auto_now_add=True
)
to = models.EmailField(
null=False, blank=False,
)
subject = models.CharField(
null=False, max_length=128,
)
body = models.TextField(
null=False, max_length=1024,
)
ok = models.BooleanField(
null=False, default=True,
)
これが私のモデルです:
from django.contrib import admin
from modules.common.models import *
class EmailAdmin(admin.ModelAdmin):
"""
Admin part for managing the the Email model
"""
list_display = ['to', 'subject', 'ok',]
list_filter = ['ok']
readonly_fields = ['when', 'to', 'subject', 'body', 'ok']
search_fields = ['subject', 'body', 'to']
def has_delete_permission(self, request, obj=None):
return False
def has_add_permission(self, request):
return False
admin.site.register(Email, EmailAdmin)
OPはDBへの保存ではなくロギングについて質問したので、これを行うミドルウェアは次のとおりです。
import django.core.mail.backends.smtp
import logging
logger = logging.getLogger(__name__) # or you could enter a specific logger name
class LoggingBackend(django.core.mail.backends.smtp.EmailBackend):
def send_messages(self, email_messages):
try:
for msg in email_messages:
logger.info(u"Sending message '%s' to recipients: %s", msg.subject, msg.to)
except:
logger.exception("Problem logging recipients, ignoring")
return super(LoggingBackend, self).send_messages(email_messages)
次に、settings.pyで:
EMAIL_BACKEND = 'whereiputit.LoggingBackend'
このように機能するモジュールが存在するかどうかはわかりませんが、カスタムモジュールを作成するのは簡単です。別のモデルを作成し、メールを送信するたびに、新しいインスタンスを作成します(メール送信にはカスタムメソッドを使用します)。次に、このモデルをadminおよびbingoにリンクします。
DjangoはカスタムEメールバックエンドを提供しています。自分で作成できます。