2016-11-01 98 views
1

我已經檢查了很多文章,但仍找不到解決方案。 我可以發送包含嵌入圖片的電子郵件,但電子郵件中也包含這些圖片作爲附件,我只需要嵌入的圖片。我嘗試了很多變化,以'相關'類型,'混合'。此外與Python程序內的HTML代碼(不在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

的開始參數,如果給定的,是化合物 對象的 「根」 的內容ID。如果不存在,則「根」是多部分/相關實體中的第一個正文部分。 「根」是應用程序首先處理的元素。

所以,在你的榜樣,你可能會做出這些改變,以紀念根元素:

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

至少在谷歌郵件,無論是首先將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部分。然而,「啓動」選項的情況下,我仍然沒有工作,仍然發送嵌入式圖像和附件。 – Yuliya

相關問題