import random from django.db import models from django_softdelete.models import SoftDeleteModel from core.settings import MAIL_DOMAIN, ACTIVE_SPAM_TRAINING from files.models import AbstractFile from inventory.models import Event from tickets.models import IssueThread class Email(SoftDeleteModel): id = models.AutoField(primary_key=True) timestamp = models.DateTimeField(auto_now_add=True) body = models.TextField() subject = models.CharField(max_length=255) sender = models.CharField(max_length=255) recipient = models.CharField(max_length=255) reference = models.CharField(max_length=255, null=True, unique=True) in_reply_to = models.CharField(max_length=255, null=True) raw_file = models.FileField(upload_to='raw_mail/') issue_thread = models.ForeignKey(IssueThread, models.SET_NULL, null=True, related_name='emails') event = models.ForeignKey(Event, models.SET_NULL, null=True) def save(self, *args, **kwargs): super().save(*args, **kwargs) if not self.reference: self.reference = f'<{random.randint(0, 1000000000):09}@{MAIL_DOMAIN}>' self.save() def train_spam(self): if ACTIVE_SPAM_TRAINING and self.raw_file.path: import subprocess path = self.raw_file.path subprocess.run(["rspamc", "learn_spam", path]) def train_ham(self): if ACTIVE_SPAM_TRAINING and self.raw_file.path: import subprocess path = self.raw_file.path subprocess.run(["rspamc", "learn_ham", path]) class EventAddress(models.Model): id = models.AutoField(primary_key=True) event = models.ForeignKey(Event, models.SET_NULL, null=True, related_name='addresses') address = models.CharField(max_length=255) class EmailAttachment(AbstractFile): email = models.ForeignKey(Email, models.CASCADE, related_name='attachments', null=True) name = models.CharField(max_length=255)