【问题标题】:Sending email using charset encoding UTF-8 - Python + boto3使用字符集编码 UTF-8 发送电子邮件 - Python + boto3
【发布时间】:2017-07-04 15:43:33
【问题描述】:

我正在使用 S3 Lambda (python + boto3) + AWS SES 创建自动回复电子邮件。

从我的计算机发送电子邮件一切正常。我可以在电子邮件中看到正确的字符串。 “Olá, meu nome é Pedro”。如果我在 python 中打印到控制台,仍然在我的计算机中,字符串也可以。

当电子邮件从 lambda 触发时,我遇到了字符集编码/解码问题,例如“Olá,meu nome é Pedro”。 如果在 lambda s3 控制台中的 python 中,我打印我看到错误的字符串:“Olá¡, meu nome é Pedro”

我需要在邮件标题中设置另一个属性吗?

请看下面的源代码:

# -*- coding: utf-8 -*-
body = u"Olá, meu nome é Pedro"               
body = body.encode('UTF-8')
response = client.send_email(
    Source='teste@emporiodacerveja.com.br',
    Destination={
        'ToAddresses': [
        "pedrorjbr@gmail.com",
        ]
    },

    Message={
        'Subject': {
        'Data': 'Entre em Contato com Nossa Central de Atendimento',
        'Charset': 'UTF-8'
        },
        'Body': {
            'Text': {
                'Data': body ,
                'Charset': 'UTF-8'
            }
        }
    }
)

【问题讨论】:

  • 你用什么代码来打印字符串?您是否按照我在回答中的建议删除了body.encode('utf-8')?如果你运行 print(u'Ol\xe1, meu nome \xe9 Pedro') 会发生什么?
  • 打印(正文)。我已经删除了 body.encode('utf-8')。如果我运行 print(u'Ol\xe1, meu nome \xe9 Pedro') 它打印正确!
  • 现在可以了!!我做了:body = u'Ol\xe1, meu nome \xe9 Pedro' 然后使用 body.encode("utf-8")。我如何将我的字符串转换为这种格式以消除特殊字符。
  • 如果您正确指定了编码声明,即如果它显示coding: utf-8,那么您应该确保您的Python 源代码保存为utf-8。它与.encode('utf-8')没有任何关系(运行时的编码是独立的)。要查看 Unicode 字符串的文本表示,只需将其键入 REPL 或 print repr(u"Olá")(Python 2)或 print(ascii("Olá"))(在 Python 3 中)。如果您将 Unicode 字符串而不是字节作为 body 传递(如果您删除 .encode('utf-8')),它会继续工作吗?
  • 塞巴斯蒂安,我首先使用 latin-1 对其进行编码,然后使用 utf-8 对其进行编码,现在它可以工作了!!!谢谢!!

标签: python encoding utf-8 boto aws-lambda


【解决方案1】:

您看到的 ("Olá, meu nome é Pedro") 称为 mojibake。然后创建它,然后将一种编码中的文本解释为另一种(不兼容的)字符编码中的文本:

>>> print(u"Olá, meu nome é Pedro".encode('utf-8').decode('latin-1'))
Olá, meu nome é Pedro

为避免此类错误,请传递 Unicode 字符串,而不是字节(删除 .encode('utf-8'))。如果.send_email() 在此处不接受 Unicode,则可能表明存在错误。

【讨论】:

  • 所以我只是评论了这一行:'body = body.encode('UTF-8')' 但我仍然收到 Olá,meu nome é Pedro。我试图从字符集标题中删除“UTF-8”。
  • @PedroMagalhaes:您也可能发送/接收正确的数据,但可能显示不正确。如果您尝试显示:body = u"Olá, meu nome é Pedro",会发生什么?
  • 正在打印:Olá meu nome é Pedro。在我的电脑上打印正确:“Olá, meu nome é Pedro”
  • edit 你的问题并具体说明你在哪里看到Olá, meu nome é Pedro 以及打印它的代码 (create a minimal but complete example)
猜你喜欢
  • 2015-10-21
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多