Python: я хочу создать l oop, который будет подсчитывать вложения для сохранения в папке - PullRequest
0 голосов
/ 26 мая 2020

пытается создать al oop для переменной элемента в коде, который является вложениями из целевых писем. Но это не позволяет выдавать ошибку «ограничить объект».

import win32com.client
import os
from win32com.client import Dispatch
import datetime as dt

outlook = Dispatch("Outlook.Application").GetNamespace("MAPI")
root_folder = outlook.Folders.Item(1)

# path = os.path.expanduser("~C:/Users\bhosale.siddhesh/Desktop/MACRO")
#today = dt.date.today()


for folder in root_folder.Folders:

   myfolder = root_folder.Folders['Daily Input Files']

Filter = "[SenderEmailAddress] = 'indices@nse.co.in'"
myMail = myfolder.Items.Restrict(Filter)

Item = myMail.GetFirst()
    for attachment in Item.Attachments:
    attachment.SaveAsFile(r'C:\Users\bhosale.siddhesh\Desktop\Work\x' + '\\'+ 
    str(attachment)) #Saves attachment to location


Item = myMail.GetNext()   
    for attachment in Item.Attachments:
    attachment.SaveAsFile(r'C:\Users\bhosale.siddhesh\Desktop\Work\x' + '\\'+ 
    str(attachment)) #Saves attachment to location

Item = myMail.GetNext()   
    for attachment in Item.Attachments:
    attachment.SaveAsFile(r'C:\Users\bhosale.siddhesh\Desktop\Work\x' + '\\'+ 
  str(attachment)) #Saves attachment to location

1 Ответ

0 голосов
/ 26 мая 2020

Прежде всего, метод Restrict класса Items возвращает коллекцию Items, которая представляет элементы из исходной коллекции Items, которые соответствуют фильтру. Итак, вам нужно перебрать все элементы в коллекции и сохранить вложения.

Чтобы охватить все папки (с подпапками), вы должны рекурсивно перебирать все папки в Outlook (необработанный эскиз в VBA):

Private Sub processFolder(ByVal oParent As Outlook.MAPIFolder)

        Dim oFolder As Outlook.MAPIFolder
        Dim oMail As Outlook.MailItem

        For Each oMail In oParent.Items

        'Get your data here ...

        Next

        If (oParent.Folders.Count > 0) Then
            For Each oFolder In oParent.Folders
                processFolder oFolder
            Next
        End If
End Sub

Но лучший способ - использовать метод AdvancedSearch класса Application, чтобы найти все элементы, к которым прикреплены файлы, и затем обрабатывать их только путем сохранения прикрепленных файлов на диске. Ключевые преимущества использования метода AdvancedSearch в Outlook:

  • Поиск выполняется в другом потоке. Вам не нужно запускать другой поток вручную, поскольку метод AdvancedSearch запускает его автоматически в фоновом режиме.
  • Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и c. в любом месте, т.е. за пределами определенной папки. Методы Restrict и Find / FindNext могут применяться к конкретной коллекции Items (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка DASL запросы (для поиска также можно использовать настраиваемые свойства). Подробнее об этом можно прочитать в статье Filtering в MSDN. Чтобы повысить эффективность поиска, можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство IsInstantSearchEnabled класса Store).
  • Вы можете остановить процесс поиска в любой момент, используя Stop метод класса Search.

Чтобы найти все элементы, у которых есть вложения, вы можете использовать следующее условие (например, строка предназначена для макросов VBA, но свойство такое же для всех языков программирования):

query ="@SQL=" & chr(34) & "urn:schemas:httpmail:hasattachment" & chr(34) & "=1"
...