2016-01-22 3 views
0

Я пытаюсь получить изображения, показанные как часть письма, отправленного с помощью Python. В документах Python есть пример, который не работает.Python 3 EmailMessage html сообщение с изображением

from datetime import datetime 
import sys 

import smtplib 

from email.message import EmailMessage 
from email.headerregistry import Address 
from email.utils import make_msgid 



from email.mime.image import MIMEImage 

attachment = '/user/file/test.png' 


import email.policy 
msg = EmailMessage() 
msg['To'] = Address("Srujan", '[email protected]') 
msg['From'] = Address("Srujan", '[email protected]') 
msg['Subject'] = "Nice message goes with it "+str(datetime.now()) 
id = make_msgid() 
msg.set_type('text/html') 
msg.set_content(" This is the Data Message that we want to send") 
html_msg = "<br> <b><u> This is the Text .... </u></b><br> <img src='cid:{image_id}' />".format(image_id=id[1:-1]) 
msg.add_alternative(html_msg, subtype="html") 
image_data = open(attachment, "rb") 
image_mime = MIMEImage(image_data.read()) 
image_data.close() 
msg.add_attachment(image_mime, cid=id, filename = "myown.png" ,) 


try: 
    with smtplib.SMTP('example.com') as s: 
     s.ehlo() 
     s.starttls() 
     s.ehlo() 

     s.send_message(msg) 
     s.close() 
    print("Email sent!") 
except: 
    print("Unable to send the email. Error: ", sys.exc_info()[0]) 
    raise 

Пара вещей, которые я заметил:

To: Srujan < "[email protected]"> От: Srujan < "[email protected]"> Тема: Nice сообщение идет с it 2016-01-21 17: 39: 23.642762 MIME-версия: 1.0 Тип контента: multipart/mixed; border = "=============== 3463325241650937591 =="

- =============== 3463325241650937591 == Тип контента : multipart/alternative; border = "=============== 0739224896516732414 =="

- =============== 0739224896516732414 == Content-Type: текст/равнина; кодировка = "UTF-8" Content-Transfer-Encoding: 7bit

Это сообщение данных, которые мы хотим послать

- =============== 0739224896516732414 == Content-Type: text/html; кодировка = "UTF-8" Content-Transfer-Encoding: 7bit MIME-Version: 1,0


Это текст ....

- ========= ====== 0739224896516732414 == -

- =============== 3463325241650937591 == Content-Type: сообщение/rfc822 Content-Transfer-Encoding: 8bit Content-Disposition: вложение; имя файла = "myown.png" Content-ID: < 20160122013923.64205.76661> MIME-Version: 1.0

Content-Type: изображение/PNG MIME-Version: 1.0 Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABmJLR0QA/соды/AP + gvaeTAAAgAElE QVR4nOzdd2BUVfYH8HNfmZJAChAEQ1FAqoKgCAsWLEgTG4gKP11FQNG1AauIgGBXVhRUsCK4i6gI

Теперь прилагаемое сообщение имеет значение два типа содержимого s. Электронная почта приходит только с текстом и без изображения

Я успешно справился с классом MultiPart, но хочу добиться этого с помощью EmailMessage.

ответ

1

Очень жаль, что документы Python по этому вопросу являются неполными/неправильными. Я хотел сделать то же самое и получил ту же проблему (вложения получили два типа содержимого)

Решил проблему, используя метод attach() вместо add_attachment() на EmailMessage объектов. Единственное предостережение в том, что перед этим нужно преобразовать EmailMessage в multipart/mixed. Пример:

from smtplib import SMTP 
from email.message import EmailMessage 
from email.mime.text import MIMEText 
from email.headerregistry import Address 
from ssl import SSLContext, PROTOCOL_TLSv1_2 

# Creating and populating email data: 
msg = EmailMessage() 
msg['From'] = Address(display_name='Recipient', addr_spec='[email protected]') 
msg['To'] = Address(display_name='Sender', addr_spec='[email protected]') 
msg['Subject'] = 'An email for you'  
msg.set_content('This should be in the email body') 
# It is possible to use msg.add_alternative() to add HTML content too 

# Attaching content: 
att = MIMEText('This should be in an attached file') # Or use MIMEImage, etc 
# The following line is to control the filename of the attached file 
att.add_header('Content-Disposition', 'attachment', filename='attachment.txt') 
msg.make_mixed() # This converts the message to multipart/mixed 
msg.attach(att) # Don't forget to convert the message to multipart first! 

# Sending the email: 
with SMTP(host='smtp.example.org', port=587) as smtp_server: 
    try: 
     # You can choose SSL/TLS encryption protocol to use as shown 
     # or just call starttls() without parameters 
     smtp_server.starttls(context=SSLContext(PROTOCOL_TLSv1_2)) 
     smtp_server.login(user='[email protected]', password='password') 
     smtp_server.send_message(msg) 

    except Exception as e:     
     print('Error sending email. Details: {} - {}'.format(e.__class__, e)) 
+0

Greate, я попробую его :) спасибо тонну. – SrujanSreepathi

+0

Вы можете отправить отчет об ошибке на https://bugs.python.org, если документы ошибочны. – Pedro

Смежные вопросы