From 83ee3bc4be50b8ed290a35d1fce7a262f8d1e55a Mon Sep 17 00:00:00 2001 From: Joe Date: Sat, 6 Feb 2021 21:23:49 -0500 Subject: [PATCH] adds unique constrain to the message id and a bit of a change on how to create a message --- CHANGELOG.md | 4 ++++ .../migrations/0009_auto_20210207_0221.py | 18 +++++++++++++++ django_mailbox/models.py | 17 +++++++++----- django_mailbox/transports/imap.py | 23 ------------------- 4 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 django_mailbox/migrations/0009_auto_20210207_0221.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 351756c..305c818 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), [Also based on](https://github.com/conventional-changelog/standard-version/blob/master/CHANGELOG.md) so decending. +## [0.1.2] - 2021-02-06 +### Added +- adds unique constrain to the message id and a bit of a change on how to create a message + ## [0.1.1] - 2021-02-03 ### Added - adds modified documenation diff --git a/django_mailbox/migrations/0009_auto_20210207_0221.py b/django_mailbox/migrations/0009_auto_20210207_0221.py new file mode 100644 index 0000000..5464578 --- /dev/null +++ b/django_mailbox/migrations/0009_auto_20210207_0221.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.6 on 2021-02-07 02:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_mailbox', '0008_auto_20190219_1553'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='message_id', + field=models.CharField(blank=None, max_length=255, null=None, unique=True, verbose_name='Message ID'), + ), + ] diff --git a/django_mailbox/models.py b/django_mailbox/models.py index 486bf22..be42372 100644 --- a/django_mailbox/models.py +++ b/django_mailbox/models.py @@ -352,7 +352,7 @@ class Mailbox(models.Model): return new def _process_message(self, message): - msg = Message() + msg = Message(message_id=message["message-id"][0:255].strip()) msg._email_object = message settings = utils.get_settings() @@ -361,16 +361,21 @@ class Mailbox(models.Model): msg.mailbox = self if "subject" in message: msg.subject = utils.convert_header_to_unicode(message["subject"])[0:255] - if "message-id" in message: - msg.message_id = message["message-id"][0:255].strip() + # ~ if "message-id" in message: + # ~ msg.message_id = message["message-id"][0:255].strip() if "from" in message: msg.from_header = utils.convert_header_to_unicode(message["from"]) if "to" in message: msg.to_header = utils.convert_header_to_unicode(message["to"]) elif "Delivered-To" in message: msg.to_header = utils.convert_header_to_unicode(message["Delivered-To"]) - msg.save() - message = self._get_dehydrated_message(message, msg) + try: + msg.save() + message = self._get_dehydrated_message(message, msg) + except django.db.utils.IntegrityError: + logger.warning("Already loaded") + return None + try: body = message.as_string() except KeyError as exc: @@ -467,7 +472,7 @@ class Message(models.Model): subject = models.CharField(_("Subject"), max_length=255) - message_id = models.CharField(_("Message ID"), max_length=255) + message_id = models.CharField(_("Message ID"), max_length=255,blank=None,null=None,unique=True) in_reply_to = models.ForeignKey( "django_mailbox.Message", diff --git a/django_mailbox/transports/imap.py b/django_mailbox/transports/imap.py index e3de110..730e55e 100644 --- a/django_mailbox/transports/imap.py +++ b/django_mailbox/transports/imap.py @@ -36,9 +36,6 @@ class ImapTransport(EmailTransport): self.delete_message_from_server = getattr( settings, "DJANGO_MAILBOX_DELETE_MESSAGE_FROM_SERVER", True ) - self.delete_message_store = getattr( - settings, "DJANGO_MAILBOX_DELETE_MESSAGE_ID_STORE", "/tmp/store.json" - ) self.hostname = hostname self.port = port self.archive = archive @@ -111,28 +108,8 @@ class ImapTransport(EmailTransport): # If the archive folder does not exist, create it self.server.create(self.archive) - # PoC of alternative method of storing email - if not self.delete_message_from_server: - j = {"uids": []} - if exists("store.json"): - with open("store.json", "r") as f: - j = json.load(f) - else: - with open("store.json", "w") as f: - json.dump(j, f) - # PoC of alternative method of storing email for uid in message_ids: - # PoC of alternative method of storing email - if not self.delete_message_from_server: - if uid in j["uids"]: - continue - else: - j["uids"].append(uid) - with open("store.json", "w") as f: - json.dump(j, f) - # PoC of alternative method of storing email - try: typ, msg_contents = self.server.uid("fetch", uid, "(RFC822)") if not msg_contents: