Ситуация:

Я ежедневно получаю электронное письмо с вложением, но я не хочу постоянно сохранять его вручную, поэтому я сделал скрипт для его загрузки.

Я использую библиотеку Python win32com для запуска Outlook в фоновом режиме:

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

Скрипт находит последнее электронное письмо с вложением и сохраняет его.

Проблема:

Последнее вложение не сохраняется. Он всегда остается на одном и том же адресе электронной почты, как будто Outlook вообще не обновлялся. Это работает только в том случае, если я удаляю свой профиль Outlook и создаю новый. Любые идеи о причине такого поведения?

С уважением,

Доюно

КОД:

# -*- coding: utf-8 -*-
import datetime

import pandas as pd
import win32com.client

path = "C:\some\path"
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

def getfoldernum():
    i = 1
    for x in outlook.Folders:
        if ('[email protected]' == str(x)):
           print 'Found the Folder'
           return i
        else:
           i += 1

def main():
    foldernum = getfoldernum()

    inbox = outlook.Folders.Item(foldernum).Folders('Inbox')

    d = 0
    w = 0
    messages = inbox.Items
    for msg in messages:
        print msg.SentOn

        if msg.Attachments:
            attachments = msg.Attachments
            for attachment in attachments:
                if 'Attachment name' in str(attachment.FileName):
                    location = path + 'Archive\\Daily\\'+str(attachment.FileName)
                    attachment.SaveAsFile(location)
                    df = pd.read_excel(location)

                    if d == 0:
                        attachment.SaveAsFile(path+'filename.xlsx')
                        d = 1

                else:
                    print 'Attachment not found or wrong name'


if __name__ == '__main__':
    main()
отвечать

Ваш сценарий будет действовать в зависимости от того, какой элемент окажется первым в коллекции Items, и вы ничего не сделали, чтобы указать, как эта коллекция должна быть отсортирована. Так что, если коллекция будет отсортирована по последнему элементу первым, ваш код сработает. Вы должны использовать Items.Sort , чтобы указать порядок сортировки.