Python IMAP4 Don';t将邮件标记为已读
我有一个Python脚本来移动带有特定主题的消息。邮件被标记为已读,我不希望它们被标记为已读。脚本的哪个部分将它们标记为已读,如何使其不标记为已读 另外,我还不太确定我在做什么,所以如果有任何冗余代码或错误,请告诉我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"
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命令的作用。存储\已看到,而不是,或除了\已删除。