Как найти в почтовом ящике Outlook строку, содержащую строку python? - PullRequest
0 голосов
/ 19 февраля 2020

Я хочу посчитать последние 7 дней по электронной почте, имеющие тему с типами ошибок, а также имя сервера. Я новичок в Python coding. Может кто-нибудь помочь с этим?

Например: - У меня есть письма в папке «Входящие», как показано в строке темы:

  1. Проверка на отсутствие резервных копий на CP-TEST-DB2
  2. Проверка тупика на G-PROD-AUDB
  3. В журнале ошибок SQL имеются ошибки в LF-PTT-DW1
  4. Проверить диск пространство на CP-TEST-DB1

Итак, я хочу получать письма с темой строки «Проверка на наличие отсутствующих резервных копий» для каждого сервера (например, CP-TEST-DB2, G-PROD-AUDB) и хочу рассчитывать на это сервер мудрый. Как, например, сколько писем «Проверять наличие недостающих резервных копий» у меня на сервере «CP-TEST-DB2». сколько писем «Проверить наличие недостающих резервных копий» для «G-PROD-AUDB» и т. д. для каждого сервера.

сколько писем «Проверить тупик на» для «CP-TEST-DB2» "сервер. сколько сообщений "Проверить тупик на" у меня есть для "G-PROD-AUDB" и так далее для каждого сервера ... и так далее для типа ошибки также. У меня 8 типов sql сообщений об ошибках для каждого 33 сервера?

import win32com.client
import imp, sys, os, re
import datetime as dt
import time

date_time = dt.datetime.now()
print (date_time)

#list of errors
error = ['There are errors in the SQL Error Log on', 'Check for missing backups on', 'Check drive space on', 'Check memory usage on', 'Check deadlock on ']

#list of server
server = ['TEST-AUDB','TEST-AUDB','EUDB','TEST-EUDB','PROD-AUDB','PROD-EUDB']

#setup range for outlook to search emails (so we don't go through the entire inbox)
lastHourDateTime = dt.datetime.now() - dt.timedelta(days = 7)
#print (lastHourDateTime)

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.Folders.Item(2).Folders['Inbox']

messages = inbox.Items
messages.sort("[ReceivedTime]", True)
lastHourMessages = messages.Restrict("[ReceivedTime] >= '" +lastHourDateTime.strftime('%m/%d/%Y %H:%M %p')+"'")
print ("Current time: "+date_time.strftime('%m/%d/%Y %H:%M %p'))

for msg in lastHourMessages:
        subject = msg.Subject
        time = msg.ReceivedTime
        print (s1)```




1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете использовать следующее выражение регулярного выражения:

([\-A-Z0-9]+)$

, которое будет соответствовать 1 или более из каждой заглавной буквы, числа и da sh до конца предложения. Это относится ко всем случаям, которые вы указали в своем вопросе, как можно увидеть здесь .

Далее вы можете использовать модуль re и перебирать список строк, ища сопоставление с использованием шаблона, который я упомянул выше, и сохранение информации во вложенном словаре.

import re

# Example strings
strings = ["Check for missing backups on CP-TEST-DB2",
            "Check deadlock on CP-TEST-DB2",
            "Check deadlock on CP-TEST-DB2",
            "Check deadlock on G-PROD-AUDB",
            "There are errors in the SQL Error Log on LF-PTT-DW1",
            "Check drive space on CP-TEST-DB1"]

# Declare empty dictionary
occurrences = {}

# Iterate over all the examples
for string in strings:
    results = re.search('([\-A-Z0-9]+)$', string)
    # Get the server from the regex match
    server = results.group(0)
    # Remove the server from the string and use strip to get rid of the trailing whitespace
    instance = string.replace(server, '').strip()
    # If the server is still not in the dict, insert it manually
    if occurrences.get(server, None) is None:
        occurrences[server] = {instance: 1}
    # If the server is already in the dict, but not the instance, create the key and initial value for the instance
    elif occurrences[server].get(instance, None) is None:
        occurrences[server][instance] = 1
    # Otherwise, just increment the value for the server-instance pair
    else:
        occurrences[server].update({instance : occurrences[server].get(instance, 0) + 1})
print(occurrences)

Надеюсь, это поможет!

...