Frage

In meiner Web-Anwendung sende ich gelegentlich E-Mails eine wiederverwendbare Mailer Anwendung wie diese verwenden:

user - self.user
subject = ("My subject")
from = "me@mydomain.com"
message = render_to_string("welcomeEmail/welcome.eml", { 
                "user" : user,
                })
send_mail(subject, message, from, [email], priority="high" )

Ich mag eine E-Mail mit eingebetteten Bildern in ihnen senden, so dass ich versuchte, die Mail in einem Mail-Client machen, sieht die Quelle, und sie in meine Vorlage (welcome.eml) setzen, aber ich habe es nicht gelungen, zu erhalten sie machen richtig in Mail-Clients, wenn seine gesendet.

Kennt jemand eine einfache Möglichkeit für mich Mime codierte Mail-Vorlagen mit Inline-Bildern zu erstellen, die richtig machen wird, wenn ich sie schicken?

War es hilfreich?

Lösung

Aktualisieren

Vielen Dank an Saqib Ali diese alte Frage wieder aufleben fast 5 Jahre nach meiner Antwort.

Die Anweisungen, die ich zu der Zeit gab nicht mehr. Ich vermute, dass es in den vergangenen Jahren einige Verbesserungen an Django gewesen, was bedeutet, dass send_mail() Klartext erzwingt. Egal, was Sie in dem Inhalt setzen, wird es immer als Klartext geliefert werden.

Die jüngste Django Dokumentation erklärt, dass send_mail() ist wirklich nur eine Bequemlichkeit eine Instanz der Klasse django.core.mail.EmailMessage zum Erstellen, und dann auf dieser Instanz aufrufen send(). EmailMessage hat diese Notiz für den Körper-Parameter, der die Ergebnisse sehen wir jetzt im Jahr 2014 erklärt:

  

Körper: Der Körper Text. Dies sollte eine Klartextnachricht sein.

     

... etwas später in der Dokumentation ...

     

Standardmäßig ist der MIME-Typ des Körperparameters in einer Emailmessage ist „text / plain“. Es ist gute Praxis zu verlassen diese allein.

Na gut (ich bekenne, dass ich nicht die Zeit genommen habe, zu untersuchen, warum die 2009 Anweisungen gearbeitet - ich habe sie im Jahr 2009 testen zurück - oder, wenn es geändert). Django liefert, und Dokument , ein django.core.mail.EmailMultiAlternatives Klasse erleichtern einen Nur-Text und HTML-Darstellung der gleichen Nachricht zu senden.

Der Fall in dieser Frage ist etwas anders. Wir suchen keine Alternative per se anzuhängen, aber anfügen im Zusammenhang Teile eine der Alternativen. Innerhalb der HTML-Version (und es spielt keine Rolle, ob Sie haben oder die reine Textversion weglassen), wollen wir einen Bilddatenteil einzubetten. Nicht eine alternative Ansicht des Inhalts, aber im Zusammenhang Inhalte, die in dem HTML-Körper verwiesen wird.

ein eingebettetes Bild Senden ist immer noch möglich, aber ich weiß nicht, eine einfache Art und Weise sehen, es zu tun send_mail verwenden. Es ist Zeit, mit der Komfortfunktion zu verzichten und ein EmailMessage direkt zu instanziiert.

Hier ist ein Update zum vorherigen Beispiel:

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()

Original Antwort von 2009:

eine E-Mail mit eingebetteten Bildern zu versenden, der Nutzung Python integrierte E-Mail-Modul, um die MIME-Teile aufzubauen.

Im Folgenden soll es tun:

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")

In der Realität werden Sie wahrscheinlich wollen die HTML senden zusammen mit einer Klartext-Alternative. In diesem Fall verwendet den MIMEMultipart „related“ MIME-Typen Container als Wurzel zu erzeugen. Dann erstellen anderen MIMEMultipart mit dem Subtyp „alternativen“ und legen beide einen Mime (Subtyp html) und einen Mime (Subtyp plain) zum alternativen Teil. Bringen Sie dann das Bild auf die im Zusammenhang Wurzel.

Andere Tipps

Ich hatte Probleme mit Jarret Rezept auf Django 1.10 - wurde immer MIME und Codierungsfehler für die verschiedenen Möglichkeiten, wie Sie MIME-Daten anhängen

.

Hier ist eine einfache Multipart-Transaktionsvorlage für eine E-Mail mit einem eingebetteten coupon_image Datei-Objekt, das auf django funktioniert 1.10:

from django.core.mail import EmailMultiAlternatives
from email.mime.image import MIMEImage

def send_mail(coupon_image):
    params = {'foo':'bar'} # create a template context
    text_body = render_to_string('coupon_email.txt', params)
    html_body = render_to_string('coupon_email.html', params)
    img_data = coupon_image.read() #should be a file object, or ImageField
    img = MIMEImage(img_data)
    img.add_header('Content-ID', '<coupon_image>')
    img.add_header('Content-Disposition', 'inline', filename="coupon_image")

    email = EmailMultiAlternatives(
        subject="Here's your coupon!",
        body=text_body,
        from_email='noreply@example.com',
        to=['someone@example.com',]
    )

    email.attach_alternative(html_body, "text/html")
    email.mixed_subtype = 'related'
    email.attach(img)

    email.send(fail_silently=False)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top