Python 发送带有 Base64 编码图像作为附件的电子邮件

Python Send Email with Base64 encoded image as attachment

我正在尝试使用 python 和 sendmail 从 AWS 服务器发送电子邮件。 (SES 在我的地区不可用)。在命令行中使用 mail 发送基本电子邮件效果很好。现在我正尝试从 Python 执行此操作。我有下面的代码。似乎 运行 没有错误,但收件人电子邮件中没有邮件出现。请注意,我现阶段不发送附件。

邮件日志条目显示通过 python 和命令行发送的邮件。条目看起来非常相似,除了 "Message accepted for delivery" 出现在通过命令行发送的条目之后。

这里可能出了什么问题?我还可以在哪里寻找问题所在?有没有更简单的方法从 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())

所以我不确定哪里出了问题。但我走在正确的轨道上。我的最终功能如下所示。这需要一个 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())