【问题标题】:Attach is not valid on a message with a non-multipart payload附加在具有非多部分有效负载的消息上无效
【发布时间】:2017-07-03 11:32:44
【问题描述】:

我目前正在编写一个应用程序,它需要将一封电子邮件加载到内存中,添加一个附件并将相同的电子邮件发送回给用户。这在过去运行良好,但我目前面临一个问题,即在Content-Transfer-Encodingbase64 中发送电子邮件。

我在网上找到了一个脚本,可以将内置的 Python 电子邮件消息对象转换为多部分,但是每当我这样做时,原始电子邮件不会以 base64 格式发送,现在每当我重新发送电子邮件时都会以纯文本形式显示。

有人知道我该如何解决吗?已添加(大部分已编辑)电子邮件以及我用于将电子邮件转换为多部分的代码。提前感谢您的帮助。

电子邮件

# Before conversion
From: ██████████ <█████@██████.com>
To: ████████ <███████@██████.com>
Subject: █████████
Date: Fri, ██ ███ 2017 00:18:17 +0200
Content-Language: nl-NL
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: base64
MIME-Version: 1.0

cmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRy
ZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJl
ZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZA0K


# After conversion
Content-Type: multipart/mixed; boundary="===============0883378942=="
MIME-Version: 1.0
From: ██████████ <█████@██████.com>
To: ████████ <███████@██████.com>
Subject: █████████
Date: Fri, ██ ███ 2017 00:18:17 +0200
Content-Language: nl-NL
Content-Transfer-Encoding: base64
MIME-Version: 1.0
--===============0883378942==
Content-Type: text/html; charset="utf-8"
cmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRy
ZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJl
ZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZHJlZGFjdGVkcmVkYWN0ZWRyZWRhY3RlZA0K
--===============0883378942==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="foo.txt"
Hello world
--===============0883378942==--

简单到多部分的代码

# If this method is not used on an email object
# A `TypeError` is raised with the message "Attach is not valid on a message with a non-multipart payload"

def mail_to_multipart(mail):
    """
    Convert an email to a multipart email
    :param mail: Email object
    :return: None
    """
    if mail.is_multipart():
        return mail

    mail_new = MIMEMultipart("mixed")
    headers = list((k, v) for (k, v) in mail.items() if k != "Content-Type")

    for k, v in headers:
        mail_new[k] = v

    for k, v in headers:
        del mail[k]

    mail_new.attach(mail)
    return mail_new

【问题讨论】:

    标签: python email


    【解决方案1】:

    显然该问题与 Content-Transfer-Encoding 标头未保留在旧的多部分块中有关,方法是更改​​以下行:

    headers = list((k, v) for (k, v) in mail.items() if k != "Content-Type")
    

    到这里:

    headers = list((k, v) for (k, v) in mail.items() if k not in ("Content-Type", "Content-Transfer-Encoding"))
    

    修复了问题

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 1970-01-01
      • 2013-08-21
      相关资源
      最近更新 更多