Python 将base64或图像链接转换为图像而不保存图像

Python 将base64或图像链接转换为图像而不保存图像,python,image,beautifulsoup,smtp,base64,Python,Image,Beautifulsoup,Smtp,Base64,我正在开发一些价格跟踪器,检查价格是否更改为向用户发送电子邮件,但我想知道是否可以将图像链接或图像的bsase64转换为a image.png,而无需将图像保存在文件系统中。下面是我获取图像链接并将其转换为base64的代码(我知道如何在文件系统中保存图像并通过邮件发送) 这是一个例子: elif shop_type == "ebay": price = soup.find(id="prcIsum").get_text()

我正在开发一些价格跟踪器,检查价格是否更改为向用户发送电子邮件,但我想知道是否可以将图像链接或图像的bsase64转换为a image.png,而无需将图像保存在文件系统中。下面是我获取图像链接并将其转换为base64的代码(我知道如何在文件系统中保存图像并通过邮件发送)

这是一个例子:

    elif shop_type == "ebay":
        price = soup.find(id="prcIsum").get_text()
        converted_price = int(price[4:7].strip(","))
        image_desc = soup.find(itemprop="image")
        product = image_desc.get('alt')
        image_link = image_desc.get('src')
        .....

    image_base = base64.b64encode(requests.get(image_link).content)
   
这就是我最后被卡住的地方

图像的base64(如果重要)

image_base64 = "b'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"

图像链接

image_link= "https://i.ebayimg.com/images/g/zY0AAOSwZJBX-Miu/s-l300.jpg"

我想在我发送的邮件中显示此图像

发送电子邮件

subject = f"Price of your {product.title()} has Changed"
body = f"Your {product} price has changed to (EUR {price}) please check {Url} \n \n{image_link}"
msg = f"Subject: {subject} \n\n {body}"

server.sendmail(user_email, test_mail, msg.format(user_email, test_mail, subject, body).encode('utf-8'))

电子邮件只是文本。要将图像嵌入到电子邮件中,您必须使用允许这样做的内容类型,如HTML,并在该链接中插入附加图像。作为一个粗略的回退,发送一个文本部分和一个图像部分,并希望收件人的电子邮件客户端将两者都呈现出来。(您可以向附件中添加“contentdisposition:inline”以建议它应该这样做。)无论哪种方式,您都需要一个多部分MIME容器,其中一部分包含实际消息,另一部分包含图像

取决于你选择哪一个,你想以任何一个结束

From: you <your_address@example.net>
To: some recipient <victim@example.org>
Subject: Price of your Zircon-Encrusted Tweezer has Changed
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="foobar"

--foobar
Content-type: text/plain; charset="ascii"
Content-transfer-encoding: 7bit

Your tweezer price has changed to (EUR 0.01) please check https://nopunctuationorlinebreaks.example.net/tweezer

--foobar
Content-type: image/png
Content-disposition: inline
Content-transfer-encoding: base64

/9j/4AAQSkZJRgABAQEASABIAAD//gAyUHJvY2Vzc2VkIEJ5IGVCYXkgd2l0aCBJ
bWFnZU1hZ2ljaywgejEuMS4wLiB8fEIy/9sAQwAGBAUGBQQGBgUGBwcGCAoQCgoJ
CQoUDg8MEBcUGBgXFBYWGh0lHxobIxwWFiAsICMmJykqKRkfLTAtKDAlKCko/9sA
etc

--foobar--

然而,连接文本片段并不是创建有效电子邮件的可持续方式。对于非常简单的消息,您可以尝试,但特别是如果您不知道自己在做什么,请不要这样做。使用
电子邮件
库创建有效的MIME结构

从email.message导入EmailMessage
# ...
elif店铺类型==“易趣”:
price=soup.find(id=“prcIsum”).get_text()
转换后的价格=int(价格[4:7]。条形(“,”)
image\u desc=soup.find(itemprop=“image”)
product=image\u desc.get('alt')
image\u link=image\u desc.get('src')
.....
imagedata=requests.get(图像链接).content
# ...
msg=EmailMessage()
msg['Subject']=f“您的{product.title()}的价格已更改”
msg['From']=用户电子邮件
msg['To']=','.加入(测试邮件)
msg.set_content(f“您的{product}价格已更改为(EUR{price})。请检查{Url}\n”)
msg.add_附件(imagedata,maintype='image',subtype='png',disposition='inline')
服务器发送消息(msg)
如果您只想在
标记中发送带有联机图像链接的HTML,显然可以省略
添加附件()
调用;然后需要将消息类型指定为
text/html
,而不是
text/plain


您不需要显式地
base64
任何内容;
电子邮件
库负责为SMTP编码所有内容。(不过,您需要确保正确标记所有内容。例如,我假设您的图像是
image/png
,但它显然可能是其他类型的图像。)

。一个
io
对象?试试
io.BytesIO(requests.get(image\u link.content)
@jizhihaoSAMA我试过了,我只得到了
io
对象,而不是我想要的图像。电子邮件只是文本。要将图像嵌入到电子邮件中,您必须使用允许这样做的内容类型,如HTML,并在该链接中插入附加图像。作为一个粗略的回退,发送一个文本部分和一个图像部分,并希望收件人的电子邮件客户端将两者都呈现出来。(您可以向附件中添加“Content disposition:inline”以建议它应该这样做。)无论哪种方式,您都需要一个多部分MIME容器,其中一部分包含实际邮件,另一部分包含图像。连接文本片段不是创建有效电子邮件的可持续方式。对于非常简单的消息,您可以尝试,但特别是如果您不知道自己在做什么,请不要这样做。使用
电子邮件
库创建有效的MIME结构。不难找到例子,首先在文档中。我知道镊子是复数形式,但我不得不稍微弯曲一些东西来适应你的模板。我不得不猜测你的几个变量,所以这显然是未经测试的。工作得很有魅力非常感谢我在网上搜索了这么多关于我的问题,但我没有找到正确的答案,也没有找到任何东西关于
email.message
lib再次感谢
email
模块是Python标准库的一部分,具有广泛的功能。不幸的是,它对新手不太友好,而且web上充斥着糟糕、过时和/或完全不正确的示例和解释。感谢您注意到这一点。我真的希望你能在
(欧元{price})后面加个句号或至少一个逗号。
body = f"""<html><body><p>Your {product} price has changed to (EUR {price}). 
Please check {Url}</p>
<p><img src="{image_link}" alt="Now with sentence punctuation!" />
</p></body></html>
"""