Reputation: 345
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
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'))
Upvotes: 0
Views: 391
Reputation: 189638
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 <[email protected]>
To: some recipient <[email protected]>
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.)
Upvotes: 1