gpt4 book ai didi

python - 使用python 3.7,如何确保在正确修改正文内容后正确重新生成解析的电子邮件而不会丢失任何内容?

转载 作者:行者123 更新时间:2023-12-04 07:31:16 26 4
gpt4 key购买 nike

我想解析(序列化)多部分电子邮件(或带有多个电子邮件附件的任何和所有类型,具有内嵌图像、附件等),使用一些额外信息设置其正文内容类型,并在发送之前重新生成电子邮件。如何用最简单的python代码实现这一点?使用 python 3.6 版。
现在我正在使用 email.walk() 并获取第一个可用的 text/plain、text/html 并假设它是覆盖邮件的正文,通过 walk() 进一步递归解析邮件的不同部分......这看起来很麻烦。有什么简单的方法吗?
添加我正在尝试的代码片段:
#!/usr/bin/python3
"""
用法:
从命令行: cat mail | python warning_mail_stdout.py
此脚本从标准输入读取邮件并在邮件正文中附加“警告”
并将附加的邮件打印到标准输出
"""

import imaplib
import email
import logging
import smtplib
import re

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# from subprocess import Popen, PIPE
import sys
import email, os

title = ''
logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
'%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

from email.policy import default

from email import policy
from email.parser import BytesParser
from email.mime.message import MIMEMessage
parser = email.parser.Parser()

def login():
# Read message from Std Input
mail = BytesParser(policy=policy.default).parse(open('1email_sample.eml','rb'))
if mail is None:
print("No mail in stdin ...")
else:
#mail is not None:
mbody = ''
mhtml = ''
text_body = ''
mail_charset = None
html_body = ''
mail_from = email.utils.parseaddr(mail['From'])[1]
mwarn = ''
new_message = ''
attached_bool = False
mail_attached_bool = False
h=p=related_body=None
h_body=plain_body = None
new_message1 = email.message.EmailMessage()#policy=default)
warning_txt = "[Caution: This message came from an external domain.]"
new_message = email.message.EmailMessage()

# copying header values
for header_val in mail:
parser.parsestr(header_val)
new_message[header_val] = mail[header_val]
print(new_message[header_val])

mailbody = mail.get_body(preferencelist=('related', 'html', 'plain'))

new_message1.attach(mailbody)

new_message.set_type('multipart/related')
new_message.attach(new_message1)

for p in mail.iter_attachments():
if p.is_attachment():
new_message.attach(p)

recipients = [
"sha73@yahoo.com",
]

# s ---is the smtp server to send out mail
#'''
try:
print(new_message.get_content_type(), 'vvvvv sent')
s.sendmail(mail_from, recipients,bytes(new_message))
except UnicodeEncodeError:
s.sendmail(mail_from, recipients,
new_message.as_string().encode("utf-8"))
#'''
s.close()

if __name__ == "__main__":
login()

最佳答案

如果你只是想改变 body 部位的某些东西,你甚至不需要 walk方法。 get_body可以为您完成这项工作,尽管它可能会对某些不合规的消息产生意想不到的结果,但它可能比您或我能想到的任何东西都可靠得多。
所以你的程序流程应该是

  • 使用 parser构建树的对象
  • 可能检查 defects属性以确保消息适合您
  • 调用 get_body在你的树上
  • get_body 返回的 mime 部分执行您需要的操作
  • 使用 generator序列化树的对象

  • 我在这里添加一些例子。不幸的是,文档还不清楚,所以也许这会有所帮助:
    >>> from email.message import EmailMessage
    >>> import email.policy
    >>> from email import message_from_binary_file

    >>> msgin = open('1email_sample.eml', 'rb')
    >>> msg = message_from_binary_file(msgin, policy=email.policy.default)
    >>> for part in msg.walk():
    print(part.get_content_type())
    multipart/related
    multipart/alternative
    text/plain
    text/html
    image/png
    image/png
    image/png
    image/png
    image/png
    image/png
    image/png

    >>> body = msg.get_body('plain') ##get the plain text, not 'related'
    >>> btext = body.get_payload()
    >>> type(btext)
    <class 'str'>
    >>> len(btext)
    6926
    >>> body.set_payload('this is my message' + btext)
    >>> len(body.get_payload())
    6944

    >>> body2=msg.get_body('html') ##same with html
    >>> bhtml=body2.get_payload()
    >>> type(bhtml)
    <class 'str'>

    关于python - 使用python 3.7,如何确保在正确修改正文内容后正确重新生成解析的电子邮件而不会丢失任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67919536/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com