2010-11-22 38 views
8

Je génère des fichiers iCalendar avec Django et python-icalendar, et ils apparaissent correctement dans Outlook (2010) en tant qu'invitations de réunion. Dans Gmail (Google Apps), je vois juste un email vide. Quel est le problème? Voici ce que l'un de mes fichiers .ics ressemble:Comment puis-je obtenir une invitation à une réunion pour intégrer correctement Gmail/Google Apps?

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, et j'utilise les EmailMultiAlternatives de Django pour fixer le contenu ics, comme ceci:

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

Voir aussi [post] (http://stackoverflow.com/questions/4397938/attaching-an-ical-file-to-a-django-email). Cette solution utilise "attachement" au lieu de "alternative" et semble fonctionner sur google. –

+0

@equinoxel mais est-ce dû à l'utilisation de "attachment" au lieu de "alternative" ou en utilisant 'vobject' au lieu de' icalendar'. J'aime vraiment le fait que le collectif Plone a pris en charge le développement de [icalendar] (http://pypi.python.org/pypi/icalendar). J'ai toujours aimé son API mieux que cette couche mince autour de la RFC que vobject forme. –

Répondre

0

je devais jouer avec. ics fichiers il ya des années, et est venu avec une petite application d'assistance nommée django-cal, ce qui simplifie l'ensemble du processus.

Il n'est plus en développement actif, mais semble encore satisfaire le besoin de quelques personnes. Correctifs et améliorations très bienvenus!

1

Cela peut être un peu en retard, mais voici ma mise en œuvre d'une fonction d'aide dans mon modèle (il est un modèle « événement » qui contient une date comme une propriété de lui-même):

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() 

Et puis dans la fonction qui envoie l'e-mail, j'ai:

# 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) 

cette solution utilise iCalendar (que je préfère vobject), et utilise également attach_alternative() pour attach (littéralement) une autre version du message. La fonction attach() est utilisée pour lancer dans le fichier de calendrier, indépendamment de la version du message que le client de messagerie choisit de rendre (notez que je lui ai également donné une extension ".ics").

Je me rends compte que vous utilisez python-icalendar, mais la méthode attach() devrait toujours fonctionner à peu près la même chose. J'ai juste décidé de vous montrer aussi une implémentation alternative pour générer des fichiers iCal.

+0

Votre code fonctionne très bien. Mais outlook ne reconnaît pas ce fichier ics comme un calendrier. Qu'est-ce qui manque? –