[CalendarServer-changes] [2776] CalendarServer/branches/users/sagen/mailgateway-implicit-2745/ twistedcaldav/mail.py

source_changes at macosforge.org source_changes at macosforge.org
Wed Aug 6 14:58:13 PDT 2008


Revision: 2776
          http://trac.macosforge.org/projects/calendarserver/changeset/2776
Author:   sagen at apple.com
Date:     2008-08-06 14:58:12 -0700 (Wed, 06 Aug 2008)
Log Message:
-----------
Added logging of inbound/outbound message-ids, plus tweaks to invite email

Modified Paths:
--------------
    CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py

Modified: CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py
===================================================================
--- CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py	2008-08-06 18:54:44 UTC (rev 2775)
+++ CalendarServer/branches/users/sagen/mailgateway-implicit-2745/twistedcaldav/mail.py	2008-08-06 21:58:12 UTC (rev 2776)
@@ -217,15 +217,8 @@
 
 
 
-def injectMessage(organizer, attendee, calendar, reactor=None):
+def injectMessage(organizer, attendee, calendar, msgId, reactor=None):
 
-    def _success(result):
-        log.info("iMIP response POSTed successfully")
-
-    def _failure(failure):
-        log.err("Failed to POST iMIP response: %s" %
-            (failure.getErrorMessage(),))
-
     if reactor is None:
         from twisted.internet import reactor
 
@@ -255,7 +248,15 @@
         reactor.connectSSL(host, port, factory, ssl.ClientContextFactory())
     else:
         reactor.connectTCP(host, port, factory)
-    factory.deferred.addCallback(_success).addErrback(_failure)
+
+    def _success(result, msgId):
+        log.info("Mail gateway successfully injected message %s" % (msgId,))
+
+    def _failure(failure, msgId):
+        log.err("Mail gateway failed to inject message %s (Reason: %s)" %
+            (msgId, failure.getErrorMessage()))
+
+    factory.deferred.addCallback(_success, msgId).addErrback(_failure, msgId)
     return factory.deferred
 
 
@@ -475,6 +476,9 @@
     @inlineCallbacks
     def inbound(self, message):
         parsedMessage = email.message_from_string(message)
+        self.log_info("Mail gateway received message %s from %s to %s" %
+            (parsedMessage['Message-ID'], parsedMessage['From'],
+             parsedMessage['To']))
 
         # TODO: make sure this is an email message we want to handle
 
@@ -514,10 +518,10 @@
         organizer = str(organizer)
         attendee = str(attendee)
         calendar.getOrganizerProperty().setValue(organizer)
-        yield injectMessage(organizer, attendee, calendar)
+        yield injectMessage(organizer, attendee, calendar,
+            parsedMessage['Message-ID'])
 
 
-    @inlineCallbacks
     def outbound(self, organizer, attendee, calendar):
         # create token, send email
         token = self.db.getToken(organizer, attendee)
@@ -532,7 +536,7 @@
         calendar.getOrganizerProperty().setValue("mailto:%s" %
             (addressWithToken,))
 
-        message = self._generateTemplateMessage(calendar)
+        msgId, message = self._generateTemplateMessage(calendar, organizer)
 
         # The email's From: will be the calendar server's address (without
         # + addressing), while the Reply-To: will be the organizer's email
@@ -549,13 +553,27 @@
             raise ValueError("ATTENDEE address '%s' must be mailto: for iMIP operation." % (attendee,))
         attendee = attendee[7:]
         message = message.replace("${toaddress}", attendee)
-        yield sendmail(settings['Server'], fromAddr, toAddr, message,
+
+        def _success(result, msgId, fromAddr, toAddr):
+            self.log_info("Mail gateway sent message %s from %s to %s" %
+                (msgId, fromAddr, toAddr))
+
+        def _failure(failure, msgId, fromAddr, toAddr):
+            self.log_error("Mail gateway failed to send message %s from %s to %s (Reason: %s)" %
+                (msgId, fromAddr, toAddr, failure.getErrorMessage()))
+
+        deferred = sendmail(settings['Server'], fromAddr, toAddr, message,
             port=settings['Port'])
 
+        deferred.addCallback(_success, msgId, fromAddr, toAddr)
+        deferred.addErrback(_failure, msgId, fromAddr, toAddr)
 
-    def _generateTemplateMessage(self, calendar):
 
+    def _generateTemplateMessage(self, calendar, organizer):
+
         caldata = str(calendar)
+        title, summary = self._generateCalendarSummary(calendar, organizer)
+
         data = cStringIO.StringIO()
         writer = MimeWriter.MimeWriter(data)
 
@@ -563,8 +581,9 @@
         writer.addheader("Reply-To", "${replytoaddress}")
         writer.addheader("To", "${toaddress}")
         writer.addheader("Date", rfc822date())
-        writer.addheader("Subject", "DO NOT REPLY: calendar invitation test")
-        writer.addheader("Message-ID", messageid())
+        writer.addheader("Subject", "Event invitation: %s" % (title,))
+        msgId = messageid()
+        writer.addheader("Message-ID", msgId)
         writer.addheader("Mime-Version", "1.0")
         writer.flushheaders()
 
@@ -573,7 +592,7 @@
         # message body
         part = writer.nextpart()
         body = part.startbody("text/plain")
-        body.write("Hi, You've been invited to a cool event by CalendarServer's new iMIP processor.  %s " % (self._generateCalendarSummary(calendar),))
+        body.write("You've been invited to the following event:  %s To accept or decline this invitation, click the link below.\n" % (summary,))
 
         part = writer.nextpart()
         encoding = "7bit"
@@ -589,20 +608,19 @@
         # finish
         writer.lastpart()
 
-        return data.getvalue()
+        return msgId, data.getvalue()
 
-    def _generateCalendarSummary(self, calendar):
+    def _generateCalendarSummary(self, calendar, organizer):
 
         # Get the most appropriate component
         component = calendar.masterComponent()
         if component is None:
             component = calendar.mainComponent(True)
 
-        organizer = component.getOrganizerProperty()
-        if "CN" in organizer.params():
-            organizer = "%s <%s>" % (organizer.params()["CN"][0], organizer.value(),)
-        else:
-            organizer = organizer.value()
+        organizerProp = component.getOrganizerProperty()
+        if "CN" in organizerProp.params():
+            organizer = "%s <%s>" % (organizerProp.params()["CN"][0],
+                organizer,)
 
         dtinfo = self._getDateTimeInfo(component)
 
@@ -614,14 +632,13 @@
         if description is None:
             description = ""
 
-        return """---- Begin Calendar Event Summary ----
+        return summary, """
 
-Organizer:   %s
-Summary:     %s
+Summary: %s
+Organizer: %s
 %sDescription: %s
 
-----  End Calendar Event Summary  ----
-""" % (organizer, summary, dtinfo, description,)
+""" % (summary, organizer, dtinfo, description,)
 
     def _getDateTimeInfo(self, component):
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080806/517504eb/attachment.html 


More information about the calendarserver-changes mailing list