Попытка удалить несколько сообщений электронной почты в папке вне папки входящих сообщений с помощью Python и Exchangelib
Я пытаюсь удалить все сообщения электронной почты в папке за пределами моего account.inbox с Python 3 и exchangelib.
testFolder = account.root / 'Top of Information Store' / 'Test'
emails = testFolder.all().order_by('-datetime_received')
for email in emails:
email.delete()
# FWIW
#print(email.subject)
#email.move(to_another_folder)
#both work fine.
Выше только печатает все электронные письма и их свойства
Я также попробовал:
items=[]
testFolder = account.root / 'Top of Information Store' / 'Test'
emails = testFolder.all().order_by('-datetime_received')
for email in emails:
items.append(Message(folder=testFolder))
items.save()
items.delete()
Вышесказанное зависает и выдает ошибку памяти:
File "C:\Python36-32\lib\site-packages\exchangelib\services.py", line 89, in _
get_elements
response = self._get_response_xml(payload=payload)
File "C:\Python36-32\lib\site-packages\exchangelib\services.py", line 171, in
_get_response_xml
res = self._get_soap_payload(response=r, **parse_opts)
File "C:\Python36-32\lib\site-packages\exchangelib\services.py", line 260, in
_get_soap_payload
root = to_xml(response.iter_content())
File "C:\Python36-32\lib\site-packages\exchangelib\util.py", line 365, in to_x
ml
return parse(stream, parser=forgiving_parser)
File "C:\Python36-32\lib\site-packages\defusedxml\lxml.py", line 134, in parse
elementtree = _etree.parse(source, parser, base_url=base_url)
File "src\lxml\etree.pyx", line 3424, in lxml.etree.parse
File "src\lxml\parser.pxi", line 1857, in lxml.etree._parseDocument
File "C:\Python36-32\lib\site-packages\exchangelib\util.py", line 340, in getv
alue
res = b''.join(self._bytes_generator)
MemoryError
Я не уверен, что еще я должен попробовать, тем более, что первый работает, чтобы переместить и напечатать электронные письма очень хорошо.
2 ответа
Там нет необходимости собирать предметы в первую очередь. Это займет много памяти, как вы узнали. Вместо этого вы можете позвонить .delete()
прямо на QuerySet. Это приведет к получению только идентификаторов элементов и удалению их партиями.
Также есть .empty()
метод, который приводит к вызову EmptyFolder
оказание услуг. Это удалит все элементы в папке, даже не извлекая идентификаторы:
testFolder.all().delete()
# Or even faster:
testFolder.empty()
Может, вместо удаления попробуйте переместить в корзину? или мягкое удаление?