Python IMAP4 Don';t将邮件标记为已读

Python IMAP4 Don';t将邮件标记为已读,python,imap,Python,Imap,我有一个Python脚本来移动带有特定主题的消息。邮件被标记为已读,我不希望它们被标记为已读。脚本的哪个部分将它们标记为已读,如何使其不标记为已读 另外,我还不太确定我在做什么,所以如果有任何冗余代码或错误,请告诉我 import getpass from Crypto.Hash import MD5 import sys import imaplib import email import re password = getpass.getpass() match = "redacted"

我有一个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()
导入getpass
从Crypto.Hash导入MD5
导入系统
导入imaplib
导入电子邮件
进口稀土
password=getpass.getpass()
match=“已编辑”
username=“已编辑”
dest=“000”
模式\u uid=re.compile('\d+\(uid(?P\d+)\))
def md5(消息):
hash=MD5.new()
hash.update(消息)
返回hash.hexdigest()
md5=md5(密码)
如果md5==匹配:
通过
其他:
打印“不匹配”
sys.exit()
M=imaplib.IMAP4_SSL(“mail.redact.com”,993)
M.login(用户名、密码)
M.选择()
类型,数据=M.search(无,“全部”)
M.select(“收件箱”)
msgs=M.search(无,'全部')[1]
num_messages=len(msgs[0].split())
num_消息+=1
def解析uid(数据):
匹配=模式匹配(数据)
返回match.group('uid')
对于范围内的i(1,num_消息):
尝试:
类型,msg_data=M.fetch(str(i),'(RFC822)'
除:
通过
对于msg_数据中的响应_部分:
如果isinstance(响应部分,元组):
UID=M.fetch(str(i),'UID')
UID=UID[1]
尝试:
UID=parse\u UID(UID[0])
除:
通过
msg=email.message\u from\u字符串(响应\u部分[1])
对于['主题']中的标题:
如果消息[标题]=“修订”:
结果=M.uid('COPY',uid,dest)
如果结果[0]=“确定”:
mov,data=M.uid('STORE',uid',FLAGS','(\Deleted'))
M.删除()
M.close()
M.注销()

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

获取消息正文会将其标记为已读。您需要使用
BODY.PEEK[]


尽管如此,我不知道你为什么要获取整个消息只是为了复制它。你为什么不直接取一下标题呢?使用
BODY.PEEK[HEADERS]

在哪里获取消息正文?在msg_data(RFC822)中?我是否应该将(RFC822)更改为BODY.PEEK[HEADERS]?它似乎在UID=parse_UID(UID[0])之后标记为read是的,您应该将
(RFC822)
更改为
BODY.PEEK[HEADERS])
RFC822
相当于
BODY[]
,其定义用于设置读取标志
.PEEK
是一个修饰符,使其不被设置为read。是的,这就是STORE命令的作用。存储\已看到,而不是,或除了\已删除。