如何使用 AWS SES 将纯文本邮件发送到 gmail

How to send a plain text mail using AWS SES to gmail

我有一个带填充字符串的格式化文件,当我将它发送到我在 gmail 中的帐户时,文件中的所有填充都被删除并且邮件格式不正确,因为 gmail 不保留原始格式。 如何避免这种情况?

我试过这段代码,但它无法使用原始电子邮件:

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email import encoders

fileHandler = "logg.log"
session = Session(profile_name="test", region_name="eu-west-1")
ses = session.client('ses')
today = datetime.date.today() - datetime.timedelta(days=1)
for file in sorted(glob.glob(fileHandler + '*'), key=os.path.getmtime):
    body = MIMEText(open(file, 'r').read())
    body['Subject']="aws-log"
    response = ses.send_raw_email(
                            Source = "smymail@.com",
                            Destinations=[
                                    "smymail@fluksaqua.com",
                                ],
                            RawMessage={
                                'Data': body.as_string()
                                    },)

即使使用原始邮件,邮件也不是纯文本格式。

这是我发送到 gmail 的文件:

这是我收到的邮件:

你不应该需要 send_raw_email。如果您看一下 send_email 方法,它实际上需要 TextHtml 正文参数:

Message={
    'Subject': {
        'Data': 'string',
        'Charset': 'string'
    },
    'Body': {
        'Text': {
            'Data': 'string',
            'Charset': 'string'
        },
        'Html': {
            'Data': 'string',
            'Charset': 'string'
        }
    }
}

如果您只提供一个文本正文,应该可以找到您要查找的 plain-text 电子邮件。

就 gmail 纯文本格式而言,他们将根据 RFC 2822 第 2.1.1 节以 78 个字符换行: https://www.rfc-editor.org/rfc/rfc2822

这是纯文本电子邮件的公认标准。您可以自己将消息格式化为纯文本,但必须遵守每行 78 个字符的限制以避免重新格式化。

仔细查看您收到的电子邮件。

复制正文并将其粘贴到文本编辑器中。您应该会发现 space 实际上是完全正确的。

我认为这里的问题与 SES 无关。

问题是 Gmail 的 UI 以比例字体显示纯文本电子邮件,而不是 fixed-width 字体。请注意 IIIIII 占用的水平 space 比 WWWWWW 少,即使字符数相同。这自然会破坏 spaces 的格式。反之...

# IIIIII - code blocks on SO
# WWWWWW - use a fixed width typeface
# even though the rest of the post doesn't
# so I and W are the same width here but not above

如果您想控制显示,您需要使用 HTML 并指定 fixed-width 字体。

我的问题终于解决了,这家伙<pre></pre>救了我!!方法如下:

body = '<pre width="300" style="font-size: 14px; max-width: 100%;">' + body + '</pre>'
            subject = objet+" %s" % (today.strftime("%Y-%m-%d"))
            for email in emailarg.split(','):
                response = ses.send_email(
                            Source = email,
                            Destination={
                                'ToAddresses': [
                                    email,
                                ],
                            },
                            Message={
                                'Subject': {
                                    'Data': subject
                                },
                                'Body': {
                                    'Html': {
                                        'Data': body
                                    },
                                }
                            }
                        )