【问题标题】:Python IMAP4 Don't Mark messages as readPython IMAP4不要将消息标记为已读
【发布时间】:2017-10-03 03:48:16
【问题描述】:

我有一个 Python 脚本来移动带有特定主题的消息。这些消息被标记为已读,我不希望它们被标记为已读。脚本的哪一部分将它们标记为已读,如何使其不标记为已读?

另外,我不太确定我在做什么,所以如果有任何冗余代码或错误,请告诉我。

import getpass
from Crypto.Hash import MD5
import sys
import imaplib
import email
import re

password = getpass.getpass()
match = "redacted"

username  = "redacted"
dest = "000"
pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)')

def md5(message):
    hash = MD5.new()
    hash.update(message)
    return hash.hexdigest()

md5 = md5(password)

if md5 == match:
    pass
else:
    print "Mismatch"
    sys.exit()

M = imaplib.IMAP4_SSL("mail.redacted.com", 993)
M.login(username, password)
M.select()
typ, data = M.search(None, 'ALL')
M.select('Inbox')

msgs = M.search(None, 'ALL')[1]
num_messages = len(msgs[0].split())
num_messages += 1


def parse_uid(data):
    match = pattern_uid.match(data)
    return match.group('uid')

for i in range(1, num_messages):
    try:
        typ, msg_data = M.fetch(str(i), '(RFC822)')
    except:
        pass
    for response_part in msg_data:
        if isinstance(response_part, tuple):
            UID = M.fetch(str(i),'UID')
            UID = UID[1]
            try:
                UID = parse_uid(UID[0])
            except:
                pass
            msg = email.message_from_string(response_part[1])
            for header in [ 'subject'  ]:
                if msg[header] == "Redacted":
                    result = M.uid('COPY', UID, dest)
                    if result[0] == 'OK':
                        mov, data = M.uid('STORE', UID, '+FLAGS', '(\Deleted)')
                        M.expunge()


M.close()
M.logout()

【问题讨论】:

    标签: python imap


    【解决方案1】:

    typ, msg_data = M.fetch(str(i), '(RFC822)')

    获取邮件正文会将其标记为已读。你会想要使用BODY.PEEK[]。

    不过,我不知道您为什么要获取整条消息只是为了复制它。你为什么不只是获取标题?使用BODY.PEEK[HEADERS]。

    【讨论】:

    • 我在哪里获取消息正文?在 msg_data, (RFC822)')?
    • 我应该将 (RFC822)') 更改为 BODY.PEEK[HEADERS]?
    • UID = parse_uid(UID[0])之后好像被标记为已读
    • 是的,您应该将(RFC822) 更改为BODY.PEEK[HEADERS])。 RFC822 等价于BODY[],定义为设置读取标志。 .PEEK 是使其未设置为读取的修饰符。
    • 是的,这就是 STORE 命令的用途。存储 \Seen 来代替 \Deleted 或作为 \Deleted 的补充。
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 2018-01-05
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2022-08-21
    • 2019-05-05
    相关资源
    最近更新 更多