Warm tip: This article is reproduced from serverfault.com, please click

converting base64 or image link to an image without saving the image

发布于 2020-12-02 11:13:13

I am working on some price tracker that checks the price if changed to send an email to the user but I was wondering if I can convert an image link or the bsase64 of the image to a an image.png without saving the image on my file system. Here is my code of getting the image link and converting it to a base64(I know how to save an image on my file system and send it per mail).

This is an example:

    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)
   

and Here where I got stuck at the end

base64 of the image if important

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

image link

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

I want to display this image for example in the mail that I send

enter image description here

sending an email

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'))
Questioner
Shad0w
Viewed
0
tripleee 2020-12-03 18:41:37

An email message is just text. To embed an image into an email message, you have to use a content type which allows this, like HTML, and within that link to the attached image. As a crude fallback, send a text part and an image part and hope that the recipient's email client will render them both. (You can add "Content-disposition: inline" to the attachment to suggest that it should.) Either way, you need a multipart MIME container, with the actual message in one part, and the image in another.

Depending on which you choose, you want to end up with either

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--

or a similar multipart/related where the first part is text/html with an <img src=cid:whatever> where the image attachment has the same cid in its MIME headers. Or, of course, if the image already exists on a public web site, simply link there:

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>
"""

Joining fragments of text is not a sustainable way to create a valid email message, though. For really simple messages, you can try, but especially if you don't know exactly what you are doing, don't do that. Use the email library to create a valid MIME structure.

from email.message import EmailMessage

# ...

    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')
        .....

    imagedata = requests.get(image_link).content

    # ...

    msg = EmailMessage()
    msg['Subject'] = f"Price of your {product.title()} has Changed"
    msg['From'] = user_email
    msg['To'] = ', '.join(test_mail)

    msg.set_content(f"Your {product} price has changed to (EUR {price}). Please check {Url}\n")

    msg.add_attachment(imagedata, maintype='image', subtype='png', disposition='inline')

    server.send_message(msg)

If you want to send HTML with just a link to an online image in the <img> tag, obviously you can omit the add_attachment() call; then you'll need to specify the message type as text/html instead of text/plain.

You don't need to base64 anything explicitly; the email library takes care of encoding everything for SMTP. (You'll need to make sure you tag everything correctly, though. For example, I assumed your image is image/png but it could obviously be some other type.)