【问题标题】:Python: Multipart html email is sent both with embedded image and attachmentPython:多部分 html 电子邮件通过嵌入式图像和附件发送
【发布时间】:2017-03-14 17:44:29
【问题描述】:

我查看了很多关于它的帖子,但仍然找不到解决方案。 我可以发送带有嵌入图片的电子邮件,但电子邮件还包含这些图片作为附件,我只需要嵌入图片。我尝试了很多变体,“相关”类型,“混合”。在 Python 程序中也有 html 代码(不在 Jinja2 模板中),但我无法让它工作。

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@addr"
mail['To'] = "email@addr"
s = smtplib.SMTP("localhost")
s.sendmail(mail['From'], "email@addr", mail.as_string())
s.quit()

神社模板:

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

【问题讨论】:

    标签: python html email jinja2 mime


    【解决方案1】:

    首先附加 HTML 或为多部分/相关内容类型指定“开始”参数。

    引用RFC2387:

    开始参数,如果给定,是化合物的内容ID 对象的“根”。如果不存在,“根”是第一个身体部分 多部分/相关实体。 “根”是元素 应用程序优先处理。

    因此,在您的示例中,您可以进行这些更改以标记根元素:

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

    至少在 Google Mail 中,将 HTML 放在首位或添加“start”参数都允许内联显示图像。

    完整示例:

    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 = 'example@gmail.com'
    you= 'example@gmail.com'
    auth = ('example@gmail.com', 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()
    

    【讨论】:

    • 谢谢罗伯的回答!
    • 如果我在图像部分之前移动 html 部分,它解决了我的问题。但是,带有“开始”选项的情况对我不起作用,仍然发送嵌入的图像和附件。
    猜你喜欢
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 2021-12-29
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多