我使用Django和python-icalendar生成iCalendar文件,它们在Outlook(2010)中正确显示为会议邀请。在Gmail(Google Apps)中,我只看到一封空白的电子邮件。这是怎么回事?这是我的.ics文件之一:
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID:-//My Events App//example.com//
VERSION:2.0
BEGIN:VEVENT
ATTENDEE;CN=Richard;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:rich@example.com
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:events@example.com
SEQUENCE:1
SUMMARY:Conference call about GLD
UID:example.com.20
END:VEVENT
END:VCALENDAR
哦,我正在使用Django的EmailMultiAlternatives来附加ics内容,如下所示:
if calendar:
message.attach_alternative(calendar.as_string(), "text/calendar; method=REQUEST; charset=\"UTF-8\"")
message.content_subtype = 'calendar'
答案 0 :(得分:2)
这可能有点晚了,但这是我在我的模型中作为辅助函数的实现(它是一个包含日期作为其自身属性的“事件”模型):
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文件的替代实现。
答案 1 :(得分:0)
我不得不在很久以前玩过.ics文件,并提出了一个名为django-cal的小助手应用程序,它简化了整个过程。
它不再处于积极发展状态,但似乎仍能满足少数人的需求。非常欢迎补丁和改进!