Отправить по электронной почте Python с изображением в кодировке Base64 в качестве вложения

Я пытаюсь отправить электронную почту с сервера AWS, используя python и sendmail. (SES не доступен в моем регионе). Использование почты в командной строке для отправки обычной электронной почты работает нормально. Сейчас я пытаюсь сделать это из Python. У меня есть код ниже. Кажется, что он работает без ошибок, но в письме получателя не появляется никакая почта. Обратите внимание, что я не отправляю вложения на этом этапе.

Записи почтового журнала появляются для почты, отправленной через python и через командную строку. Записи выглядят очень похоже, за исключением того, что "Сообщение принято к доставке" появляется после записей, отправленных через командную строку

Что может быть не так? Где еще я мог бы посмотреть, что происходит не так? Есть ли более простой способ отправки электронной почты из Python / Linux?

import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from subprocess import Popen, PIPE

def send_mail(send_from, send_to, subject, text, files=None,
          server="127.0.0.1"):

msg = MIMEMultipart()
#msg['From'] = send_from
msg['To'] = send_to
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject

msg.attach(MIMEText(text))

# files should be a dictionary of filenames & base64 content 
for fname in files or {}:
    part = MIMEBase('image', 'jpeg')
    part.set_payload(files[fname])
    part.add_header('Content-Transfer-Encoding', 'base64')
    part['Content-Disposition'] = 'attachment; filename="%s"' % fname
    msg.attach(part)

print (msg.as_string())
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())

2 ответа

Решение

Поэтому я не уверен, где что-то пошло не так. Но я был на правильном пути. Моя последняя функция заключается в следующем ниже. Это занимает закодированный в base64 список изображений, отправленных из моего клиентского приложения в формате JSON. Каждое изображение находится в своем собственном объекте словаря с {filename: base64Data}.

def send_mail(send_from, send_to, subject, text, files=None):
msg = MIMEMultipart()
msg["From"] = send_from
msg["To"] = send_to
msg["Subject"] = subject
msg.attach(MIMEText(text))

# files should be a dictionary of filenames & base64 content 
for file in files or []:
    for key in file:
        part = MIMEBase('image', 'jpeg')
        part.set_payload(file[key])
        part.add_header('Content-Transfer-Encoding', 'base64')
        part['Content-Disposition'] = 'attachment; filename="%s"' % key
        msg.attach(part)

# send the email by using send mail
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())

В Gmail больше не поддерживается изображение base64, оно также включает Outlook. В настоящее время только почта Apple поддерживает base64.

Другой :

Изображение в кодировке Base64 не отображается в Gmail

Другие вопросы по тегам