Python: отправляем электронные письма с изображениями

Чтобы отправлять электронные письма с изображениями, нужно использовать MimeMultipart:

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage

msg = MIMEMultipart('alternative')
msg['Subject'] = "subject"
msg['From'] = from_addr
msg['To'] = to_addr

part = MIMEImage(open('/path/to/image', 'rb').read())

s = smtplib.SMTP('localhost')
s.sendmail(from_addr, to_addr, msg.as_string())
s.quit()

Так мы создали электронное письмо с пустым телом и изображением.

Чтобы изображение было частью текста электронного письма, нужно написать текст HTML, который ссылается на это изображение:

import smtplib

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

msg = MIMEMultipart('alternative')
msg['Subject'] = "subject
msg['From'] = from_addr
msg['To'] = to_addr

text = MIMEText('<img src="cid:image1">', 'html')
msg.attach(text)

image = MIMEImage(open('/path/to/image', 'rb').read())

# Define the image's ID as referenced in the HTML body above
image.add_header('Content-ID', '<image1>')
msg.attach(image)

s = smtplib.SMTP('localhost')
s.sendmail(from_addr, to_addr, msg.as_string())
s.quit()

Хитрость в том, чтобы определить изображение с определенным идентификатором содержимого и сделать его единственным элементом в теле HTML: теперь у вас есть электронное письмо, содержащее изображение в качестве единственного содержимого тела, встроенного в него.

Ответить