Python Outlook自动化中win32com.client.CDispatch如何转可读字符串
问题原因
你拿到的win32com.client.CDispatch是Outlook COM组件的代理对象,直接打印对象时会调用其内置的__str__方法输出邮件主题,但是将对象存入列表后,打印列表触发的是对象的__repr__方法,因此会显示为<COMObject <unknown>>。你不需要转换整个COM对象为字符串,直接提取你需要的属性存储即可。
解决方法
不要把整个COM对象存入列表,遍历邮件时直接提取所需的字段(主题、发送时间、发件人等)转成Python原生的字符串、时间类型后再存储即可,后续处理和同步到Google Sheets都可以直接调用这些数据。
修正后代码示例
import win32com.client as client # 建议用EnsureDispatch代替Dispatch,提前生成类型库,属性访问更稳定 outlook = client.gencache.EnsureDispatch('Outlook.Application') namespace = outlook.GetNameSpace('MAPI') account = namespace.Folders['test_email555@hotmail.com'] inbox = account.Folders['Inbox'] def test(): unread_mail_list = [] for message in inbox.Items: if not message.Unread: continue # 异常捕获避免特殊格式邮件导致程序崩溃 try: mail_info = { "subject": str(message.Subject), "sent_time": message.SentOn.strftime("%m/%d/%Y, %H:%M:%S"), "sender": str(message.SenderName) } unread_mail_list.append(mail_info) except AttributeError: # 跳过不符合标准邮件格式的对象 continue # 列表内为可直接读取的结构化数据 print(unread_mail_list) return unread_mail_list test()
额外注意点
- COM对象存在生命周期,Outlook进程关闭或者对象被释放后,之前存储的COM对象引用就会失效,因此永远不要长期存储COM对象本身,只存提取后的原生类型数据
- 如果你需要提取更多邮件字段,可以直接访问COM对象的对应属性,常见属性还有
Body(邮件正文)、To(收件人)等
内容的提问来源于stack exchange,提问作者nehry
相关产品推荐
相关产品推荐

