1 #!/usr/bin/env python 2 3 from imiptools.config import MESSAGE_SENDER, OUTGOING_PREFIX 4 from email.mime.message import MIMEMessage 5 from email.mime.multipart import MIMEMultipart 6 from email.mime.text import MIMEText 7 from smtplib import LMTP, SMTP 8 9 MESSAGE_SUBJECT = "Calendar system message" 10 11 MESSAGE_TEXT = """\ 12 This is a response to a calendar message sent by your calendar program. 13 """ 14 15 PREAMBLE_TEXT = """\ 16 This message contains several different parts, one of which will contain 17 calendar information that will only be understood by a suitable program. 18 """ 19 20 class Messenger: 21 22 "Sending of outgoing messages." 23 24 def __init__(self, sender=None, subject=None, body_text=None, preamble_text=None): 25 self.sender = sender or MESSAGE_SENDER 26 self.subject = subject or MESSAGE_SUBJECT 27 self.body_text = body_text or MESSAGE_TEXT 28 self.preamble_text = preamble_text or PREAMBLE_TEXT 29 30 def sendmail(self, recipients, data, sender=None, outgoing_bcc=None, lmtp_socket=None): 31 32 """ 33 Send a mail to the given 'recipients' consisting of the given 'data', 34 using the given 'sender' identity if indicated, indicating an 35 'outgoing_bcc' identity if indicated, delivering to a local mail system 36 using LMTP if 'lmtp_socket' is provided. 37 """ 38 39 if lmtp_socket: 40 smtp = LMTP(lmtp_socket) 41 else: 42 smtp = SMTP("localhost") 43 44 if outgoing_bcc: 45 recipients = list(recipients) + ["%s+%s" % (OUTGOING_PREFIX, outgoing_bcc)] 46 47 smtp.sendmail(sender or self.sender, recipients, data) 48 smtp.quit() 49 50 def make_message(self, parts, recipients, sender=None, outgoing_bcc=None): 51 52 """ 53 Make a message from the given 'parts' for the given 'recipients', using 54 the given 'sender' identity if indicated, indicating an 'outgoing_bcc' 55 identity if indicated. 56 """ 57 58 message = MIMEMultipart("mixed", _subparts=parts) 59 message.preamble = self.preamble_text 60 payload = message.get_payload() 61 payload.insert(0, MIMEText(self.body_text)) 62 63 message["From"] = sender or self.sender 64 for recipient in recipients: 65 message["To"] = recipient 66 if outgoing_bcc: 67 message["Bcc"] = "%s+%s" % (OUTGOING_PREFIX, outgoing_bcc) 68 message["Subject"] = self.subject 69 70 return message 71 72 def wrap_message(self, msg, parts): 73 74 "Wrap 'msg' and provide the given 'parts' as the primary content." 75 76 message = MIMEMultipart("mixed", _subparts=parts) 77 message.preamble = self.preamble_text 78 payload = message.get_payload() 79 payload.insert(0, MIMEText(self.body_text)) 80 payload.append(MIMEMessage(msg)) 81 82 message["From"] = msg["From"] 83 message["To"] = msg["To"] 84 message["Subject"] = msg["Subject"] 85 86 return message 87 88 # vim: tabstop=4 expandtab shiftwidth=4