我在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设置如下:
答案 0 :(得分:0)
当然,在发布问题后不久,答案就会立即泄露......重要的细节是“当消息被标记为已删除并从最后一个可见的IMAP文件夹中删除”时。默认情况下,“所有邮件”被选为可见的IMAP文件夹,因此该邮件将始终在至少一个文件夹中可见。我相信有两种解决方案:
取消选择所有邮件作为可见的IMAP文件夹。然后,“当标记消息时...”选项的行为与我从标签中删除和删除时最初预期的一样。如果选择“存档邮件”,它只会删除标签,并且在“所有邮件”中仍然可见。如果选择“将邮件移至废纸篓”,则邮件将移至废纸篓标签。如果选择“永久永久删除”,则会完全删除该消息。
将所有默认文件夹选为可见的IMAP文件夹和默认的IMAP设置,而不是对其当前标签中的邮件执行任何操作,您可以将邮件复制到“[Gmail] /垃圾“标签,然后选择垃圾标签并删除/清除那里的所有内容。这将永久删除该消息。