12.11

Отправка HTML писем c картинками и простым текстом для клиентов не поддерживающих HTML

Задача: используя django сгенерировать письмо с двумя представлениями - простой текст и HTML. Картинки, используемые в HTML, должны быть вложены в письмо аттачами.

Нашел пример работы с email в python:

# Send an HTML email with an embedded image and a plain text message for
# email clients that don't want to display the HTML.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage

# Define these once; use them twice!
strFrom = 'from@example.com'
strTo = 'to@example.com'

# Create the root message and fill in the from, to, and subject headers
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = 'test message'
msgRoot['From'] = strFrom
msgRoot['To'] = strTo
msgRoot.preamble = 'This is a multi-part message in MIME format.'

# Encapsulate the plain and HTML versions of the message body in an
# 'alternative' part, so message agents can decide which they want to display.
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)

msgText = MIMEText('This is the alternative plain text message.')
msgAlternative.attach(msgText)

# We reference the image in the IMG SRC attribute by the ID we give it below
msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>Nifty!', 'html')
msgAlternative.attach(msgText)

# This example assumes the image is in the current directory
fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# Define the image's ID as referenced above
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

# Send the email (this example assumes SMTP authentication is required)
import smtplib smtp = smtplib.SMTP()
smtp.connect('smtp.example.com')
smtp.login('exampleuser', 'examplepass')
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
smtp.quit()

Django упрощает этот процесс, но в официальной документации не говорится о том как создавать письма с альтернативным содержимым в виде HTML с вложенными в письмо картинками.

Если загрузить картинки обычными аттачами, а в HTML указать ссылки на их имена файлов, то почтовый клиент не покажет картинок в HTML содержимом письма. Чтобы почтовый клиент как надо отобразил HTML, необходимо:

  • не просто вложить картинку в тело письма, а еще присвоить этому вложению уникальное имя;
  • для вставки в HTML файл в качестве источника использовать это имя - "cid:имя"

Средствами django такая возможность не предусмотрена. Однако, можно сделать аттач используя средства стандартной библиотеки email и приложить его к письму с помощью метода attach.

from django.conf import settings
from email.MIMEImage import MIMEImage

# создаем письмо
msg = EmailMultiAlternatives("email subject", "text content here", settings.DEFAULT_FROM_EMAIL, ["to@example.com"])
msg.attach_alternative("html content here", "text/html")

# прикрепляем картинку
msgImage = MIMEImage(image_content) # image_content - содержимое файла с картинкой
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)

# отправляем письмо
msg.send()

Адрес картинки для вставки в HTML в данном примере: "cid:image1".

© 2010 Алексей Камедов

При копировании материалов блога ссылка на источник обязательна.