在“.eml”中编辑 header

Edit header in '.eml'

作为一个简短的总结,我在一个目录中有一堆“.eml”文件。我需要将这些电子邮件转发回 'email@example.com'。

问题是“.eml”文件 header 中的字段 'From' 包含另一个与 'email@example.com' 不匹配的电子邮件地址。

我已经搜索了一种方法来解析文件并更新 header 的内容。

起初,我使用了以下模块:

我能够发送 body 的内容,但是当我尝试发送附件时,我不得不从 base64 解码并将附件提取到一个文件夹中,然后发送所有内容。我不需要更改header的内容

我知道这是一个糟糕的举动,因为可能有一种方法可以发送经过编码的附件。

此外,由于 MSGraph 附件的文件大小限制为每个请求 4mb,我决定尝试更改为:

我也尝试过 mail.update() 和使用此模块的各种方法但没有成功。

我发现 post Python: Modify Values in eml file (email header) 建议使用解析器,replace_header 和 as_string 来自 email 但我是无法使其工作,因为我无法调用 replace_headeras_string:

from email.message import EmailMessage #contains as_string
from email.parser import HeaderParser
file = open(filename, 'r')
h = HeaderParser().parse(file)

#stuck here

我知道这可能不仅仅是一个问题,主要目标是将 eml 文件发送回特定地址,从 'email@example.com'。

通过使用 eml_parser 解析电子邮件解决了该问题。我创建了自己的 header,附上 HTML body 内容和附件。

from passlib.context import CryptContext
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header

def send(self, dst):
    try:
        self.m = MIMEMultipart()
        self.m['From'] = self.client_addr
        self.m['To'] = dst
        # Must have Header() in python 3.x otherwise you get UnicodeError
        self.m['Subject'] = Header(self.get_subject(),  'utf-8')

        #Attach HTML body with the right encoding
        self.m.attach(MIMEText(self.get_body().encode('utf-8'), 'html', 'utf-8'))

        # Extract attachments to self.attachment_path
        self.extract_attachments(self.parsed_eml)

        server = smtplib.SMTP('smtp.office365.com', 587)
        server.ehlo()
        server.starttls()

        # Compare hash in config.json file
        if self.pwd_context.verify(self.client_plain_secret, self.client_secret):

            server.login(self.client_addr, self.client_plain_secret)
            server.sendmail(self.m['From'], self.m['To'], self.m.as_string())
            server.quit()
    except:
        print("An error occured trying to send the email.")
    finally:
        self.clean_attachments()