在Python中通过邮件发送嵌入的图片

1 投票
2 回答
620 浏览
提问于 2025-04-18 08:23

我想知道怎么在Python中把图片放到邮件的正文里发送。我在网上查过了,找到的都是关于附件的发送方法。那我该怎么把图片直接放在邮件里呢?

这是我的代码:

from django.core.mail import EmailMessage

    subject = 'Report for ' + filename
    content = 'Hello All \nPFA  ' + filename + '. \n\n\nThis is an auto generated mail. Please do not reply to this email. '
    receipients =['x','y']
    sender = ''

    message = EmailMessage(subject,content,sender,bcc = receipients)
    message.attach_file(filepath)
    message.send()

2 个回答

0

我会使用 base64 编码,并把数据直接嵌入到邮件正文中,比如:

<img width="16" height="16" alt="star" src="data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7" />

这样做的效果可以在这里查看:http://jsfiddle.net/rinz/jDjb5/

1

我觉得直接设置文本内容是做不到的。最简单的方法可能是通过 Django 的模板渲染系统发送一封带有 HTML 的邮件。这样你就可以按照你想要的方式直接插入图片(比如 <img src="...">)。

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string   

mail = EmailMultiAlternatives(
    subject, 
    render_to_string('template.txt',
    sender,
    recipients
)
mail.attach_alternative(render_to_string('template.html', {'image_src': '...'}), 'text/html'))
mail.send()

需要注意的是,最好同时包含一封纯文本邮件(没有图片),以防接收方的邮件系统无法读取 HTML(这种情况几乎不会发生)。更清楚地说,template.htmltemplate.txt 是你想发送的相同内容,只是一个有 HTML,一个没有 HTML。比如:

template.txt

Hello All \nPFA  \n\n\nThis is an auto generated mail. Please do not reply to this email. 

template.html

<p> Hello All </p>PFA  </br> <img src=" {{ image_src }} "> ... 

撰写回答