Это может быть немного поздно, но вот моя реализация в качестве вспомогательной функции в моей модели (это модель "события", которая содержит дату как собственное свойство):
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()
А затем в функции, которая отправляет электронное письмо, у меня есть:
# 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)
Это решение использует icalendar (который я предпочитаю vobject), и оно также использует attach_alternative (), чтобы прикрепить (буквально) альтернативную версию сообщения. Функция attach () используется для добавления в файл календаря, независимо от версии сообщения, которое почтовый клиент выбирает для рендеринга (обратите внимание, что я также дал ему расширение «.ics»).
Я понимаю, что вы используете python-icalendar, но метод attach () все равно должен работать примерно так же. Я просто решил показать вам альтернативную реализацию для генерации файлов iCal.