使用Python(win32com)转发Outlook邮件时原邮件头缺失的解决方案求助
解决Outlook转发邮件丢失原邮件头的问题
我明白你的问题了——你用win32com操作Outlook转发指定邮件时,自定义了正文内容,但原邮件的From、To、Subject这些头信息都没显示出来对吧?这是因为你直接覆盖了转发邮件默认的Body内容,而Outlook默认的转发邮件Body里其实已经包含了这些原邮件头信息。
下面给你两种可行的解决方案:
方法1:保留默认转发的Body内容,在前面添加自定义文本
message.Forward()生成的新邮件,默认已经把原邮件头和正文都包含在Body里了。你只需要把自定义文本加在这个默认Body的前面,而不是替换掉它:
# 替换原来的Body赋值代码 NewMsg.Body = "today is a good day\n\n" + NewMsg.Body
这样既保留了你的自定义文本,也不会丢失原邮件的头信息和正文。
方法2:手动构建原邮件头(适合需要自定义头格式的场景)
如果你想自己控制原邮件头的显示格式,可以手动拼接From、To、Subject等信息,再和自定义文本、原正文组合:
# 手动拼接原邮件头 original_email_header = f"""--- 原邮件信息 --- From: {message.SenderName} To: {message.To} Subject: {message.Subject} ----------------- """ # 组合所有内容 NewMsg.Body = "today is a good day\n\n" + original_email_header + message.Body
修改后的完整代码
这里把方法1整合到你的原代码里,供你参考:
import win32com.client import time import datetime as dt from os import path if not path.exists('testfile_cut.txt'): f = open("testfile_cut.txt", "w") f.write("07/17/20 00:00:00") f.close() date_time = dt.datetime.now() f = open("testfile_cut.txt", "r") a = f.read() a = dt.datetime.strptime(a, '%m/%d/%y %H:%M:%S') today = dt.date.today() lastDayDateTime = date_time - (date_time - a) # 简化原计算逻辑 outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") inbox = outlook.GetDefaultFolder(6) messages = inbox.Items sender = "john smith" sender = sender.lower() messages.Sort("[ReceivedTime]", True) lastDayMessages = messages.Restrict("[ReceivedTime] >= '" + lastDayDateTime.strftime('%m/%d/%Y %H:%M %p')+"'") f = open("testfile_cut.txt","r") a = f.read() print(a) b = lastDayMessages[0].ReceivedTime b = dt.datetime.strftime(b, '%m/%d/%y %H:%M:%S') print(b) if (b!=a): for message in lastDayMessages: if sender in message.SenderName.lower(): if message.Subject.startswith("ABC"): print (message.ReceivedTime) print (message.SenderName.encode('ascii', 'ignore')) print (message.Subject.encode('ascii', 'ignore')) print (message.Body.encode('ascii', 'ignore')) NewMsg = message.Forward() NewMsg.To = "Roger Smith" # 关键修改:保留默认转发的Body,添加自定义文本在前面 NewMsg.Body = "today is a good day\n\n" + NewMsg.Body NewMsg.Subject = "Activity as of - " + today.strftime("%m/%d/%y") NewMsg.Send() f.close() fl = open("testfile_cut.txt","w") fl.write(b) fl.close() print ("Finished")
另外提醒一下:你代码里用了encode('ascii', 'ignore'),如果邮件里有非ASCII字符(比如中文、特殊符号)会被忽略,建议根据实际情况换成utf-8编码或者直接输出原始字符串哦。
内容的提问来源于stack exchange,提问作者funkymunkypython
相关产品推荐
相关产品推荐

