You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 13:57:37