2016-11-01 5 views
1

Я проверил много сообщений об этом, но все же не могу найти решение. Я могу отправить электронную почту со встроенными изображениями, но письмо также включает эти изображения в виде вложений, и мне нужны только встроенные изображения. Я пробовал много вариантов, с «родственным» типом, «смешанным». Также с html-кодом внутри программы Python (не в шаблоне Jinja2), но я не могу заставить его работать.Python: многостраничный html-адрес отправляется как со встроенным изображением, так и с приложением

list_of_images = get_graphs() #list with file names 

# here if I put "related" - images are sent ONLY as attachments 
mail = MIMEMultipart() 
for filename in list_of_images: 
    fp = open(filename, 'rb') 
    msg_img = MIMEImage(fp.read()) 
    fp.close() 
    msg_img.add_header('Content-ID', '<{}>'.format(filename)) 
    msg_img.add_header('Content-Disposition', 'inline', filename=filename) 
    mail.attach(msg_img) 
#Jinja2 for html template 
env = Environment(loader=FileSystemLoader('.')) 
main = env.get_template('images.tpl') 
html = main.render(pictures=list_of_images) 
msgHtml = MIMEText(html, 'html') 
mail.attach(msgHtml) 

mail['Subject'] = "TEST" 
mail['From'] = "[email protected]" 
mail['To'] = "[email protected]" 
s = smtplib.SMTP("localhost") 
s.sendmail(mail['From'], "[email protected]", mail.as_string()) 
s.quit() 

шаблон дзиндзя:

<html> 
<body> 
{% for image in pictures %} 
<img src="cid:{{image}}"> 
{% endfor %} 
</body> 
</html> 

ответ

1

Закрепить HTML первым или задать параметр "Пуск" в многочастном/связанном тип контента.

Цитирование RFC2387:

Параметр запуска, если дано, это содержание-идентификатор "корень" объекта соединение . Если нет, то «корень» является первой частью тела в объекта Multipart/Related. «Корневой» является первым элементом процессов .

Таким образом, в вашем примере, вы можете сделать эти изменения, чтобы пометить корневой элемент:

mail = MIMEMultipart("related", start="<HTML>", type="text/html") 
... 
msgHtml.add_header('Content-ID', '<HTML>') 

По крайней мере, в Google Mail, либо поместить HTML первый или добавление «Пуск» параметр позволяет изображения, которые будут отображаться в строке.

Полный пример:

from jinja2 import Template 
from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 
from email.mime.image import MIMEImage 
from glob import glob 
from getpass import getpass 
import smtplib 

me = '[email protected]' 
you= '[email protected]' 
auth = ('[email protected]', getpass()) 
mx= ('smtp.gmail.com', 465) 

list_of_images = glob('*.jpg') 

mail = MIMEMultipart("related") 
#Jinja2 for html template 
main = Template(''' 
    <html><body> 
    {% for image in pictures %}<img src="cid:{{image}}">{% endfor %} 
    </body></html>''') 
html = main.render(pictures=list_of_images) 
msgHtml = MIMEText(html, 'html') 
mail.attach(msgHtml) 

for filename in list_of_images: 
    fp = open(filename, 'rb') 
    msg_img = MIMEImage(fp.read()) 
    fp.close() 
    msg_img.add_header('Content-ID', '<{}>'.format(filename)) 
    msg_img.add_header('Content-Disposition', 'inline', filename=filename) 
    mail.attach(msg_img) 

mail['Subject'] = "TEST" 
mail['From'] = me 
mail['To'] = you 

s = smtplib.SMTP_SSL(*mx) 
s.login(*auth) 
s.sendmail(me, you, mail.as_string()) 
s.quit() 
+0

Спасибо за ваш ответ Роб! – Yuliya

+0

Он решил мою проблему, если я переместил часть html перед частью изображения. Однако случай с опцией «start» не работал для меня, все равно отправляет как встроенное изображение, так и вложение. – Yuliya

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

  • Нет связанных вопросов^_^