74 lines
2.6 KiB
Python
74 lines
2.6 KiB
Python
|
from django.db import models
|
||
|
from django.utils.crypto import get_random_string
|
||
|
from django.core.mail import EmailMessage, get_connection
|
||
|
from django.conf import settings
|
||
|
|
||
|
import hashlib
|
||
|
|
||
|
|
||
|
def generate_message_token():
|
||
|
# /!\ birthday problem
|
||
|
return get_random_string(length=32)
|
||
|
|
||
|
|
||
|
def hexdigest_sha256(*args):
|
||
|
r = hashlib.sha256()
|
||
|
for arg in args:
|
||
|
r.update(str(arg).encode('utf-8'))
|
||
|
return r.hexdigest()
|
||
|
|
||
|
|
||
|
class MessageCorrespondent(models.Model):
|
||
|
email = models.EmailField()
|
||
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
||
|
|
||
|
|
||
|
class MessageThread(models.Model):
|
||
|
created = models.DateTimeField(auto_now_add=True)
|
||
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
||
|
|
||
|
|
||
|
class Message(models.Model):
|
||
|
created = models.DateTimeField(auto_now_add=True)
|
||
|
thread = models.ForeignKey(MessageThread)
|
||
|
author = models.EmailField(blank=True)
|
||
|
content = models.TextField(blank=True)
|
||
|
token = models.CharField(max_length=64, default=generate_message_token, unique=True)
|
||
|
|
||
|
class Meta:
|
||
|
ordering = ['created']
|
||
|
|
||
|
def send_notification(self, subject, sender, dests, reply_to=None, message_id=None, reference=None):
|
||
|
messages = []
|
||
|
for dest_name, dest_email in dests:
|
||
|
correspondent, created = MessageCorrespondent.objects.get_or_create(email=dest_email)
|
||
|
token = self.thread.token + correspondent.token + hexdigest_sha256(settings.SECRET_KEY, self.thread.token, correspondent.token)[:16]
|
||
|
sender_name, sender_email = sender
|
||
|
if reply_to:
|
||
|
reply_to_name, reply_to_email = reply_to
|
||
|
reply_to_list = ['%s <%s>' % (reply_to_name, reply_to_email.format(token=token))]
|
||
|
else:
|
||
|
reply_to_list = []
|
||
|
headers = dict()
|
||
|
if message_id:
|
||
|
headers.update({
|
||
|
'Message-ID': message_id.format(id=self.token),
|
||
|
})
|
||
|
if message_id and reference:
|
||
|
headers.update({
|
||
|
'References': message_id.format(id=reference),
|
||
|
})
|
||
|
messages.append(EmailMessage(
|
||
|
subject=subject,
|
||
|
body=self.content,
|
||
|
from_email='%s <%s>' % (sender_name, sender_email),
|
||
|
to=['%s <%s>' % (dest_name, dest_email)],
|
||
|
reply_to=reply_to_list,
|
||
|
headers=headers,
|
||
|
))
|
||
|
connection = get_connection()
|
||
|
connection.send_messages(messages)
|
||
|
|
||
|
def __str__(self):
|
||
|
return "Message from %s" % self.author
|