python - 在 Django 或 Python 中发送带有日历 ICS 附件的文本 + HTML 电子邮件

标签 python django email icalendar

我一直在寻找一个库或至少是功能性的代码片段,让我从 Django(或至少在 Python 中)发送电子邮件,其中包含文本内容、HTML 内容和每个专业都能识别的 ICS 日历附件电子邮件客户端。对于我的特定用例,如果向用户提供“添加到日历”按钮就足够了。
我觉得现在这应该是一个已解决的问题,但我只找到引用未维护或以其他方式过时或不完整的库的答案。我已经测试了几个将附加 ICS 文件的片段,但是 G-mail 并没有像往常那样让我选择将其添加到日历中。
是否有我缺少的现成解决方案?

最佳答案

首先创建一个 .ics 文件,这当然也可以通过 python 脚本来生成动态 .ics 文件。
.ics 文件
更多信息iCalendar :基本信息和通用模板(见下面的例子)。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
GEO:48.85299;2.36885
END:VEVENT
END:VCALENDAR
您也可以generate你自己的 iCalendar,如果你觉得这更容易(见下面生成的例子)。
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ical.marudot.com//iCal Event Maker
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Europe/Berlin
LAST-MODIFIED:20201011T015911Z
TZURL:http://tzurl.org/zoneinfo-outlook/Europe/Berlin
X-LIC-LOCATION:Europe/Berlin
BEGIN:DAYLIGHT
TZNAME:CEST
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZNAME:CET
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20210716T221958Z
UID:20210716T221958Z-901688629@marudot.com
DTSTART;TZID=Europe/Berlin:20210717T120000
DTEND;TZID=Europe/Berlin:20210717T160000
SUMMARY:Stack Overflow
DESCRIPTION:iCalendar example for Stack Overflow user Ciske\n
LOCATION:Amsterdam
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Stack Overflow
TRIGGER:-PT1H
END:VALARM
END:VEVENT
END:VCALENDAR
Django settings.py
EMAIL_HOST = SMTP server.
EMAIL_HOST_USER = Login credentials for the SMTP server.
EMAIL_HOST_PASSWORD = Password credential for the SMTP server.
EMAIL_PORT = SMTP server port.
EMAIL_USE_TLS or _SSL = True if secure connection.
Django View .py
发送带有 .ics 文件作为附件的电子邮件。
from django.core.mail import EmailMessage

# Send email with attachment
email = EmailMessage(
    'Subject',
    'Email body',
    'from@example.com',
    ['to@example.com']
)
email.attach_file('assets/invite.ics', 'text/calendar')
email.send()
您甚至可以将 .html 文件添加到您的电子邮件中。
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string

html_content = render_to_string('assets/email.html', context)

email = EmailMultiAlternatives('Subject', 'Email body', 'from@example.com', [to@example.com])
email.attach_alternative(html_content, 'text/html')
email.attach_file('assets/invite.ics', 'text/calendar')
email.send()

关于python - 在 Django 或 Python 中发送带有日历 ICS 附件的文本 + HTML 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68216055/

相关文章:

file - 如何使用 cakephp 2.x 上传文件并将其附加到电子邮件?

php - 将电子邮件副本发送给发件人 PHP 联系脚本

python - 将 CSV 值转换为 numpy 数组,其中字段作为数组索引

python - 从 tensorflow 中的向量构造成对矩阵

python - 需要FilteredSelectMultiple小部件的指导

django - 在 Django 管理中,我怎样才能知道 bool 值第一次被设置为 true

python - 是否有一种 SQL 语法可以通过根据同一个表中第三列的相等值在两列中进行搜索来创建新列?

python - QUdpSocket pyqt qt

Django vs Pylons vs Web2py : registration,邀请,事件

javascript - 带有联系人下拉菜单的联系表格