如何在Python3中使用mailbox.Maildir存储邮件并标记为已读(Seen)?
为Maildir中新添加的邮件标记为已读(Seen)
你可以通过两种方式实现这个需求,以下是具体方案:
方法一:利用Python mailbox库原生接口
mailbox.Maildir.add()方法会返回新添加邮件的唯一键,通过这个键可以获取邮件对象,直接修改其标记属性:
import mailbox mdir = mailbox.Maildir(maildir_path, create=True) mdir.lock() # 添加邮件并保存返回的键值 msg_key = mdir.add(message_string) # 通过键获取邮件对象 msg = mdir[msg_key] # 为邮件添加已读标记(S) msg.add_flag('S') # 保存修改 mdir.flush() mdir.unlock()
方法二:直接操作Maildir文件系统
Maildir的邮件文件名格式包含标记信息,例如1699999999.M12345P6789.server:2,S中,:2,后的字符就是标记位,S对应已读状态。可以添加邮件后找到对应文件重命名来添加标记:
import os import mailbox mdir = mailbox.Maildir(maildir_path, create=True) mdir.lock() msg_key = mdir.add(message_string) mdir.flush() # 定位邮件文件路径(先检查new目录,再检查cur目录) msg_path = os.path.join(maildir_path, 'new', msg_key) if not os.path.exists(msg_path): msg_path = os.path.join(maildir_path, 'cur', msg_key) # 重命名文件添加S标记 if os.path.exists(msg_path): if ':2,' in msg_path: base, flags = msg_path.rsplit(':2,', 1) if 'S' not in flags: new_path = f"{base}:2,{flags}S" os.rename(msg_path, new_path) else: # 新邮件无标记段,直接追加标记 new_path = f"{msg_path}:2,S" os.rename(msg_path, new_path) mdir.unlock()
注意:直接操作文件时必须保持Maildir处于锁定状态,避免并发操作引发文件冲突。
内容的提问来源于stack exchange,提问作者HippoMan
相关产品推荐
相关产品推荐

