Отправка HTML-письма с изображениями с помощью email.mime python

Рейтинг: 1Ответов: 1Опубликовано: 09.02.2023

Дано: HTML - файл с привязанными к нему картинками, которые лежат в той же директории.

Надо: отправить письмо так, чтобы оно отображалось у получателя как HTML-страница с картинками на своём месте.

Что я пытался делать: У меня есть код python, который отправляет HTML, но у получателя вместо картинок просто прямоугольники с красными крестиками (нет картинок).

Вот мой код:

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.header import Header


def mail_sender(recip, subj, text):
    DEFAULT_SMTP_SERVER = '.................'

    SENDER = '...................'
    RECIPIENT = recip
    RECIPIENT2 = '........................'

    msg = MIMEMultipart('alternative')
    msg['From'] = SENDER
    msg['To'] = RECIPIENT
    msg['Bcc'] = RECIPIENT2
    sub_hed = subj
    msg['Subject'] = Header(sub_hed, 'utf-8').encode()
    msg.attach(MIMEText(text, 'plain'))
    msg.attach(MIMEText(text, 'html'))

    message = msg.as_string()
    server = smtplib.SMTP(DEFAULT_SMTP_SERVER)
    server.sendmail(SENDER, [RECIPIENT], message)
    server.sendmail(SENDER, [RECIPIENT2], message)
    server.quit()


f = open('TestHTML.html', 'r')
result = f.read()
mail_sender('example@mail.ru', 'тест', result)

ВОПРОС: Как сделать так, чтобы получатель видел полноценный HTML-шаблон с картинками? Может быть, подход неправильный или что-то надо изменить в коде?

Ответы

▲ 0

Решено синтезом строки base64 из картинки:

import base64

with open('images/image009.jpg', 'rb') as fp:
    binary_fc = fp.read()
    fp.close()
    base64_utf8_str = base64.b64encode(binary_fc).decode('utf-8')

ext = 'images/image009.jpg'.split('.')[-1]
dataurl = f'data:image/{ext};base64,{base64_utf8_str}'
print(dataurl)

С последующим вмонтированием в HTML

<img src="data:image/jpg;base64,/9j/4AA...../9k=" width="180" height="50" alt="base64 test">

Теперь картинка интегрирована в код монолитно.