Простой вопрос о условных выражениях потока - PullRequest
0 голосов
/ 10 мая 2019

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

Это то, что я имею до сих пор:

Я пытался использовать операторы break и множественные операторы if, а также elif.Но я не могу заставить его работать.

import win32com.client
from datetime import date, timedelta


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

inbox = outlook.GetDefaultFolder(18).Folders.Item("Riscunit")
messages = inbox.Items

date = date.today() - timedelta(days=1)
subject = "Catalyst"

for message in messages:
    if subject in message.subject and date == message.senton.date():
      print(message.sender)
      print(message.senton.date())
      print(message.senton.time())
      print(message.body)
    elif subject != message.subject and date != message.senton.date:
     break

Я бы хотел, чтобы код извлек соответствующие письма, а затем прекратил работу.Я новичок в Python, поэтому любая помощь будет высоко ценится.

Ответы [ 3 ]

1 голос
/ 10 мая 2019
  • elif не требуется, так как это противоположно if
  • Если вам действительно нужно что-то сделать, когда if ложно, тогда else будет более подходящим- хотя, скорее всего, вам не нужно else здесь
bag = ['pizza', 'ziplocks','bananas', 'milk glass', 'post-its','spray']
foods  = {1:'pizza', 2:'bananas', 3:'milk'}

# check shopping bag for food

for item in bag:
    for key in foods:
        if foods[key] in item:
            print('eat ' + foods[key]);
            break
    else:
        print('put ' + item + ' away');

print("done");

, и вот еще один пример, который делает что-то, когда ваше условие if не выполняется:

messages = [{'subject': 'shopping list', 'date': '05/10/2019', 'body': 'milk'},
            {'subject': 'shopping list', 'date': '05/10/2019', 'body': 'pizza'},
            {'subject': 'holiday', 'date': '12/10/2015', 'body': 'need vacation soon'},
            {'subject': 'shopping list', 'date': '12/10/2015', 'body': 'we need potatoes'}]

date = '05/10/2019'
subject = "shopping list"

for item in messages:
    for key in item:
        if subject in item['subject'] and item['date'] == date:
            print('buy ' + item['body']);
            break
        else:
            print('archive \"' + item['body'] + '\" email');
            break

print("done");
1 голос
/ 10 мая 2019

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

max = 42
for count, message in enumerate(messages):
    if count > max:
       break
    if subject in message.subject and date == message.senton.date():
       collect(message)   # Do something with this message (print or append to list)
0 голосов
/ 10 мая 2019

Вероятно, из-за логики использования elif вместо else.

Попробуйте это:

import win32com.client
from datetime import date, timedelta


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

inbox = outlook.GetDefaultFolder(18).Folders.Item("Riscunit")
messages = inbox.Items

date = date.today() - timedelta(days=1)
subject = "Catalyst"

for message in messages:
    if subject in message.subject and date == message.senton.date():
      print(message.sender)
      print(message.senton.date())
      print(message.senton.time())
      print(message.body)
    else: 
      subject != message.subject and date != message.senton.date
      break
...