Как я создал скрипт Python для чтения электронной почты с сервера Exchange

Обо мне

Я программирую с 1992 года, но с Python познакомился совсем недавно. Я считаю, что это очень простой и мощный язык. Поскольку я работаю в основном в сфере интеграции, особенно с такими бизнес-инструментами, как Microsoft Dynamics или Microsoft Exchange, недавно я изучил интеграцию с использованием Python и этих инструментов. Я обнаружил, что Python очень хорошо подходит для этой задачи.

Обновление: недавно я также попробовал это с помощью Java. Если хотите проверить это, перейдите к моей статье Codementor Использование Java для интеграции с Microsoft Exchange Server

Проблема, которую я хотел решить

Моя цель состояла в том, чтобы получить доступ к серверу Exchange и читать электронную почту с него. Я нашел несколько скриптов для чтения электронной почты через Outlook. Однако я считаю, что использование Outlook делает код зависимым от почтового клиента, и я хотел избежать этого. Если вы находитесь в бизнес-настройке, получая информацию с сервера, в этом случае получение электронной почты от Microsoft Exchange является лучшим подходом.

Что делает этот скрипт?

Я создал простой скрипт Python, который мог получить доступ к серверу Microsoft Exchange (Exchange 2010, 2013, 2016, 2019, Online) и читать с него электронную почту. Используя этот сценарий в качестве основы, вы можете разработать и получать только те электронные письма, которые вам нужны.

Стек технологий

На уровне ODBC происходит передача данных, поэтому со стороны сценариев это то же самое, как если бы вы использовали python для доступа к Microsoft SQL Server или для доступа к любой базе данных через ODBC. Для этого я использовал модуль pyodbc (версия python 3.7 + версия pyodbc 4.0.26). Инструмент под названием Connect Bridge занимается фактической интеграцией API. Затем в сценарии Python я читаю данные, как если бы я читал данные из базы данных.
Подключить мост — это интеграционная платформа, разработанная Connecting Software. Он позволяет вашему сценарию подключать любое программное обеспечение через драйверы ODBC, драйверы JDBC или веб-службы. Важно отметить, что Connect Bridge является коммерческим продуктом. Вы можете получить бесплатная пробная версия для этого, чтобы вы могли попробовать этот подход для себя бесплатно.

Руки на сценарии!

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

  1. Убедитесь, что у вас есть учетные данные для входа в Exchange.
  2. Запросите бесплатную пробную версию и установите Connect Bridge
  3. Установите Python для Windows вер. 3,7+. Вы можете использовать редактор по вашему выбору для написания сценария.
  4. Установить пиодбк модуль 4.0.26+
  5. Запустите Connect Bridge Management Studio и:
    5.1. Добавьте учетную запись для Exchange (Учетные записи — Добавить учетную запись). Для добавления учетной записи необходимо выбрать коннектор MGEXPlugin2010 и использовать учетные данные, указанные в пункте 1.
    5.2. Откройте параметр «Новый запрос», а затем «Браузер подключений». Найдите коннектор Exchange и разверните его, пока не увидите файл DefaultConnection. Щелкните правой кнопкой мыши DefaultConnection и выберите параметр «Получить строку подключения». Скопируйте строку подключения ODBC, так как она потребуется для передачи в сценарий.
    5.3. Используйте параметр «Новый запрос», чтобы протестировать запрос, который будет получать доступ к тому, что вам нужно в Exchange.
    Я сделаю здесь пример запроса, но здесь вы должны указать, что именно вы ищете в Exchange. После того, как вы нажали «Новый запрос», откройте браузер подключений слева. Найдите коннектор Exchange (MGEXPlugin2010) и открывайте его, пока не появится параметр «Таблицы». Мы видим, что схема содержит «таблицу» с именем Message, поэтому мы можем построить наш запрос как SELECT * FROM Message WHERE CreationDate >= ‘2019-01-01 00:00:00’ LIMIT 10; выбрать десять записей из списка сообщений электронной почты биржи, созданного после 1 января 2019 года.
    Опять же, обратите внимание, хотя это выглядит так, как будто мы используем базу данных напрямую, это не так. Connect Bridge обращается к API, а затем представляет его, как если бы это была база данных. Получив запрос, скопируйте его, так как вам нужно будет передать его сценарию.
    Все решение находится в одном файле CBExchange.py, а полный исходный код приведен ниже. Пожалуйста, сосредоточьтесь на строках 70-92, которые изображают основное решение. Полное описание того, как работает этот скрипт, приведено ниже.
#!/usr/local/bin/python3.7 
# encoding: utf-8 
''' 
CBExchange -- query data from, write data to Exchange 
CBExchange is a script that allows to read Exchange mail 
using SQL queries via Connect Bridge's ODBC driver 
@author:    Ana Neto  
@copyright:  2019 
@contact:    ana@connecting-software.com 
@deffield    updated: 26.09.2019 
''' 
import sys 
import os 
import pyodbc 
from argparse import ArgumentParser 
from argparse import RawDescriptionHelpFormatter 
__all__ = [] 
__version__ = 0.2 
__date__ = '2019-09-26' 
__updated__ = '2019-09-26' 
DEBUG = 1 
TESTRUN = 0 
PROFILE = 0 
class CLIError(Exception): 
    '''Generic exception to raise and log different fatal errors.''' 
    def __init__(self, msg): 
        super(CLIError).__init__(type(self)) 
        self.msg = "E: %s" % msg 
    def __str__(self): 
        return self.msg 
    def __unicode__(self): 
        return self.msg 
def main(argv=None): # IGNORE:C0111 
    '''Command line options.''' 
    if argv is None: 
        argv = sys.argv 
    else: 
        sys.argv.extend(argv) 
    program_name = os.path.basename(sys.argv[0]) 
    program_version = "v%s" % __version__ 
    program_build_date = str(__updated__) 
    program_version_message="%%(prog)s %s (%s)" % (program_version, program_build_date) 
    program_shortdesc = __import__('__main__').__doc__.split("n")[1] 
    program_license=""'%s 
  Created by Ana Neto on %s. 
  Licensed under the Apache License 2.0 
   
  Distributed on an "AS IS" basis without warranties
  or conditions of any kind, either express or implied. 
USAGE 
''' % (program_shortdesc, str(__date__)) 
    try: 
        # Setup argument parser 
        parser = ArgumentParser(description=program_license, 
        formatter_class=RawDescriptionHelpFormatter) 
        parser.add_argument('connstr')         
        parser.add_argument('query') 
         
        # Process arguments 
        args = parser.parse_args() 
        query = args.query 
        connstr = args.connstr 
        conn = pyodbc.connect(connstr) 
        cursor = conn.cursor() 
        cursor.execute(query) 
        while 1: 
            row = None 
            try: 
                row = cursor.fetchone() 
            except:  
                print(sys.exc_info()[1]) 
                break 
            if not row: 
                break                     
            print(row)              
    except KeyboardInterrupt: 
        ### handle keyboard interrupt ### 
        return 0 
    except: 
        print(sys.exc_info()[1]) 
        #indent = len(program_name) * " "         
        #sys.stderr.write(program_name + ": " + repr(e) + "n") 
        #sys.stderr.write(indent + "  for help use --help") 
        return 2 
if __name__ == "__main__": 
    if TESTRUN: 
        import doctest 
        doctest.testmod() 
    if PROFILE: 
        import cProfile 
        import pstats 
        profile_filename="CBExchange_profile.txt" 
        cProfile.run('main()', profile_filename) 
        statsfile = open("profile_stats.txt", "wb") 
        p = pstats.Stats(profile_filename, stream=statsfile) 
        stats = p.strip_dirs().sort_stats('cumulative') 
        stats.print_stats() 
        statsfile.close() 
        sys.exit(0) 
    sys.exit(main()) 

Для переменных я использовал
• парсер для разбора аргументов, которые мы получаем из командной строки
• args содержит эти аргументы
• запрос содержит запрос, который мы хотим выполнить, и который входит в качестве аргумента
• connstr содержит строку соединения ODBC, которая поступает в качестве аргумента и которую мы передаем в модуль pyodbc для создания соединения ODBC.
• conn — соединение ODBC.
А вот что делает скрипт
• В строках с 70 по 78 цель состоит в том, чтобы получить переменные connstr и query из входных аргументов командной строки. Для простоты я использовал шаблон скрипта pydev argparse.
• В строке 80 мы открываем курсор базы данных, используя conn
• В строке 82 мы выполняем SQL-запрос, полученный из командной строки.
• В строках с 83 по 92 мы перебираем результаты и считываем их с курсора строка за строкой.
• Когда cursor.fetchone возвращает None, мы прерываем цикл.
• Если во время выборки ODBC возникает исключение, мы также разрываем цикл и выводим проблему на вывод.
• Если метод fetchone завершается успешно и возвращает строку данных, мы печатаем строку необработанных данных в том виде, в каком она есть на выходе. Я решил сделать это так, поскольку этого достаточно для демонстрационных целей, но, естественно, в реальной ситуации вы можете форматировать как xml, json, csv или любой другой формат обмена данными. Или вы также можете просто использовать объект строки необработанных данных для выполнения пользовательских задач в последующем коде.
Когда вы будете готовы запустить скрипт, обратите внимание, что он принимает два позиционных аргумента командной строки: connstr и query.
Вам нужно будет скопировать их из Connect Bridge Management Studio, как описано выше (пункт 5.2). Когда они будут у вас под рукой, откройте командную строку, перейдите в папку, в которую вы сохранили скрипт, и запустите свой скрипт Python передавая ему два параметра.

Проблемы, с которыми я столкнулся

Когда я впервые столкнулся с этой проблемой, я рассматривал возможность использования API Exchange. Я рад, что нашел альтернативное решение, и мне никогда не приходилось изучать и изучать этот API. Я никогда не использовал API Exchange. Избегая кривой обучения, я быстрее добрался до конца.
Тем не менее, когда я решил использовать инструмент Connect Bridge, я обнаружил, что он доступен только для операционных систем Windows (клиентская библиотека ODBC для Linux отсутствует). Итак, чтобы это сработало, мне пришлось придерживаться машины с Windows.

Основные выводы

Использование интеграционной платформы сделало мой код намного короче, и я уверен, что его будет легко поддерживать. Если новая функция не нужна, мне не придется снова прикасаться к коду (поскольку гарантируется совместимость с будущими версиями Exchange). Если потребуется новая функция, то я думаю, что абстракция доступа к Exchange, как если бы это была база данных, даст мне большое преимущество, как это было для этого проекта.

Советы и советы

Если вы планируете использовать Python для подключения к API, который вы никогда не использовали, рассмотрите возможность использования стороннего инструмента, который может упростить вашу жизнь. Это особенно верно, если API от Microsoft или другого софтверного гиганта, поскольку они меняются чаще. Но убедитесь, что вы осторожны при выборе стороннего, чтобы он не замедлял ваш код.
Я доволен сделанным выбором. В итоге у меня есть готовый скрипт, который работает для нескольких версий Exchange. Используемый сторонний инструмент обеспечивает прямую и обратную совместимость.

Заключительные мысли и следующие шаги

Теперь мы увидели, как можно быстро получить доступ к данным Exchange в Python. Используя тот же Интеграционная платформа Connect Bridge, вы также можете получать данные из другого программного обеспечения для бизнеса, такого как Microsoft Dynamics или Salesforce. Вам просто нужно выбрать разъем для конкретного программного обеспечения, которое вы хотите, и использовать его.

Подключить мост действительно может избавить вас от головной боли при выполнении проекта интеграции. В вашем коде будет меньше ошибок, вам нужно будет писать меньше кода, и как только вы закончите работу над проектом, вам не нужно будет возвращаться и выполнять обслуживание, так как Connect Bridge поставляется с гарантией совместимости вперед (это прекрасное время спасатель!).

Если вы хотите узнать, как использовать Connect Bridge для получения определенной информации, вы можете изучить ее самостоятельно, попробовав бесплатную пробную версию, или вы можете связаться с экспертами Connecting Software. Они будут более чем рады предоставить вам бесплатную демонстрацию или ответить на любые ваши вопросы.

Вы также можете оставить ответ ниже, и я сделаю все возможное, чтобы помочь вам.

ana_framed.PNG

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *