Несколько инструкций if/for для задания условий конкретного электронного письма и извлечения вложения

#python

#питон

Вопрос:

Я написал ниже с намерением просканировать почтовый ящик (в обратном порядке, чтобы он выбрал последний файл) на предмет электронного письма, полученного сегодня и имеющего тему «Интерес».:

 for message in reversed(messages):
    if message.SentOn.date() == today and 'Interest' in str(message.subject):
        print("Found message")
        attachments = message.Attachments
        attachment = attachments.Item(1)
        for attachment in message.Attachments:
            attachment.SaveAsFile(os.path.join(path, str(attachment)))
    else:
        print("No interest to be booked")
 

Это работает, однако я хочу также отметить тот факт, что иногда электронное письмо может быть отправлено с темой «интерес», то есть строчной буквой «i». Я попытался изменить первую строку кода на:

 if message.SentOn.date() == today and ['Interest' in str(message.subject) or 'interest' in str(message.subject)]:
 

Но потом по какой-то причине это не работает. Что меня смущает, так это то, что он все еще находит сообщение, но просто не может извлечь вложение. Это ошибка, которую я получаю:

 Traceback (most recent call last):
  File "h:/Excel/python/todaysdateandformat.py", line 20, in <module>
    attachment = attachments.Item(1)
  File "<COMObject <unknown>>", line 2, in Item
pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'Array index out of bounds.', None, 0, -2147352567), None)
 

Ответ №1:

В качестве альтернативы замене квадратных скобок круглыми, более простым и гибким способом может быть сокращение темы до ее сопоставления:

 if message.SentOn.date() == today and 'interest' in str(message.subject).lower():
  ...
 

Комментарии:

1. Ха, нас разделяли считанные секунды.

2. Спасибо, все эти решения сработали 🙂

Ответ №2:

 if message.SentOn.date() == today and ['Interest' in str(message.subject) or 'interest' in str(message.subject)]:
 

Скобки возвращают список, а не логическое значение.

Вы должны написать :

 if message.SentOn.date() == today and ('Interest' in str(message.subject) or 'interest' in str(message.subject)):
 

Комментарии:

1. Спасибо, все эти решения сработали 🙂

Ответ №3:

Просто замените [] на () в операторе if . Теперь он создает список [True] или [False]. Оба они оцениваются как True.

Комментарии:

1. Спасибо, все эти решения сработали 🙂

Ответ №4:

Это работает, однако я хочу также отметить тот факт, что иногда электронное письмо может быть отправлено с темой «интерес», то есть строчной буквой «i».

Преобразуйте строку в нижний регистр, а затем проверяйте только «интерес».

if message.SentOn.date() == today and 'interest' in str(message.subject).lower():

Если у вас есть другие условия для проверки, вы действительно можете использовать генератор или понимание списка и объединить его со any встроенным (или all , если требуется). Что-то вроде этого:

if message.SentOn.date() == today and any(s in str(message.subject) for s in search_terms)

Комментарии:

1. Спасибо, все эти решения сработали 🙂