Таким образом, ключ был в том, чтобы прикрепить файл ICS как файл, а не как строку (используя django.core.mail.message.EmailMessage.attach_alternative()
).
Следующий фрагмент работает для меня в почте Gmail, Hotmail и Yahoo (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/, и источник для этого не обновлялся в течение года с 1 сентября. , 2021.
Этот код работает для меня, чтобы создать файл 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)
Вы смотрели на: coderhelper.com/questions/4823574/…
У меня есть @bdbd, он устарел, ему 8 лет (пакеты изменились с тех пор, как он был написан) и переписывая его с новой упаковкой, он вылетает, когда я пытаюсь это сделать, на msg.as_string(). Он также неполный: например, он создает ical_atch, но никогда не используется. Я имею в виду ответ, получивший наибольшее количество голосов от Оберона Вашера.
Что такое вложение календаря ics? Не понимаю, почему вы не можете сделать первые 2 с собственным модулем электронной почты django.