parsed_email = email.message_from_bytes(decoded_email.encode('utf-8')) 怎么获取正文、附件
时间: 2024-09-11 22:19:15 浏览: 72
`email.message_from_bytes(decoded_email.encode('utf-8'))` 这行代码是使用 Python 的 email 库来解析邮件内容的。要从解析得到的邮件对象 `parsed_email` 中获取正文和附件,你需要使用该库提供的方法来遍历邮件的各个部分(parts)。
以下是如何获取邮件正文和附件的方法:
1. 获取邮件正文:
- 首先,判断邮件是否包含多个部分,如果是,正文可能位于某个特定的部分(通常是第一个部分)。
- 你可以遍历邮件的每个部分,检查 `Content-Type` 头部信息来判断是否为正文。通常正文的 `Content-Type` 是 `text/plain` 或 `text/html`。
2. 获取邮件附件:
- 同样地,遍历邮件的每个部分,检查 `Content-Disposition` 头部信息。
- 如果 `Content-Disposition` 是 `attachment`,那么这个部分就是一个附件。
- 附件通常需要将其内容保存到文件中,可以通过 `get_payload(decode=True)` 来获取附件的内容(解码后的字节串)。
具体代码示例:
```python
import email
from email.policy import default
# 假设 decoded_email 是邮件原始内容的解码版本
parsed_email = email.message_from_bytes(decoded_email.encode('utf-8'))
# 获取邮件正文
def get_body(message):
if message.is_multipart():
# 如果是多部分邮件,遍历各个部分
for part in message.walk():
if part.get_content_type() in ['text/plain', 'text/html']:
return part.get_payload(decode=True).decode(part.get_content_charset())
else:
# 如果不是多部分邮件,直接返回内容
return message.get_payload(decode=True).decode(message.get_content_charset())
body = get_body(parsed_email)
# 获取邮件附件
def get_attachments(message):
attachments = []
for part in message.walk():
if part.get_content_disposition() == 'attachment':
filename = part.get_filename()
if filename:
content = part.get_payload(decode=True)
attachments.append((filename, content))
else:
# 有时候附件可能没有文件名
content = part.get_payload(decode=True)
attachments.append(("attachment", content))
return attachments
attachments = get_attachments(parsed_email)
```
阅读全文