1.1 --- a/imip_manager.py Mon Jan 26 01:01:34 2015 +0100
1.2 +++ b/imip_manager.py Tue Jan 27 01:29:36 2015 +0100
1.3 @@ -123,7 +123,7 @@
1.4
1.5 node = to_node(self.obj)
1.6 part = to_part("REPLY", [node])
1.7 - message = self.messenger.make_message([part], self.organisers, outgoing_bcc=sender)
1.8 + message = self.messenger.make_outgoing_message([part], self.organisers, outgoing_bcc=sender)
1.9 self.messenger.sendmail(self.organisers, message.as_string(), outgoing_bcc=sender)
1.10
1.11 # Action methods.
2.1 --- a/imiptools/__init__.py Mon Jan 26 01:01:34 2015 +0100
2.2 +++ b/imiptools/__init__.py Tue Jan 27 01:29:36 2015 +0100
2.3 @@ -20,8 +20,9 @@
2.4 """
2.5
2.6 from email import message_from_file
2.7 -from imiptools.content import get_addresses, handle_itip_part
2.8 +from imiptools.content import get_addresses, get_uri, handle_itip_part
2.9 from imiptools.mail import Messenger
2.10 +from imiptools.profile import Preferences
2.11 import sys
2.12
2.13 # Postfix exit codes.
2.14 @@ -60,8 +61,8 @@
2.15 """
2.16
2.17 msg = message_from_file(f)
2.18 - senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From"))
2.19 - original_recipients = original_recipients or get_addresses(get_all_values(msg, "To"))
2.20 + senders = get_addresses(msg.get_all("Reply-To") or msg.get_all("From") or [])
2.21 + original_recipients = original_recipients or get_addresses(get_all_values(msg, "To") or [])
2.22
2.23 # Handle messages with iTIP parts.
2.24
2.25 @@ -81,7 +82,7 @@
2.26 if outgoing_only:
2.27 return
2.28
2.29 - # Pack any returned parts into a single message.
2.30 + # Pack any returned parts into messages.
2.31
2.32 if all_responses:
2.33 outgoing_parts = []
2.34 @@ -96,7 +97,7 @@
2.35 # Reply using any outgoing parts in a new message.
2.36
2.37 if outgoing_parts:
2.38 - message = self.messenger.make_message(outgoing_parts, senders)
2.39 + message = self.messenger.make_outgoing_message(outgoing_parts, senders)
2.40
2.41 if "-d" in sys.argv:
2.42 print >>sys.stderr, "Outgoing parts..."
2.43 @@ -104,16 +105,37 @@
2.44 else:
2.45 self.messenger.sendmail(senders, message.as_string())
2.46
2.47 - # Forward messages to their recipients using the existing message.
2.48 + # Forward messages to their recipients either wrapping the existing
2.49 + # message, accompanying it or replacing it.
2.50
2.51 if forwarded_parts:
2.52 - message = self.messenger.wrap_message(msg, forwarded_parts)
2.53 +
2.54 + # Determine whether to wrap, accompany or replace the message.
2.55 +
2.56 + for recipient in original_recipients:
2.57 + preferences = Preferences(get_uri(recipient))
2.58 +
2.59 + incoming = preferences.get("incoming")
2.60
2.61 - if "-d" in sys.argv:
2.62 - print >>sys.stderr, "Forwarded parts..."
2.63 - print message
2.64 - elif self.lmtp_socket:
2.65 - self.messenger.sendmail(original_recipients, message.as_string(), lmtp_socket=self.lmtp_socket)
2.66 + if incoming == "message-only":
2.67 + messages = [msg]
2.68 + else:
2.69 + summary = self.messenger.make_summary_message(msg, forwarded_parts)
2.70 + if incoming == "summary-then-message":
2.71 + messages = [summary, msg]
2.72 + elif incoming == "message-then-summary":
2.73 + messages = [msg, summary]
2.74 + elif incoming == "summary-only":
2.75 + messages = [summary]
2.76 + else: # incoming == "summary-wraps-message":
2.77 + messages = [self.messenger.wrap_message(msg, forwarded_parts)]
2.78 +
2.79 + for message in messages:
2.80 + if "-d" in sys.argv:
2.81 + print >>sys.stderr, "Forwarded parts..."
2.82 + print message
2.83 + elif self.lmtp_socket:
2.84 + self.messenger.sendmail(recipient, message.as_string(), lmtp_socket=self.lmtp_socket)
2.85
2.86 # Unhandled messages are delivered as they are.
2.87
3.1 --- a/imiptools/mail.py Mon Jan 26 01:01:34 2015 +0100
3.2 +++ b/imiptools/mail.py Tue Jan 27 01:29:36 2015 +0100
3.3 @@ -66,7 +66,7 @@
3.4 smtp.sendmail(sender or self.sender, recipients, data)
3.5 smtp.quit()
3.6
3.7 - def make_message(self, parts, recipients, sender=None, outgoing_bcc=None):
3.8 + def make_outgoing_message(self, parts, recipients, sender=None, outgoing_bcc=None):
3.9
3.10 """
3.11 Make a message from the given 'parts' for the given 'recipients', using
3.12 @@ -74,10 +74,7 @@
3.13 identity if indicated.
3.14 """
3.15
3.16 - message = MIMEMultipart("mixed", _subparts=parts)
3.17 - message.preamble = self.preamble_text
3.18 - payload = message.get_payload()
3.19 - payload.insert(0, MIMEText(self.body_text))
3.20 + message = self._make_summary_for_parts(parts)
3.21
3.22 message["From"] = sender or self.sender
3.23 for recipient in recipients:
3.24 @@ -88,20 +85,46 @@
3.25
3.26 return message
3.27
3.28 + def make_summary_message(self, msg, parts):
3.29 +
3.30 + """
3.31 + Return a simple summary using details from 'msg' and the given 'parts'.
3.32 + """
3.33 +
3.34 + message = self._make_summary_for_parts(parts)
3.35 + self._copy_headers(message, msg)
3.36 + return message
3.37 +
3.38 def wrap_message(self, msg, parts):
3.39
3.40 "Wrap 'msg' and provide the given 'parts' as the primary content."
3.41
3.42 + message = self._make_container_for_parts(parts)
3.43 + payload = message.get_payload()
3.44 + payload.append(MIMEMessage(msg))
3.45 + self._copy_headers(message, msg)
3.46 + return message
3.47 +
3.48 + def _make_summary_for_parts(self, parts):
3.49 +
3.50 + "Return a simple summary for the given 'parts'."
3.51 +
3.52 + if len(parts) == 1:
3.53 + return parts[0]
3.54 + else:
3.55 + return self._make_container_for_parts(parts)
3.56 +
3.57 + def _make_container_for_parts(self, parts):
3.58 +
3.59 + "Return a container for the given 'parts'."
3.60 +
3.61 message = MIMEMultipart("mixed", _subparts=parts)
3.62 message.preamble = self.preamble_text
3.63 - payload = message.get_payload()
3.64 - payload.insert(0, MIMEText(self.body_text))
3.65 - payload.append(MIMEMessage(msg))
3.66 + return message
3.67
3.68 + def _copy_headers(self, message, msg):
3.69 message["From"] = msg["From"]
3.70 message["To"] = msg["To"]
3.71 message["Subject"] = msg["Subject"]
3.72
3.73 - return message
3.74 -
3.75 # vim: tabstop=4 expandtab shiftwidth=4