如何用Python提取Lotus Notes邮件数据后将其移动至指定文件夹?
用Python移动Lotus Notes邮件到指定文件夹的实现方案
我之前帮团队处理过类似需求,核心是借助Lotus Notes提供的COM接口(通过pywin32库调用)来操作邮件文档,完全适配你提到的「遍历目标文件夹提取详情后执行移动」的逻辑,下面是具体步骤和代码示例:
1. 前置准备
首先需要安装pywin32库,用于调用Windows COM接口:
pip install pywin32
同时确保本地已安装Lotus Notes客户端并正常配置(COM接口依赖Notes客户端的运行环境)。
2. 核心实现代码
import win32com.client def move_notes_emails(source_folder_name, target_folder_name, mail_db_path="mail\\your_mail.nsf"): # 初始化Notes会话 notes_session = win32com.client.Dispatch("Lotus.NotesSession") # 可选:提前初始化密码(避免手动输入),不建议硬编码,可改用环境变量或加密存储 # notes_session.Initialize("your_notes_password") # 连接邮件数据库(本地库留空第一个参数,服务器库填写服务器名称) db = notes_session.GetDatabase("", mail_db_path) if not db.IsOpen: db.Open() # 获取源文件夹视图 source_view = db.GetView(source_folder_name) if not source_view: raise ValueError(f"源文件夹 {source_folder_name} 不存在") # 检查并创建目标文件夹(如果不存在) target_view = db.GetView(target_folder_name) if not target_view: # 创建新文件夹视图 db.CreateView(target_folder_name, "SELECT @All") print(f"已创建目标文件夹:{target_folder_name}") # 遍历源文件夹中的邮件 current_doc = source_view.GetFirstDocument() while current_doc is not None: # -------------------------- # 这里插入你已实现的邮件详情提取逻辑 subject = current_doc.GetItemValue("Subject")[0] if current_doc.HasItem("Subject") else "无主题" sender = current_doc.GetItemValue("From")[0] if current_doc.HasItem("From") else "未知发件人" print(f"正在处理邮件:{subject} | 发件人:{sender}") # -------------------------- # 执行移动操作:先添加到目标文件夹,再从源文件夹移除 current_doc.PutInFolder(target_folder_name) current_doc.RemoveFromFolder(source_folder_name) # 处理下一封邮件,注意释放当前文档对象避免内存泄漏 next_doc = source_view.GetNextDocument(current_doc) current_doc.Close() current_doc = next_doc print("邮件移动操作完成") # 调用示例:移动收件箱(视图名($Inbox))的邮件到Processed文件夹 if __name__ == "__main__": move_notes_emails(source_folder_name="($Inbox)", target_folder_name="Processed")
3. 关键注意事项
- 文件夹名称区分:Notes的视图名(如收件箱的
($Inbox))和显示名称(Inbox)是不同的,代码中使用的是视图名,如果不确定可以在Notes客户端中右键文件夹→「查看属性」获取视图别名。 - 服务器邮件库适配:如果操作的是服务器上的邮件库,修改
GetDatabase的第一个参数为服务器名称,例如:db = notes_session.GetDatabase("your_notes_server", "mail\\user_mail.nsf")。 - 权限问题:确保当前用户对源文件夹和目标文件夹拥有编辑/删除权限,否则会触发权限错误。
- 内存管理:遍历邮件时必须调用
current_doc.Close()并切换到下一个文档,避免COM对象内存泄漏。
内容的提问来源于stack exchange,提问作者PPJN
相关产品推荐
相关产品推荐

