我在发送包含附件的电子邮件时遇到问题。我的电子邮件的内容类型似乎设置不正确,这导致附件无法正确附加。
这是我的电子邮件发送功能的片段:
python
复制代码
self.send( subject=self.subject 、recipients=self.recipients、html=""、text=""、attachments=self.attachments, )
函数
send
函数按如下方式处理附件:
python
复制代码
附件中的附件或 []: message.attachment(attachment)
attachment
方法确定附件是否内联:
python
复制代码
def attachment(self, attachment): if attachment.inline: self.make_related() else: self.make_mixed()
make_mixed
方法处理多部分内容类型:
python
复制代码
def make_mixed(self): if self.get_content_maintype() != "multipart": print("---inside------self.get_content_maintype()-", self.get_content_maintype()) self.set_content(MIMEMultipart("mixed")) elif self.get_content_subtype() != "mixed": print("---inside-----self.get_content_subtype()-", self.get_content_subtype()) mixed = MIMEMultipart("mixed") for part in self.get_payload(): mixed.attach(part) self.set_payload([mixed])
但是,当发送电子邮件时,内容类型为
message
,内容子类型为
rfc822
附件未按预期包含。
这里可能出了什么问题? 如何确保附件正确附加且内容类型设置正确?
问题出在
make_mixed
函数中。如果邮件已经是多部分邮件(例如,因为它已经有 HTML 或文本正文),正在创建一个新的多部分邮件,但没有递归地处理现有的部分。这会导致第一个多部分边界丢失,并且附件将无法被识别。
以下是经过更正的代码:
def make_mixed(self):
if self.get_content_maintype() != "multipart":
self.set_content(MIMEMultipart("mixed"))
else:
# 如果已经存在多部分消息,则将其封装到一个新的多部分/混合消息中
if self.get_content_subtype() != "mixed":
mixed = MIMEMultipart("mixed")
for part in self.get_payload():
mixed.attach(part)
self.set_payload([mixed])
解释:
- 检查现有内容类型: 此代码首先检查邮件是否已经是多部分邮件。
- 创建新消息或封装现有消息:
-
如果不是多部分邮件,它将像以前一样创建一个新的
multipart/mixed
消息。 -
如果已经是多部分邮件,它会创建一个新的
multipart/mixed
消息 并将现有的邮件内容附加到新消息中 。这样可以确保所有现有的部分(例如 HTML 正文)和新的附件都包含在最终的邮件中。
通过此更改,的附件应该正确附加,并且内容类型应该正确设置为
multipart/mixed
。