From: Michael Tremer Date: Tue, 26 Nov 2024 17:07:27 +0000 (+0000) Subject: messages: Implement sending messages later X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1901e54ac5a6be2982bf6a33a3b4aaa1ae848436;p=ipfire.org.git messages: Implement sending messages later Signed-off-by: Michael Tremer --- diff --git a/src/backend/messages.py b/src/backend/messages.py index 53f62baa..022c1281 100644 --- a/src/backend/messages.py +++ b/src/backend/messages.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import base64 +import datetime import email import email.mime.multipart import email.mime.text @@ -59,17 +60,19 @@ class Messages(misc.Object): def bounce_email_address(self): return self.settings.get("bounce_email_address") - def _send(self, message, sender=None, priority=0): - res = self.db.get("INSERT INTO messages(message, priority) \ - VALUES(%s, %s) RETURNING id", message, priority) - - logging.debug("Message queued with ID %s" % res.id) - - def send(self, message, priority=0, headers={}): + def send(self, message, priority=0, headers={}, after=None): # Convert message from string if not isinstance(message, email.message.Message): message = email.message_from_string(message) + # Send messages immediately by default + if after is None: + after = datetime.datetime.now() + + # If after is relative, we make it absolute + elif isinstance(after, datetime.timedelta): + after = datetime.datetime.now() + after + # Add a message ID if non exsist if not "Message-Id" in message and not "Message-ID" in message: message.add_header("Message-Id", self.make_msgid()) @@ -81,19 +84,32 @@ class Messages(misc.Object): except KeyError: message.add_header(k, v) - # Add date if the message doesn't have one already - if "Date" not in message: - message.add_header("Date", email.utils.formatdate()) - # Send any errors to the bounce address if self.bounce_email_address: message.add_header("Errors-To", "<%s>" % self.bounce_email_address) - # Send the message - self._send(message.as_string(), priority=priority) + # Add the message to the queue + res = self.db.get(""" + INSERT INTO + messages + ( + message, + priority, + send_after + ) + VALUES + ( + %s, %s, %s + ) + RETURNING + id + """, message.as_string(), priority, after, + ) + + logging.debug("Message queued with ID %s" % res.id) def send_template(self, template_name, - sender=None, priority=0, headers={}, **kwargs): + sender=None, priority=0, headers={}, after=None, **kwargs): """ Send a message based on the given template """ @@ -163,7 +179,7 @@ class Messages(misc.Object): message.attach(message_part) # Send the message - self.send(message, priority=priority, headers=headers) + self.send(message, priority=priority, headers=headers, after=after) # In debug mode, re-compile the templates with every request if self.backend.debug: @@ -236,9 +252,19 @@ class Messages(misc.Object): class Queue(misc.Object): @property def messages(self): - return self.db.query("SELECT * FROM messages \ - WHERE time_sent IS NULL \ - ORDER BY priority DESC, time_created ASC") + return self.db.query(""" + SELECT + * + FROM + messages + WHERE + time_sent IS NULL + AND + send_after >= CURRENT_TIMESTAMP + ORDER BY + priority DESC, + time_created ASC + """) @lazy_property def relay(self):