# HG changeset patch # User Paul Boddie # Date 1422318576 -3600 # Node ID 60f1a06d22905ae39a20cd6cfd595f19c84c8322 # Parent fe14d6e4d5a2ddedb74821af12f2c028dfbb7c0a Added support for different message and summary delivery preferences. Simplified the summary message structure, avoiding unnecessary nesting. diff -r fe14d6e4d5a2 -r 60f1a06d2290 imip_manager.py --- a/imip_manager.py Mon Jan 26 01:01:34 2015 +0100 +++ b/imip_manager.py Tue Jan 27 01:29:36 2015 +0100 @@ -123,7 +123,7 @@ node = to_node(self.obj) part = to_part("REPLY", [node]) - message = self.messenger.make_message([part], self.organisers, outgoing_bcc=sender) + message = self.messenger.make_outgoing_message([part], self.organisers, outgoing_bcc=sender) self.messenger.sendmail(self.organisers, message.as_string(), outgoing_bcc=sender) # Action methods. diff -r fe14d6e4d5a2 -r 60f1a06d2290 imiptools/__init__.py --- a/imiptools/__init__.py Mon Jan 26 01:01:34 2015 +0100 +++ b/imiptools/__init__.py Tue Jan 27 01:29:36 2015 +0100 @@ -20,8 +20,9 @@ """ from email import message_from_file -from imiptools.content import get_addresses, handle_itip_part +from imiptools.content import get_addresses, get_uri, handle_itip_part from imiptools.mail import Messenger +from imiptools.profile import Preferences import sys # Postfix exit codes. @@ -60,8 +61,8 @@ """ msg = message_from_file(f) - senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From")) - original_recipients = original_recipients or get_addresses(get_all_values(msg, "To")) + senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From") or []) + original_recipients = original_recipients or get_addresses(get_all_values(msg, "To") or []) # Handle messages with iTIP parts. @@ -81,7 +82,7 @@ if outgoing_only: return - # Pack any returned parts into a single message. + # Pack any returned parts into messages. if all_responses: outgoing_parts = [] @@ -96,7 +97,7 @@ # Reply using any outgoing parts in a new message. if outgoing_parts: - message = self.messenger.make_message(outgoing_parts, senders) + message = self.messenger.make_outgoing_message(outgoing_parts, senders) if "-d" in sys.argv: print >>sys.stderr, "Outgoing parts..." @@ -104,16 +105,37 @@ else: self.messenger.sendmail(senders, message.as_string()) - # Forward messages to their recipients using the existing message. + # Forward messages to their recipients either wrapping the existing + # message, accompanying it or replacing it. if forwarded_parts: - message = self.messenger.wrap_message(msg, forwarded_parts) + + # Determine whether to wrap, accompany or replace the message. + + for recipient in original_recipients: + preferences = Preferences(get_uri(recipient)) + + incoming = preferences.get("incoming") - if "-d" in sys.argv: - print >>sys.stderr, "Forwarded parts..." - print message - elif self.lmtp_socket: - self.messenger.sendmail(original_recipients, message.as_string(), lmtp_socket=self.lmtp_socket) + if incoming == "message-only": + messages = [msg] + else: + summary = self.messenger.make_summary_message(msg, forwarded_parts) + if incoming == "summary-then-message": + messages = [summary, msg] + elif incoming == "message-then-summary": + messages = [msg, summary] + elif incoming == "summary-only": + messages = [summary] + else: # incoming == "summary-wraps-message": + messages = [self.messenger.wrap_message(msg, forwarded_parts)] + + for message in messages: + if "-d" in sys.argv: + print >>sys.stderr, "Forwarded parts..." + print message + elif self.lmtp_socket: + self.messenger.sendmail(recipient, message.as_string(), lmtp_socket=self.lmtp_socket) # Unhandled messages are delivered as they are. diff -r fe14d6e4d5a2 -r 60f1a06d2290 imiptools/mail.py --- a/imiptools/mail.py Mon Jan 26 01:01:34 2015 +0100 +++ b/imiptools/mail.py Tue Jan 27 01:29:36 2015 +0100 @@ -66,7 +66,7 @@ smtp.sendmail(sender or self.sender, recipients, data) smtp.quit() - def make_message(self, parts, recipients, sender=None, outgoing_bcc=None): + def make_outgoing_message(self, parts, recipients, sender=None, outgoing_bcc=None): """ Make a message from the given 'parts' for the given 'recipients', using @@ -74,10 +74,7 @@ identity if indicated. """ - message = MIMEMultipart("mixed", _subparts=parts) - message.preamble = self.preamble_text - payload = message.get_payload() - payload.insert(0, MIMEText(self.body_text)) + message = self._make_summary_for_parts(parts) message["From"] = sender or self.sender for recipient in recipients: @@ -88,20 +85,46 @@ return message + def make_summary_message(self, msg, parts): + + """ + Return a simple summary using details from 'msg' and the given 'parts'. + """ + + message = self._make_summary_for_parts(parts) + self._copy_headers(message, msg) + return message + def wrap_message(self, msg, parts): "Wrap 'msg' and provide the given 'parts' as the primary content." + message = self._make_container_for_parts(parts) + payload = message.get_payload() + payload.append(MIMEMessage(msg)) + self._copy_headers(message, msg) + return message + + def _make_summary_for_parts(self, parts): + + "Return a simple summary for the given 'parts'." + + if len(parts) == 1: + return parts[0] + else: + return self._make_container_for_parts(parts) + + def _make_container_for_parts(self, parts): + + "Return a container for the given 'parts'." + message = MIMEMultipart("mixed", _subparts=parts) message.preamble = self.preamble_text - payload = message.get_payload() - payload.insert(0, MIMEText(self.body_text)) - payload.append(MIMEMessage(msg)) + return message + def _copy_headers(self, message, msg): message["From"] = msg["From"] message["To"] = msg["To"] message["Subject"] = msg["Subject"] - return message - # vim: tabstop=4 expandtab shiftwidth=4