2010-11-22 13 views
8

Ich erstelle iCalendar-Dateien mit Django und python-icalendar, und sie erscheinen korrekt in Outlook (2010) als Besprechungseinladungen. In Google Mail (Google Apps) sehe ich nur eine leere E-Mail. Was ist das Problem? Hier ist, was eine meiner ics-Dateien wie folgt aussieht:Wie kann ich eine Einladung zu einer Besprechung erhalten, um sich ordnungsgemäß in Google Mail/Google Apps zu integrieren?

BEGIN:VCALENDAR 
METHOD:REQUEST 
PRODID:-//My Events App//example.com// 
VERSION:2.0 
BEGIN:VEVENT 
ATTENDEE;CN=Richard;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:[email protected] 
CREATED;VALUE=DATE:20101122T183813 
DESCRIPTION:Phone number: (212)-123-4567\n\nThis is a test description 
for the conference call. 
DTEND;VALUE=DATE:20101127T131802Z 
DTSTAMP;VALUE=DATE:20101127T121802Z 
DTSTART;VALUE=DATE:20101127T121802Z 
LAST-MODIFIED;VALUE=DATE:20101122T183813 
ORGANIZER;CN=Example.com:[email protected] 
SEQUENCE:1 
SUMMARY:Conference call about GLD 
UID:example.com.20 
END:VEVENT 
END:VCALENDAR 

Oh, und ich bin mit Django EmailMultiAlternatives den ics Inhalt zu befestigen, etwa so:

if calendar: 
    message.attach_alternative(calendar.as_string(), "text/calendar; method=REQUEST; charset=\"UTF-8\"") 
    message.content_subtype = 'calendar' 
+4

Siehe verwandten [post] (http://stackoverflow.com/questions/4397938/attaching-an-ical-file-to-a-django-email). Diese Lösung verwendet "Anhang" statt "Alternative" und sieht aus, als ob es bei Google funktioniert. –

+0

@equinoxel aber ist das wegen der Verwendung von "Anhang" anstelle von "Alternative" oder Verwendung von "Vobject" anstelle von "Icalendar". Mir gefällt, dass das Plone-Kollektiv die Entwicklung von [icalendar] (http://pypi.python.org/pypi/icalendar) aufnahm. Ich mochte immer seine API besser als diese dünne Schicht um den RFC, den Vobject bildet. –

Antwort

0

Ich hatte zu spielen, um. ics-Dateien vor langer Zeit, und kam mit einem kleinen Helfer App namens django-cal, die den gesamten Prozess vereinfacht.

Es ist nicht mehr in der aktiven Entwicklung, scheint aber immer noch das Bedürfnis einiger Leute zu befriedigen. Patches und Verbesserungen sind sehr willkommen!

1

Dies ein wenig zu spät sein kann, aber hier ist meine Implementierung als Hilfsfunktion in meinem Modell (es ist ein „Event“ -Modell, die ein Datum als Eigenschaft selbst enthält):

from icalendar import Calendar, Event as ICalEvent 
... 
class Event(models.Model): 
... 
    def generate_calendar(self): 
     cal = Calendar() 
     site = Site.objects.get_current() 

     cal.add('prodid', '-//{0} Events Calendar//{1}//'.format(site.name, 
                   site.domain)) 
     cal.add('version', '2.0') 

     ical_event = ICalEvent() 
     ical_event.add('summary', self.title) 
     ical_event.add('dtstart', self.start_date) 
     ical_event.add('dtend', self.end_date) 
     ical_event.add('dtstamp', self.end_date) 
     ical_event['uid'] = str(self.id) 

     cal.add_component(ical_event) 
     return cal.to_ical() 

Und dann in der Funktion, die die E-Mail sendet, die ich habe:

# This one has the plain text version of the message 
msg = EmailMultiAlternatives('Event Confirmation', text_email, 
          FROM_EMAIL, [self.user.email]) 
# This one has the HTML version of the message 
msg.attach_alternative(html_email, 'text/html') 
# Now to attach the calendar 
msg.attach("{0}.ics".format(self.event.slug), 
      self.event.generate_calendar(), 'text/calendar') 
msg.send(fail_silently=True) 

Diese Lösung nutzt icalendar (was ich vObject bevorzugen), und es nutzt auch attach_alternative() (wörtlich) eine alternative Version der Nachricht zu befestigen. Die attach() - Funktion wird verwendet, um die Kalenderdatei zu übertragen, unabhängig von der Version der Nachricht, die der E-Mail-Client zum Rendern auswählt (beachten Sie, dass ich ihm auch die Erweiterung ".ics" gegeben habe).

Ich erkenne, dass Sie Python-Icalendar verwenden, aber die Methode attach() sollte immer noch etwa gleich funktionieren. Ich habe mich gerade entschieden, Ihnen eine alternative Implementierung zur Erstellung von iCal-Dateien zu zeigen.

+0

Ihr Code funktioniert großartig. Aber Outlook erkennt diese ics-Datei nicht als Kalender. Was fehlt? –