Путаница с отправкой электронной почты в Django

Приложение Django должно отправлять письма в формате HTML. В соответствии с официальной документацией :

Может быть полезно включить несколько версий содержимого в   Эл. адрес; классический пример - отправить как текстовые, так и HTML-версии   сообщение. С почтовой библиотекой Django вы можете сделать это, используя   Класс EmailMultiAlternatives. Этот подкласс EmailMessage имеет   attach_alternative() для включения дополнительных версий   тела сообщения в письме. Все остальные методы (включая класс   инициализация) наследуются непосредственно из EmailMessage.

... Я придумал следующий код:

from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives()
msg.sender = "[email protected]"
msg.subject = subject
msg.to = [target,]
msg.attach_alternative(content, "text/html")
msg.send()

Эта работа, как и ожидалось. Однако в некоторых ситуациях мне нужно включить вложения PDF, для которых я добавил следующий код непосредственно перед msg.send() :

if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')

Хотя это работает - все документы PDF правильно прикреплены к электронной почте - нежелательный побочный эффект заключается в том, что содержимое HTML-сообщения в электронной почте исчезло, и у меня остался пустой почтовый ящик с прикрепленными к нему документами PDF.

Что я здесь делаю неправильно?

4
nl ja de
попробуйте настроить тип приложения на текст вместо приложения, и дайте мне знать, как это изменит что-либо.
добавлено автор securecurve, источник
@securecurve: Единственное изменение заключается в том, что вложения больше не являются документами PDF, а текстовыми документами. Тело электронной почты по-прежнему пуст.
добавлено автор Roger, источник

2 ответы

Я понял.

Если вы используете EmailMultiAlternatives , вы, видимо, ДОЛЖНЫ поставлять как текстовый формат, так и HTML-формат тела письма, в ситуациях, когда у вашего письма есть дополнительные вложения. Я только предоставил HTML-формат, который был одобрен для электронной почты без вложений, но каким-то образом сбивал с толку, когда добавлялись другие вложения, такие как документы PDF.

Окончательный рабочий код:

text_content = strip_tags(content)
msg = EmailMultiAlternatives()
msg.sender = "[email protected]"
msg.subject = subject
msg.to = [target]
msg.body = text_content
msg.attach_alternative(content, "text/html")
if attachments is not None:
    for attachment in attachments:
        content = open(attachment.path, 'rb')
        msg.attach(attachment.name,content.read(),'application/pdf')
msg.send()
6
добавлено
@tutuDajuju dunno; я никогда не исследовал далее ...
добавлено автор Roger, источник
можете ли вы указать, почему вы должны предоставить оба текст и альтернатив html?
добавлено автор tutuDajuju, источник
Не работает @Roger Все еще html-контент становится все более
добавлено автор Bhargav Nanekalva, источник

Если вы хотите предоставить как текстовую, так и текстовую/html-версию, следует использовать EmailMultiAlternatives. Затем клиент электронной почты получателя может решить, какую версию отображать. Вам нужно просто:

from django.core import mail

....

msg = mail.EmailMessage(subject, content,
                        to=[target], from_email='[email protected]')
if attachments is not None:
    for attachment in attachments:
        msg.attach_file(attachment, 'application/zip')
3
добавлено
Спасибо, но это не работает в message.py в файле sanitize_address, строка 102: требуется больше 1 значения для распаковки
добавлено автор Roger, источник
Строка, содержащая мой собственный адрес электронной почты ...
добавлено автор Roger, источник
Частично. Переменная «content» содержит текст в формате HTML, который теперь отображается как неформатированный контент в теле письма. Вложения правильно прикреплены. Поскольку мне нужно правильно отформатированное сообщение HTML, EmailMultiAlternatives появляется единственным способом.
добавлено автор Roger, источник
Хм .. это похоже на то, что может произойти, это неправильный адрес электронной почты ... Какое значение вы использовали для цели?
добавлено автор Marek Kowalski, источник
Ах, правильно, from_email должен быть один адрес, а не список. Я исправил образец кода в ответе. Он работает для вас сейчас?
добавлено автор Marek Kowalski, источник
Django
Django
1 931 участник(ов)

Полезная информация и правила: https://github.com/django-ru/faq Вакансии и резюме: @django_jobs Пофлудить идём сюда: @django_flood Статистика чата: combot.org/chat/-1001063854692

django_jobs
django_jobs
916 участник(ов)

Поиск и предложения работы (Django) Правила: https://t.me/django_jobs/4 Вакансии с тегом #job улетают в канал @django_jobs_board Вопросы к @amureki Основной чат @pydjango

Django
Django
733 участник(ов)

Веб-фреймворк для перфекционистов с дедлайнами. Наша группа на vk: https://vk.com/django_framework В Discord: https://discord.me/django_framework по всем вопросам @MechanisM

django flood
django flood
71 участник(ов)

Флудилка джангистов Пока без правил