2010-11-22 8 views
8

Estoy generando archivos iCalendar con Django y python-icalendar, y se muestran correctamente en Outlook (2010) como invitaciones a reuniones. En Gmail (Google Apps), acabo de ver un correo electrónico en blanco. ¿Cual es el trato? Esto es lo que uno de mis archivos .ics parece:¿Cómo puedo obtener una invitación a una reunión para integrarme correctamente con 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 

Ah, y estoy usando EmailMultiAlternatives de Django para fijar el contenido del ICS, así:

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

Ver relacionado [publicación] (http://stackoverflow.com/questions/4397938/attaching-an-ical-file-to-a-django-email). Esa solución usa "archivo adjunto" en lugar de "alternativa" y parece que funciona en Google. –

+0

@equinoxel, pero es eso debido al uso de "archivo adjunto" en lugar de "alternativa" o el uso de 'vobject' en lugar de' icalendar'. Me gusta mucho que el colectivo Plone haya tomado el desarrollo de [icalendar] (http://pypi.python.org/pypi/icalendar). Siempre me gustó su API mejor que esa capa delgada alrededor del RFC que se forma el vobject. –

Respuesta

0

que tenía que jugar. Hace años, se creó una pequeña aplicación de ayuda llamada django-cal, que simplifica todo el proceso.

Ya no está en desarrollo activo, pero parece que todavía satisface la necesidad de algunas personas. Parches y mejoras muy bienvenidos!

1

Esto puede ser un poco tarde, pero aquí está mi aplicación como una función de ayuda en mi modelo (que es un modelo de "evento" que contiene una fecha como una propiedad de la misma):

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

Y luego en la función que envía el correo electrónico, que tengo:

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

Esta solución utiliza icalendar (que yo prefiero vObject), y también se utiliza attach_alternative() para colocar (literalmente) una versión alternativa del mensaje. La función attach() se utiliza para lanzar en el archivo de calendario, independientemente de la versión del mensaje que el cliente de correo electrónico elija para representar (tenga en cuenta que también le di una extensión ".ics").

Me doy cuenta de que está utilizando python-icalendar, pero el método attach() debería funcionar igual. Decidí mostrarle también una implementación alternativa para generar archivos iCal.

+0

Tu código funciona muy bien. Pero Outlook no reconoce este archivo ics como un calendario. ¿Qué falta? –

Cuestiones relacionadas