使用Python win32com发送Outlook自动邮件报对象不支持方法错误
问题描述
通过Python调用win32com接口实现Outlook自动发邮件功能,运行代码时抛出pywintypes.com_error错误,Outlook返回提示 "The object does not support this method."。
原实现代码
import win32com.client import csv import csv with open('D:/Vishal Somal/Python/people.txt', 'r') as file: reader = csv.reader(file) distro = [row for row in reader] #print(distro) #for row in reader: #print(row) chunks = [distro[x:+100] for x in range (0, len(distro), 100)] outlook = win32com.client.Dispatch('outlook.application') for chunk in chunks: for email in chunk: message = outlook.CreateItem(0) message.To = email print(message.To) message.Subject= "Test mail" message.Body = "if you received attachment then please reply" attachment1 = "D:/Vishal Somal/Python/Autobo/output/ANT_Stock.xlsx" attachment2 = "D:/Vishal Somal/Python/Autobo/output/ANT_Transit.xlsx" message.Attachments.Add(attachment1) message.Attachments.Add(attachment2) message.Send()
报错信息
Traceback (most recent call last): File "<stdin>", line 4, in <module> File "C:\Users\vishals\AppData\Local\Programs\Python\Python310\lib\site-packages\win32com\client\dynamic.py", line 686, in __setattr__ self._oleobj_.Invoke(entry.dispid, 0, invoke_type, 0, value) pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'The object does not support this method.', None, 0, -2147352567), None)
问题原因
- 核心错误:
csv.reader逐行读取返回的结果是列表类型(哪怕每行只有一个邮箱地址,返回的也是[xxx@xx.com]格式的单元素列表),代码直接把列表赋值给要求字符串格式的message.To属性,Outlook无法识别参数类型,因此抛出方法不支持的错误。 - 代码笔误:分片逻辑
distro[x:+100]写法错误,正确写法应为distro[x:x+100],原写法会导致分组结果完全不符合预期。 - 冗余代码:重复导入了两次
csv模块。
修复方法
- 读取联系人文件时,提取每行的第一个元素(即字符串格式的邮箱地址)存入列表,同时跳过空行避免无效参数。
- 修正分片逻辑的笔误,保证每100个邮箱正确分组。
- 清理重复导入的冗余代码,可补充附件路径校验逻辑提前排查文件不存在的问题。
修复后可正常运行的代码:
import win32com.client import csv import os # 提前校验附件是否存在 attachment1 = "D:/Vishal Somal/Python/Autobo/output/ANT_Stock.xlsx" attachment2 = "D:/Vishal Somal/Python/Autobo/output/ANT_Transit.xlsx" for att_path in [attachment1, attachment2]: if not os.path.exists(att_path): raise FileNotFoundError(f"缺失附件:{att_path}") # 读取邮箱地址,转为字符串格式 distro = [] with open('D:/Vishal Somal/Python/people.txt', 'r') as file: reader = csv.reader(file) for row in reader: if row: distro.append(row[0].strip()) # 修正分片笔误 chunks = [distro[x:x+100] for x in range(0, len(distro), 100)] outlook = win32com.client.Dispatch('outlook.application') for chunk in chunks: for email_addr in chunk: mail = outlook.CreateItem(0) mail.To = email_addr print(f"发送邮件至:{email_addr}") mail.Subject = "Test mail" mail.Body = "if you received attachment then please reply" mail.Attachments.Add(attachment1) mail.Attachments.Add(attachment2) mail.Send()
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

