【发布时间】:2012-07-20 07:35:10
【问题描述】:
我的 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 文件夹中清除时:立即永久删除邮件
【问题讨论】:
-
检查 stackoverflow.com/questions/3988583/… 看看是否有帮助
-
我之前在搜索答案时确实看到了这个问题,并确保检查了我的高级 imap 设置(因为被提升为常规 gmail 的一部分,而不仅仅是实验室)。默认是在 imap 删除请求时归档消息。可以将其更改为移动到垃圾标签或“立即永久删除邮件”。我把它设置为后者。
-
Rightio 那么 - 我很茫然 - 但我敢打赌 gmail 有一些怪癖正在这样做