Django: как отправлять электронные письма в формате HTML со встроенными изображениями - PullRequest
17 голосов
/ 24 сентября 2010

Как я могу отправлять электронные письма в формате HTML со встроенными изображениями? Как HTML должен ссылаться на изображения? Изображения должны быть добавлены как прикрепленные к электронной почте MultiPart?

Любой пример очень ценится.

Ответы [ 4 ]

8 голосов
/ 24 сентября 2010

http://djangosnippets.org/snippets/285/

Вы должны использовать MultiPart и cid :. Отправка html-писем с изображениями почти всегда плохая идея. Это дает спам-очки на ваш почтовый и SMTP-сервер ...

6 голосов
/ 24 сентября 2010

Помните, что django предлагает только оболочки для стандартного smtplib - я не знаю, поможет ли это, но попробуйте взглянуть на этот пример: http://code.activestate.com/recipes/473810-send-an-html-email-with-embedded-image-and-plain-t/

Так что, я думаю, вы могли бы использовать значения заголовка EmailMessage для определения этого 'image1' - заголовок сообщения является набором значений, поэтому просто добавьте к нему что-то вроде {'Content-ID': '<image1>'}.

Затем прикрепите файл к своей электронной почте, используя attach(). После этого вы можете использовать код для генерации HTML-сообщения, например:

html_content = '<b>Some HTML text</b> and an image: <img src="cid:image1">'
4 голосов
/ 06 ноября 2017

Я достиг того, о чем просит опера, используя почтовую систему django.Кроме того, он будет использовать настройки django для рассылки (включая другую подсистему для тестирования и т. Д. Я также использую mailhogs во время разработки).Это также немного более высокий уровень:

from django.conf import settings
from django.core.mail import EmailMultiAlternatives


message = EmailMultiAlternatives(
    subject=subject,
    body=body_text,
    from_email=settings.DEFAULT_FROM_EMAIL,
    to=recipients,
    **kwargs
)
message.mixed_subtype = 'related'
message.attach_alternative(body_html, "text/html")
message.attach(logo_data())

message.send(fail_silently=False)

logo_data - вспомогательная функция, которая прикрепляет логотип (изображение, которое я хотел прикрепить в данном случае):

from email.mime.image import MIMEImage

from django.contrib.staticfiles import finders


@lru_cache()
def logo_data():
    with open(finders.find('emails/logo.png'), 'rb') as f:
        logo_data = f.read()
    logo = MIMEImage(logo_data)
    logo.add_header('Content-ID', '<logo>')
    return logo
0 голосов
/ 14 ноября 2018

Если вы хотите отправить электронное письмо с изображением в виде вложения (в моем случае это было изображение, которое было получено непосредственно из формы после его сохранения), вы можете использовать следующий код в качестве примера:

#forms.py

from django import forms
from django.core.mail import EmailMessage
from email.mime.image import MIMEImage


class MyForm(forms.Form):
    #...
    def save(self, *args, **kwargs):
        # In next line we save all data from form as usual.
        super(MyForm, self).save(*args, **kwargs)
        #...
        # Your additional post_save login can be here.
        #...
        # In my case name of field was an "image".
        image = self.cleaned_data.get('image', None)
        # Then we create an "EmailMessage" object as usual.
        msg = EmailMessage(
            'Hello',
            'Body goes here',
            'from@example.com',
            ['to1@example.com', 'to2@example.com'],
            ['bcc@example.com'],
            reply_to=['another@example.com'],
            headers={'Message-ID': 'foo'},
        )
        # Then set "html" as default content subtype.
        msg.content_subtype = "html"
        # If there is an image, let's attach it to message.
        if image:
            mime_image = MIMEImage(image.read())
            mime_image.add_header('Content-ID', '<image>')
            msg.attach(mime_image)
        # Then we send message.
        msg.send()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...