создание электронного письма MIME обрабатывает по шаблону с изображениями для отправки с Python / django

Другой взлом является старым 1x1 прием прозрачного пикселя. Вставьте 1x1 прозрачное изображение gif и установите его ширину в теге изображения к ширине, которую Вы хотите. Это вынудит ячейку быть, по крайней мере, столь же широкой как изображение.

13
задан Tristan Brotherton 27 October 2009 в 19:44
поделиться

1 ответ

Обновление

Большое спасибо Сакибу Али за то, что он воскресил этот старый вопрос почти через 5 лет после моего ответа.

Инструкции, которые я дал в то время, больше не работают. Я подозреваю, что за прошедшие годы в Django были внесены некоторые улучшения, которые означают, что send_mail () принудительно использует простой текст. Независимо от того, что вы добавляете в контент, он всегда будет доставлен в виде обычного текста.

В самой последней документации Django объясняется, что send_mail () на самом деле просто удобство для создания экземпляр класса django.core.mail.EmailMessage , а затем вызов send () для этого экземпляра. EmailMessage содержит примечание для параметра body, в котором объясняются результаты, которые мы наблюдаем в 2014 году:

body: Основной текст. Это должно быть обычное текстовое сообщение.

... несколько позже в документации ...

По умолчанию MIME-тип параметра тела сообщения EmailMessage - "text / plain". Это хорошая практика - оставить это в покое.

Достаточно справедливо (признаюсь, я не нашел времени, чтобы исследовать, почему инструкции 2009 года работали - я тестировал их еще в 2009 году - или когда они изменились). Django предоставляет и документ класс django.core.mail.EmailMultiAlternatives , чтобы упростить отправку простого текста и HTML-представления одного и того же сообщения.

в этом вопросе немного другое. Мы не стремимся добавить альтернативу как таковую, а хотим добавить связанные части к одной из альтернатив. В HTML-версии (а это не Не имеет значения, есть ли у вас версия с обычным текстом или нет), мы хотим встроить часть данных изображения. Не альтернативный вид контента, а связанный контент, на который есть ссылка в теле HTML.

Отправка встроенного изображения по-прежнему возможна, но я не вижу простого способа сделать это с помощью send_mail . Пришло время отказаться от удобной функции и напрямую создать экземпляр EmailMessage .

Вот обновление предыдущего примера:

from django.core.mail import EmailMessage
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Load the image you want to send as bytes
img_data = open('logo.jpg', 'rb').read()

# Create a "related" message container that will hold the HTML 
# message and the image. These are "related" (not "alternative")
# because they are different, unique parts of the HTML message,
# not alternative (html vs. plain text) views of the same content.
html_part = MIMEMultipart(_subtype='related')

# Create the body with HTML. Note that the image, since it is inline, is 
# referenced with the URL cid:myimage... you should take care to make
# "myimage" unique
body = MIMEText('<p>Hello <img src="cid:myimage" /></p>', _subtype='html')
html_part.attach(body)

# Now create the MIME container for the image
img = MIMEImage(img_data, 'jpeg')
img.add_header('Content-Id', '<myimage>')  # angle brackets are important
img.add_header("Content-Disposition", "inline", filename="myimage") # David Hess recommended this edit
html_part.attach(img)

# Configure and send an EmailMessage
# Note we are passing None for the body (the 2nd parameter). You could pass plain text
# to create an alternative part for this message
msg = EmailMessage('Subject Line', None, 'foo@bar.com', ['bar@foo.com'])
msg.attach(html_part) # Attach the raw MIMEBase descendant. This is a public method on EmailMessage
msg.send()

Исходный ответ от 2009 г .:

Чтобы отправить электронное письмо со встроенными изображениями, используйте встроенный модуль электронной почты python для создания частей MIME.

следующее должно сделать это:

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Load the image you want to send at bytes
img_data = open('logo.jpg', 'rb').read()

# Create a "related" message container that will hold the HTML 
# message and the image
msg = MIMEMultipart(_subtype='related')

# Create the body with HTML. Note that the image, since it is inline, is 
# referenced with the URL cid:myimage... you should take care to make
# "myimage" unique
body = MIMEText('<p>Hello <img src="cid:myimage" /></p>', _subtype='html')
msg.attach(body)

# Now create the MIME container for the image
img = MIMEImage(img_data, 'jpeg')
img.add_header('Content-Id', '<myimage>')  # angle brackets are important
msg.attach(img)

send_mail(subject, msg.as_string(), from, [to], priority="high")

На самом деле вы, вероятно, захотите отправить HTML вместе с альтернативой в виде обычного текста. В этом случае используйте MIMEMultipart для создания «связанных» контейнер mimetype в качестве корневого. Затем создайте еще один MIMEMultipart с подтипом «альтернатива» и присоедините MIMEText (подтип html) и MIMEText (подтип plain) к альтернативной части. Затем прикрепите образ к соответствующему корню.

28
ответ дан 1 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: