在“.eml”中编辑 header
Edit header in '.eml'
作为一个简短的总结,我在一个目录中有一堆“.eml”文件。我需要将这些电子邮件转发回 'email@example.com'。
问题是“.eml”文件 header 中的字段 'From' 包含另一个与 'email@example.com' 不匹配的电子邮件地址。
我已经搜索了一种方法来解析文件并更新 header 的内容。
起初,我使用了以下模块:
- eml.parser解析文件。
- pyo365 连接到 MSGraph API
我能够发送 body 的内容,但是当我尝试发送附件时,我不得不从 base64 解码并将附件提取到一个文件夹中,然后发送所有内容。我不需要更改header的内容。
我知道这是一个糟糕的举动,因为可能有一种方法可以发送经过编码的附件。
此外,由于 MSGraph 附件的文件大小限制为每个请求 4mb,我决定尝试更改为:
- smtplib 发送邮件
我尝试了 mail-parser 但没有成功更新内容中的任何内容,因为更新的值不是永久性的,例如:
邮件 = mailparser.parse_from_bytes(byte_mail)
mail.from_ = [('My Name' , 'email@example.com')]
print(mail.headers) #这将打印原始的 header
我也尝试过 mail.update() 和使用此模块的各种方法但没有成功。
我发现 post Python: Modify Values in eml file (email header) 建议使用解析器,replace_header 和 as_string 来自 email 但我是无法使其工作,因为我无法调用 replace_header 和 as_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()
作为一个简短的总结,我在一个目录中有一堆“.eml”文件。我需要将这些电子邮件转发回 'email@example.com'。
问题是“.eml”文件 header 中的字段 'From' 包含另一个与 'email@example.com' 不匹配的电子邮件地址。
我已经搜索了一种方法来解析文件并更新 header 的内容。
起初,我使用了以下模块:
- eml.parser解析文件。
- pyo365 连接到 MSGraph API
我能够发送 body 的内容,但是当我尝试发送附件时,我不得不从 base64 解码并将附件提取到一个文件夹中,然后发送所有内容。我不需要更改header的内容。
我知道这是一个糟糕的举动,因为可能有一种方法可以发送经过编码的附件。
此外,由于 MSGraph 附件的文件大小限制为每个请求 4mb,我决定尝试更改为:
- smtplib 发送邮件
我尝试了 mail-parser 但没有成功更新内容中的任何内容,因为更新的值不是永久性的,例如:
邮件 = mailparser.parse_from_bytes(byte_mail) mail.from_ = [('My Name' , 'email@example.com')] print(mail.headers) #这将打印原始的 header
我也尝试过 mail.update() 和使用此模块的各种方法但没有成功。
我发现 post Python: Modify Values in eml file (email header) 建议使用解析器,replace_header 和 as_string 来自 email 但我是无法使其工作,因为我无法调用 replace_header 和 as_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()