Sending a text + HTML email with a calendar ICS attachment in Django or Python(使用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)
我使用ics
https://pypi.org/project/ics/创建ICS文件。这一包目前仍在维护中。我能找到的唯一其他主要的Python ICS文件库是ical
https://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电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用Django或Python发送带有日历ICS附件的Text+HTML电子邮件
- ";find_element_by_name(';name';)";和&QOOT;FIND_ELEMENT(BY NAME,';NAME';)";之间有什么区别? 2022-01-01
- 我如何卸载 PyTorch? 2022-01-01
- 如何使用PYSPARK从Spark获得批次行 2022-01-01
- CTR 中的 AES 如何用于 Python 和 PyCrypto? 2022-01-01
- 检查具有纬度和经度的地理点是否在 shapefile 中 2022-01-01
- 使用公司代理使Python3.x Slack(松弛客户端) 2022-01-01
- 计算测试数量的Python单元测试 2022-01-01
- 我如何透明地重定向一个Python导入? 2022-01-01
- YouTube API v3 返回截断的观看记录 2022-01-01
- 使用 Cython 将 Python 链接到共享库 2022-01-01