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电
基础教程推荐
- 用于分类数据的跳跃记号标签 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- 筛选NumPy数组 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01