使用Django或Python发送带有日历ICS附件的Text+HTML电子邮件 [英] Sending a text + HTML email with a calendar ICS attachment in Django or Python

查看:0
本文介绍了使用Django或Python发送带有日历ICS附件的Text+HTML电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在寻找一个库或至少一个功能代码片段,它允许我从Django(或至少在Python中)发送一封包含文本内容、HTML内容和ICS日历附件的电子邮件,每个主要的电子邮件客户端都能识别它。对于我的特定用例,只要向用户提供"添加到日历"按钮就足够了。

我觉得这个问题现在应该已经解决了,但我只找到了引用没有得到维护的库、或者在其他方面过时或不完整的库的答案。我已经测试了几个将附加ICS文件的代码片段,但G-mail不像通常那样为我提供将其添加到日历的选项。

是否有我缺少的现成解决方案?

推荐答案

所以关键是将ics文件附加为文件,而不是字符串(使用django.core.mail.message.EmailMessage.attach_alternative())。

以下代码片段适用于我在Gmail、Hotmail和Yahoo mail(MS Outlook有待确认)中的工作,这意味着日历事件信息与电子邮件一起显示,并且至少Gmail和Hotmail提供了将该事件添加到您的日历的选项。

from django.core.mail.message import EmailMultiAlternatives  # At the top of your .py file

email = EmailMultiAlternatives(subject, message, settings.FROM_EMAIL, ['recipient@email.here'])
# email.attach_alternative('<b>html here</b>', 'text/html') # Optional HTML message
email.attach_file(filename_event, 'text/calendar')
email.send(fail_silently=False)
我使用icshttps://pypi.org/project/ics/创建ICS文件。这一包目前仍在维护中。我能找到的唯一其他主要的Python ICS文件库是icalhttps://pypi.org/project/icalendar/,其源代码在一年内没有更新,截至2021年9月1日。

此代码适用于我创建ICS文件:

from ics import Calendar, Event  # At the top of your .py file

ICS_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"

calendar = Calendar()
event = Event()
event.name = _("Our event name")
event.begin = appointment.start_time.strftime(ICS_DATETIME_FORMAT)
event.end = appointment.end_time.strftime(ICS_DATETIME_FORMAT)
event.organizer = settings.DEFAULT_FROM_EMAIL
calendar.events.add(event)
filename_event = 'invite-%d.ics' % appointment.id
with open(filename_event, 'w') as ics_file:
    ics_file.writelines(calendar)

其中约会是我自己的Django类,其中的Start_Time和End_Time的类型为DateTimefield。

如果您为每个请求创建一个新的ICS文件,则每个请求也必须具有唯一的文件名,这样您就不会冒着两个单独的请求同时写入该文件的风险。

发送ICS文件后,我将按如下方式删除它:

import os  # At the top of your .py file

os.remove(filename_event)

这篇关于使用Django或Python发送带有日历ICS附件的Text+HTML电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆