1

我在 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 文件夹中删除时:立即永久删除该邮件
4

1 回答 1

0

因此,当然,在发布问题后不久答案就会揭开……重要的细节是“当邮件被标记为已删除并从最后一个可见的 IMAP 文件夹中删除时”这一行。默认情况下,所有邮件都被选为可见的 IMAP 文件夹,因此邮件将始终在至少一个文件夹中可见。我相信有两种解决方案:

  1. 取消选择所有邮件作为可见 IMAP 文件夹。然后,“当消息被标记时...”选项的行为就像我最初在从标签中删除和删除时所期望的那样。如果选择了“归档邮件”,它会简单地删除标签并且它仍然在所有邮件中可见。如果选择“将邮件移至垃圾箱”,则将邮件移至垃圾箱标签。如果选择“永久永久删除”,则消息将被完全删除。

  2. 将所有默认文件夹选为可见 IMAP 文件夹和默认 IMAP 设置,而不是对当前标签中的邮件执行任何操作,您可以将邮件复制到“[Gmail]/垃圾箱”标签,然后选择垃圾标签并删除/删除那里的所有内容。这将永久删除该消息。

于 2012-07-21T12:32:45.670 回答