массовое чтение писем в Outlook на python win32com - слишком много открытых позиций - PullRequest
0 голосов
/ 12 сентября 2018

Я сталкиваюсь с некоторыми проблемами при попытке получить пакетную почту через python wincom32.client.

По сути, кажется, что существует ограничение на количество элементов, которые могут быть открыты в одном сеансе,и это флаг или статус на стороне сервера ... проблема в том, что я не нашел способа возобновить / закрыть / переустановить, и я не могу попросить системных администраторов сделать это для меня ..

Вот мой фрагмент кода - я знаю, что это некрасиво - но я использую его на ноутбуке Юпитера, просто чтобы поэкспериментировать / поиграться, прежде чем правильно его расположить.

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

def create_message_list(folder):
    return [{
        "folder": folder.Name,
        "sender" : m.Sender,
        "recipients" : m.Recipients,
        "subject" : m.subject, 
        "body":m.body
        } for m in folder.Items]

for folder in outlook.Folders:
    if (folder.Name=="myfolder.name"):
        message_list = create_message_list(folder)

и вот что я получаю:

com_error: (-2147352567, «Произошло исключение.», (4096, «Microsoft Outlook», «Администратор сервера ограничил количество элементов, которые вы можете открывать одновременно. Попробуйте закрыть открытые вами сообщения»).или удаление вложений и изображений из неотправленных сообщений, которые вы создаете. ', Нет, 0, -2147220731), Нет).

Обратите внимание, что в i мой эскизный код работал некоторое время .я мог бы получить что-то вроде 10 тыс. сообщений, прежде чем он перепутался с этой ошибкой.

Вещи, которые я пытался (без результата) - попытаться закрыть сеанс папки / mapi - запустить цикл for для тех же элементови вызывая сообщение. Close (0) - используя методы GetFirst () / GetLast () для сообщения вместо понимания списка

благодарит всех за идеи / предложения / что угодно.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

проблема была связана с использованием словаря для хранения данных сообщения, которые каким-то образом содержали ссылку на него, не позволяя ресурсу быть освобожденным, даже если был вызван явный m.Close(0).

Я заменил их все вызовом "dictkey" : str(m.<field>), и ошибка больше не отображается.

0 голосов
/ 12 сентября 2018

Вы держите все элементов в открытой папке - это действительно плохая идея. Сохраняйте только идентификаторы записей и повторно открывайте сообщения по запросу, используя Namespace.GetItemFromID. Как только вы закончите с предметом, отпустите его.

...