gpt4 book ai didi

python - 如何在 Python 中将多个嵌入图像添加到电子邮件中?

转载 作者:行者123 更新时间:2023-12-05 05:39:07 25 4
gpt4 key购买 nike

这个问题其实是这个答案的延续 https://stackoverflow.com/a/49098251/19308674 .我正在尝试向电子邮件内容中添加多个嵌入图像(不仅仅是一个)。

我想以一种循环遍历图像列表的方式来做,此外,每个图像旁边会有不同的文本。 Something like this for example as you can see in Weather Next 10 days我想循环浏览文件夹中的图像,每个图像旁边都会有一些不同的文本,如示例中所示。

from email.message import EmailMessage
from email.utils import make_msgid
import mimetypes

msg = EmailMessage()

# generic email headers
msg['Subject'] = 'Hello there'
msg['From'] = 'ABCD <abcd@example.com>'
msg['To'] = 'PQRS <pqrs@example.org>'

# set the plain text body
msg.set_content('This is a plain text body.')

# now create a Content-ID for the image
image_cid = make_msgid(domain='example.com')
# if `domain` argument isn't provided, it will
# use your computer's name

# set an alternative html body
msg.add_alternative("""\
<html>
<body>
<p>This is an HTML body.<br>
It also has an image.
</p>
<img src="cid:{image_cid}">
</body>
</html>
""".format(image_cid=image_cid[1:-1]), subtype='html')
# image_cid looks like <long.random.number@example.com>
# to use it as the img src, we don't need `<` or `>`
# so we use [1:-1] to strip them off


# now open the image and attach it to the email
with open('path/to/image.jpg', 'rb') as img:

# know the Content-Type of the image
maintype, subtype = mimetypes.guess_type(img.name)[0].split('/')

# attach it
msg.get_payload()[1].add_related(img.read(),
maintype=maintype,
subtype=subtype,
cid=image_cid)


# the message is ready now
# you can write it to a file
# or send it using smtplib

最佳答案

如果我能猜出你想问什么,解决方案就是为每个图像生成一个唯一的 cid

from email.message import EmailMessage
from email.utils import make_msgid
# import mimetypes

msg = EmailMessage()

msg["Subject"] = "Hello there"
msg["From"] = "ABCD <abcd@example.com>"
msg["To"] = "PQRS <pqrs@example.org>"

# create a Content-ID for each image
image_cid = [make_msgid(domain="example.com")[1:-1],
make_msgid(domain="example.com")[1:-1],
make_msgid(domain="example.com")[1:-1]]

msg.set_content("""\
<html>
<body>
<p>This is an HTML body.<br>
It also has three images.
</p>
<img src="cid:{image_cid[0]}"><br/>
<img src="cid:{image_cid[1]}"><br/>
<img src="cid:{image_cid[2]}">
</body>
</html>
""".format(image_cid=image_cid), subtype='html')

for idx, imgtup in enumerate([
("path/to/first.jpg", "jpeg"),
("file/name/of/second.png", "png"),
("path/to/third.gif", "gif")]):
imgfile, imgtype = imgtup
with open(imgfile, "rb") as img:
msg.add_related(
img.read(),
maintype="image",
subtype=imgtype,
cid=f"<{image_cid[idx]}>")

# The message is ready now.
# You can write it to a file
# or send it using smtplib

使用现代 EmailMessage API 的荣誉;我们仍然看到太多的问题,它们盲目地从 Python <= 3.5 复制/粘贴带有 MIMEMultipart 等的旧 API 等等。

我取出了 mimetypes 图像格式查询逻辑,以便在代码中拼出每个图像的类型。如果你需要 Python 来猜测,你知道该怎么做,但是对于一个小的静态图像列表,似乎只指定每个图像更有意义,并避免开销以及不太可能但仍然不是不可能的问题启发式猜测错误。

我猜你的图片都将使用相同的格式,所以你实际上可以简单地硬编码 subtype="png" 或其他任何东西。

希望如何将更多的每张图片信息添加到图片元组的循环中应该是显而易见的,但如果您的需求超出了琐碎的范围,您可能希望将图片及其各种属性封装到一个简单的类中。

对于无法访问 HTML 部分的收件人来说,您的消息显然毫无意义,因此我删除了您拥有的虚假 text/plain 部分。您实际上是在向偏好通过 HTML 查看纯文本的收件人发送完全不同的消息;如果那真的是你的意图,请停止它。如果您无法在纯文本版本中提供与在 HTML 版本中相同的信息,至少不要让那些收件人觉得您一开始就没有什么重要的事要说.

切线地,请不要伪造不属于您的域的电子邮件地址。您最终会告发垃圾邮件发送者,让他们试图向无辜的第三方发送未经请求的消息。始终使用 IANA 保留域,如 example.comexample.org 等,这些域保证在现实中永远不存在。我编辑了你的问题来解决这个问题。

关于python - 如何在 Python 中将多个嵌入图像添加到电子邮件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72777873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com