我在 gmail 邮箱中有一堆邮件,标题略有损坏。我想使用 python 和 gmail 的 imap 接口自动处理和更新它们。我想下载消息,在本地修改标题,然后在服务器上将其删除,然后将固定消息添加回来。问题是,虽然该消息似乎已被正确删除,但在将其添加回旧的、错误的标头后仍然存在。使事情复杂化的是,如果我手动删除 gmail 中的消息,然后在 python 中使用相同的命令添加消息,则新的、好的标题会根据需要出现。
>>> import imaplib
>>> import email
>>> mail = imaplib.IMAP4_SSL('imap.gmail.com')
>>> mail.login('user@gmail.com', 'password')
>>> mail.select('label')
('OK', ['2'])
>>> mail.search(None, 'from', 'bad_string')
('OK', ['2'])
>>> ret,data = mail.fetch('2', '(RFC822)')
>>> msg = email.message_from_string(data1[0][1])
>>> msg['from']
'"Doe, John" <john.doe@bad_string.com>'
>>> new = msg['from'].replace('bad_string', 'good_string')
>>> msg.replace_header('From', new)
>>> msg['from']
'"Doe, John" <john.doe@good_string.com>'
>>> mail.store('2', '+FLAGS', '\\Deleted')
('OK', ['2 (FLAGS (\\Seen \\Deleted))'])
>>> mail.expunge()
('OK', ['2'])
>>> mail.search(None, 'from', 'bad_string')
('OK', [''])
>>> mail.select('label')
('OK', ['1'])
此时,python 似乎将电子邮件视为已删除。检查 gmail 的网络界面似乎也显示它已经消失了。标签中只有一封电子邮件,而不是开头的两封,搜索返回空。
>>> mail.append('label', None, '"20-Jul-2012 22:30:00 -0400"', str(msg))
('OK', ['[APPENDUID 24 13] (Success)'])
>>> mail.search(None, 'from', 'bad_string')
('OK', ['2'])
>>> mail.search(None, 'from', 'good_string')
('OK', [''])
但是该消息以原来的错误字符串返回。但是,如果不是以编程方式将其标记为已删除和删除,而是在 gmail 的 Web 界面中删除并清空垃圾箱,然后追加(仍然在与上面相同的 python 会话中,因此在上述输出之后立即运行)...
>>> mail.append('label', None, '"20-Jul-2012 22:30:00 -0400"', str(msg))
('OK', ['[APPENDUID 24 14] (Success)'])
>>> mail.search(None, 'from', 'bad_string')
('OK', [''])
>>> mail.search(None, 'from', 'good_string')
('OK', ['2'])
gmail中的IMAP设置如下:
- 当我在 IMAP 中将邮件标记为已删除时:自动删除关闭 - 等待客户端更新服务器。
- 当邮件被标记为已删除并从最后一个可见的 IMAP 文件夹中删除时:立即永久删除该邮件