【发布时间】:2021-11-27 21:04:07
【问题描述】:
我正在使用以下方法将电子邮件移动到子文件夹中,但是在某些情况下这会崩溃,因为我被告知某些电子邮件没有 UID。有没有其他方法可以在不使用 UID 的情况下将电子邮件移动到子文件夹中?
def parse_uid(self, data):
match = pattern_uid.match(data)
return match.group('uid')
在哪里
pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)')
这样称呼:
resp, data = self.m.fetch(str(self.i), "(UID)")
msg_uid = self.parse_uid(data[0].decode())
self.i 是给定电子邮件的整数 id。
目的是使用 msg_uid 复制消息,如下所示:
result = self.m.uid('COPY', msg_uid, 'Inbox/VALORISATIONS/KGI')
print("Result:", result[0])
if result[0] == 'OK':
mov, data = self.m.uid('STORE', msg_uid, '+FLAGS', '(\Deleted)')
self.m.expunge()
print("Mail moved to subfolder")
这为某些供应商(Allianz、Metzler、KGI、Mitsubishi)提供了以下错误消息:
Traceback (most recent call last):
File "AutomatePDP_IMAP.py", line 3283, in <module>
GestionBoitePDP.get_mail_deal_with_it(skipgetpasswords = None)
File "AutomatePDP_IMAP.py", line 3264, in get_mail_deal_with_it
msg_uid = self.parse_uid(data[0].decode())
File "AutomatePDP_IMAP.py", line 111, in parse_uid
return match.group('uid')
AttributeError: 'NoneType' object has no attribute 'group'
在 parse_uid 函数中添加如下条件:
def parse_uid(self, data):
match = pattern_uid.match(data)
if match is not None:
return match.group('uid')
else:
return "UID NA"
然后使用:
if msg_uid != "UID NA":
result = self.m.uid('COPY', msg_uid,'Inbox/VALORISATIONS/ALAHLI')
print("Result:", result[0])
if result[0] == 'OK':
mov, data = self.m.uid('STORE', msg_uid, '+FLAGS', '(\Deleted)')
self.m.expunge()
print("Mail moved to subfolder")
我听从 Max 的建议,从循环中删除了 self.m.expunge(),并在循环之后添加了它。
问题解决了。
【问题讨论】:
-
所有消息都有一个
UID。如果你没有得到,那是因为你请求了一个不存在的消息序列号。那是怎么发生的?您移动(并删除了!)一条消息,并删除了它,导致您所有的 MSN 转移!不要在循环期间调用 expunge!或者在任何地方使用 UID。 -
UID 可能在不同的响应位置,尝试可以使用它的库:github.com/ikvk/imap_tools
-
@Max 是的,从循环中删除删除并在之后添加它解决了问题非常感谢。
标签: python python-3.x email imap imaplib