Как получить дату и время получения почты Outlook и тела проверки от конкретного отправителя с помощью python

#python #loops #datetime #email #outlook

#python #циклы #дата и время #Адрес электронной почты #outlook

Вопрос:

Я пытаюсь добиться следующего, используя python: получить последние 24 часа входящих сообщений Outlook от конкретного отправителя и проверить, представлен ли конкретный текст в теле этого письма

ниже я попробовал :

 import sys, win32com.client, datetime
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
s = outlook.GetDefaultFolder(6).Items   
# Get yesterdays date for the purpose of getting emails from this date
d = (datetime.date.today() - datetime.timedelta (days=1)).strftime("%d-%m-%y")
# get the email/s
msg = s.GetLast()
# Loop through emails
while msg:
    # Get email date 
    date = msg.SentOn.strftime("%d-%m-%y")
    # Set the critera for whats wanted                       
    if (d == date) and ("MAINTENANCE" in msg.body) and ("Upgrade" in msg.Subject) and msg.Sender == "aa@bb.com" :
        print("Date : ", date) 
    msg = s.GetPrevious() 
  

ошибка :

дата = сообщение.SentOn.strftime(«%d-%m-%y») Файл «C:Users1024983AppDataLocalProgramsPythonPython37libsite-packageswin32comclientdynamic.py» , строка 527, в getattr вызывает ошибку атрибута(«%s.%s» % (self.username, attr)) Ошибка атрибута: getPrevious.SentOn

и не уверен, в чем ошибка в строке проверки

 if (d == date) and ("MAINTENANCE" in msg.body) and ("Upgrade" in msg.Subject) and msg.Sender == "aa@bb.com" :
  

Ответ №1:

Во-первых, никогда не перебирайте все элементы в папке — вы бы не использовали оператор SELECT в SQL без предложения WHERE, не так ли? Всегда используйте Items.Find/FindNext или Items.Restrict .

Во-вторых, Sender это не скалярное (строковое) свойство — оно возвращает object ( AddressEntry ) , поэтому то, что вы хотите MailItem.Sender.Address (после проверки, что MailItem.Sender нет null).

В-третьих, помимо MailItem объектов в папке входящих сообщений, у вас также могут быть другие элементы, такие как MeetingItem и ReportItem , которые могут не раскрывать все свойства, к которым вы обращаетесь (например, Sender ). Если вам нужны только MailItem объекты, убедитесь, что Class свойство (доступное для всех объектов ООМ) == 43 ( OlObjectClass.olMail ).