Как включить встроенные изображения в подпись электронной почты при отправке с python? - PullRequest
1 голос
/ 20 февраля 2020

Как я могу отправить python электронное письмо со встроенными изображениями для подписи? В настоящее время я использую ссылку для отображения изображений следующим образом:

<img border="0" src="https://website.com/logo.png" role="presentation" alt="logo mail icon" style="max-width: 300px; width: 300px; display: block;">

Но в Outlook изображения не загружаются, и пользователь должен нажать на «показать изображения», что разрушает электронную почту, так как я использовать его в деловых целях (это ссылка для подтверждения регистрации). Есть ли способ, как отобразить изображения встроенными и отправить их по электронной почте вместо ссылки?

Мой код пока:

from email.message import EmailMessage
import smtplib, ssl
import email.utils
import html2text

with open(html_template, 'r') as f:
        html_string = f.read()

plain_text = html2text.html2text(html_string)

msg               = EmailMessage()
msg['Subject']    = subject
msg['From']       = mail_address
msg['To']         = email_receiver
msg['Date']       = email.utils.formatdate()
msg.add_header('Content-Type','text/html')
msg.add_header('Content-Disposition', 'attachment', filename=file_attachment)
msg.set_content(plain_text)
msg.add_alternative(html_string.format(name=surname), subtype='html')

files = [file_attachment]
for file in files:
    with open(file, 'rb') as f:
        file_data = f.read()
        file_name = f.name
    msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename=file_name)

with smtplib.SMTP(smtp, port) as smtp:
    smtp.ehlo()
    smtp.starttls(context=ssl.create_default_context())
    smtp.ehlo()
    smtp.login(mail_address, mail_password)

try:
    smtp.send_message(msg)
    smtp.quit()

except Exception as e:
    print('ERROR')

Я не мог найти много подходов или решений. Я читал о кодировании изображений в base64, но я немного запутался.

Заранее спасибо!

1 Ответ

1 голос
/ 20 февраля 2020

Для отображения изображений в строке, вы должны предоставить данные изображения в самом электронном письме. Вы можете сделать это, используя закодированную в base64 строку ваших данных изображения. Вот пример:

<img alt="Website" width="16" height="16" style="border:none;" src="data:image/png;filename=web.png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAABsAAAAbAFcG/0uAAABPElEQVQ4jaVT3U3DMBD+mgUSJqAbNEyQbkDYgL43Ejz7pUjkPZIHoBvUjNAJcDcoG7QTBH3mMzoikEC1dPL5/r+782wcR9jTdv09AFKD72cPYBu821rpV4C26+cAAoCF0Z91l0Z2oHnw7shHYZwjAN6PcnySLIo/S5ds5fMZQJlL0YNuOlaiONGV8sHsdv1MvC8AbhR9AHCNn8+7grD8NwCrQg17Dd7F4F1QRpZ8JbwH8ZRVtKEtfehbqNvB5EvlB+9OABKJP06aSZ+GEEZlOUnRmHctWe7HQuNEfhe/YP3zyQGG4N2SpPdGfBScpZoLYzfkMbKkdrI8ddv1eYSV+LlZLMhnPx0jMW/+M8a0ym3Xs9S8wjRigDsFS5AA7IwurXTwrs49YDksj0RsCUYeo3irIyXYF3+my74zgA9tApBUsNxB3wAAAABJRU5ErkJggg==" />

Вы можете использовать онлайн-конвертеры , чтобы получить строку base64 или построить ее непосредственно в сценарии python:

import base64
encoded_string = base64.b64encode(open("image.png", "rb").read())

Имейте в виду, что встроенные изображения также могут быть заблокированы почтовым клиентом получателя, поэтому всегда предоставляйте правильные alt описания.

...