Domanda

Nella mia applicazione Web invio occasionalmente e-mail utilizzando un'applicazione di posta riutilizzabile come questa:

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

Voglio inviare un'e-mail con immagini incorporate, quindi ho provato a creare la posta in un client di posta, a visualizzare la fonte e a inserirla nel mio modello (welcome.eml), ma non sono riuscito a ottenere per renderizzare correttamente nei client di posta quando viene inviato.

Qualcuno conosce un modo semplice per me di creare modelli di posta con codifica MIME con immagini incorporate che verranno visualizzati correttamente quando li invio?

È stato utile?

Soluzione

Aggiorna

Mille grazie a Saqib Ali per aver resuscitato questa vecchia domanda quasi 5 anni dopo la mia risposta.

Le istruzioni che ho dato al momento non funzionano più. Ho il sospetto che negli anni successivi siano stati apportati miglioramenti a Django, il che significa che send_mail () applica testo in chiaro. Indipendentemente da ciò che inserisci nel contenuto, verrà sempre consegnato come testo normale.

L'ultima Documentazione di Django spiega che send_mail () è davvero solo una comodità per creare un'istanza della classe django.core.mail.EmailMessage e quindi chiamare send () su quella esempio. EmailMessage ha questa nota per il parametro body, che spiega i risultati che stiamo vedendo ora nel 2014:

  

body: il testo del corpo. Questo dovrebbe essere un semplice messaggio di testo.

     

... un po 'più tardi nei documenti ...

     

Per impostazione predefinita, il tipo MIME del parametro body in un EmailMessage è " text / plain " ;. È buona norma lasciarlo da solo.

Abbastanza giusto (confesso di non aver avuto il tempo di indagare sul motivo per cui le istruzioni del 2009 hanno funzionato - le ho testate nel 2009 - o quando è cambiato). Django fornisce e document , un Classe django.core.mail.EmailMultiAlternatives per facilitare l'invio di un testo semplice e di una rappresentazione HTML dello stesso messaggio.

Il caso in questa domanda è leggermente diverso. Non stiamo cercando di aggiungere un'alternativa in sé, ma di aggiungere parti correlate a una delle alternative. All'interno della versione HTML (e non importa se hai o ometti la versione in testo normale), vogliamo incorporare una parte di dati immagine. Non una vista alternativa del contenuto, ma correlato a cui fa riferimento il corpo HTML.

L'invio di un'immagine incorporata è ancora possibile, ma non vedo un modo semplice per farlo utilizzando send_mail . È tempo di rinunciare alla funzione di convenienza e di creare un'istanza di un EmailMessage direttamente.

Ecco un aggiornamento dell'esempio precedente:

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

Risposta originale del 2009:

Per inviare un'e-mail con immagini incorporate, utilizzare il modulo e-mail incorporato di Python per creare le parti MIME.

Dovresti farlo come segue:

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 realtà, probabilmente vorrai inviare l'HTML insieme a un'alternativa di testo semplice. In tal caso, utilizzare MIMEMultipart per creare il "relativo" mimetype container come root. Quindi crea un altro MIMEMultipart con il sottotipo "alternativo", e collega sia un MIMEText (sottotipo html) sia un MIMEText (sottotipo semplice) alla parte alternativa. Quindi allegare l'immagine alla radice correlata.

Altri suggerimenti

Ho avuto problemi con la ricetta di Jarret su Django 1.10 - ho ricevuto MIME e errori di codifica per i vari modi in cui è possibile allegare i dati MIME.

Ecco un semplice modello transazionale multipart per una e-mail con un oggetto file coupon_image incorporato che funziona su django 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top