使用Django或Python發送帶有日歷ICS附件的Text+HTML電子郵件 [英] 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電子郵件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文