Как читать электронную почту с сервера Exchange - учебник Python, использующий Connect Bridge.

Ана Нето Новости компании, Разъемы, Технический Оставить комментарий

"Нужно ли подключить ваш скрипт, работающий на языке Python, к серверу, работающему на языке Exchange? Мы покажем вам простой способ сделать это с помощью инструмента под названием Connect Bridge".

Введение

В этой статье описывается, как заставить Python подключиться к Exchange, то есть как читать почту с сервера Microsoft Exchange (Exchange 2010, 2013, 2016, 2019, Online) с помощью скрипта языка Python.

Передача данных осуществляется через уровень ODBC, поэтому со стороны сценария она точно такая же, как если бы вы использовали python для доступа к Microsoft SQL Server или для доступа к любой базе данных через ODBC. Вы просто используете модуль пиодбк (мы использовали питон версии 3.7 и пиодбк версии 4.0.26.). Интеграция с API осуществляется с помощью инструмента под названием Connect Bridge, а затем на вашем Python скрипте вы читаете данные так, как будто читаете базу данных.

Пожалуйста, обратите внимание, что Connect Bridge является коммерческим продуктом. Вы можете получить бесплатную пробную версию для этого, так что вы можете попробовать этот подход для себя бесплатно.

Что это за "1ТП16Т"?

Connect Bridge является интеграционной платформой, разработанной Connecting Software. Она позволяет вашему скрипту подключать любое программное обеспечение через ODBC драйверы, JDBC драйверы или Web Services... избегая необходимости изучать и изучать API программы, к которой вы пытаетесь подключиться!

В этой конкретной статье мы используем Connect Bridge для подключения к Microsoft Exchange, но вы также можете получить данные с Microsoft SharePoint или CRM, как Salesforce или Dynamics среди многих других. А передача данных на самом деле может быть двунаправленной. То есть, вы также можете поместить данные в эти системы, хотя на этот раз мы сосредоточимся на чтении данных.

С чего мне начать?

Нашей целью является создание простого Python скрипта, который получает доступ к серверу Exchange и читает с него электронную почту. Мы предполагаем, что экземпляр Exchange уже существует. Это простые шаги, которым вам нужно следовать:

1. Убедитесь, что у вас под рукой есть учетные данные для входа Exchange.

2. Запросите бесплатную пробную версию и установите Connect Bridge.

3. Установите Python для Windows ver. 3.7+. Вы можете использовать редактор по вашему выбору для написания скрипта.

4. Установить модуль пиодбк 4.0.26+

5. Запустите Connect Bridge Management Studio и:

5.1. Добавить учетную запись для Exchange (Аккаунты - Добавить учетную запись). Для добавления счёта необходимо выбрать коннектор MGEXPlugin2010 и использовать реквизиты, указанные в пункте 1.

5.2. Откройте опцию Новый запрос, а затем Браузер соединений. Найдите коннектор Exchange и разверните его до тех пор, пока не увидите DefaultConnection. Щелкните правой кнопкой мыши на DefaultConnection и выберите строку Get Connection (Получить соединение). Скопируйте строку ODBC соединения, так как она вам понадобится, чтобы передать её в скрипт.

5.3. Используйте опцию Новый запрос, чтобы протестировать запрос, который получит доступ к тому, что вам нужно в Exchange.

Здесь мы сделаем пример запроса, но здесь вы должны поместить то, что вы ищете в Exchange. После того, как вы нажали Новый запрос, откройте Браузер подключений слева. Найдите коннектор Exchange (MGEXPlugin2010) и откройте его, пока не появится опция Таблицы. Мы видим, что схема содержит "таблицу" под названием Message, поэтому мы можем построить наш запрос как SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; чтобы выбрать 10 записей из списка сообщений электронной почты Exchange, которые были созданы после 1 января 2019 года. Опять же, пожалуйста, обратите внимание, что хотя это выглядит так, как будто мы используем базу данных напрямую, это не так. Connect Bridge обращается к API и затем представляет его как базу данных. Как только у вас есть ваш запрос, скопируйте его, как вам нужно будет передать его в скрипт.

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

Наше решение имеет только один файл: CBExchange.py. Полный исходный код приведен ниже. Пожалуйста, обратите внимание на строки 70-92, в которых представлено основное решение. Полное описание того, как работает этот скрипт, приведено ниже.

#!/usr/local/bin/python3.7

кодировка #: utf-8

'''

CBExchange -- запрос данных, запись данных на Exchange

  

CBExchange - это скрипт, позволяющий читать почту Exchange, используя SQL-запросы через ODBC-драйвер Connect Bridge.

  

@author:    Ана Нето

  

@copyright: 2019

  

@контакт: ana@connecting-software.com

@deffield updated: 22.07.2019

'''

  

импортные системы

импортные оs

импортный пиодбк

  

от импорта АргументПарсер

от импорта argparse RawDescriptionHelpFormatter

  

[_all___ = []

__версия_ = 0.2

__date__ = '2019-07-22'

__updated__ = '2019-07-22'.

  

DEBUG = 1

ТЕСТРУН = 0

ПРОФИЛЬ = 0

  

класс CLIError(Исключение):

    "Общее исключение для поднятия и записи в журнал различных фатальных ошибок.

    Если ты не знаешь, что это такое..:

        super(CLIError).__init__(type(self))

        self.msg = "E: %s" % msg

    Деф __str__(self):

        вернуть кого-л./что-л.

    Def __unicode _(self):

        вернуть кого-л./что-л.

  

def main(argv=None): # IGNORE:C0111

    "Опции командной строки.

  

    если спорить "Нет":

        аргумент = sys.argv

    Иначе:

        sys.argv.extension(argv)

  

    имя_программы = os.path.basename(sys.argv[0])

    программа_версия = "v%s" % __версия __версия__

    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]

    программа_лицензия = '''%s

  

  Создано Аной Нетто на %s.

  

  Лицензия Apache 2.0.

  http://www.apache.org/licenses/LICENSE-2.0

  

  Распространяется на условиях "КАК ЕСТЬ" без гарантий.

  или условия любого рода, как явные, так и подразумеваемые.

  

ИСПОЛЬЗОВАНИЕ

''' % (program_shortdesc, str(__date__))

  

    Попробуй:

        # Парсер аргументов установки

        parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter)

        parser.add_argument('constr')

        parser.add_argument('request')

         

        # Аргументы процесса

        args = parser.parse_args()

  

        запрос = args.query

        connstr = args.connstr

  

        conn = pyodbc.connect(connstr)

        курсор = conn.cursor()

        курсор.exec(запрос)

        в то время как 1:

            строка = Нет

            Попробуй:

                row = курсор.fetchone()

            за исключением того:

                print(sys.exc_info()[1])

                перерыв на

            если не грести:

                перерыв на

            печать(строка)

                         

             

    кроме KeyboardInterrupt:

        ### прерывание клавиатуры рукоятки ###

        возврат 0

    за исключением того:

        print(sys.exc_info()[1])

        #indent = len(имя_программы) * " ".

        #sys.stderr.write(имя_программы + ": " + повтор(e) + "n").

        #sys.stderr.write(отступ + " для использования справки --help")

        возврат 2

  

если __name_ == "__main__":

          

    если ТЕСТРУН:

        импортный доктест

        doctest.testmod()

    если ПРОФИЛЬ:

        профиль импорта

        импортные пошлины

        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('кумулятивный')

        stats.print_stats()

        statsfile.close()

        sys.exit(0)

    sys.exit(main()) 

Вот немного о переменных, которые мы используем:

- синтаксический анализатор используется для разбора аргументов, которые мы получаем из командной строки

- аргументы подтверждают эти аргументы

- запрос содержит запрос, который мы хотим выполнить, и который приходит в качестве аргумента.

- connstr содержит строку соединения ODBC, которая приходит в качестве аргумента и которую мы передаем в модуль pyodbc для создания соединения ODBC

- подключение ODBC

И вот что делает наш сценарий

- В строках 70-78 целью является получение переменных connstr и запрос из аргументов командной строки. Для простоты был использован шаблон скрипта argparse от pydev.

- В строке 80 мы открываем курсор базы данных с помощью коннектора.

- В 82-й строке мы выполняем SQL-запрос, полученный из командной строки.

- В строках с 83 по 92 мы перебираем результаты и читаем их из курсора ряд за рядом.

-Когда курсор.fetchone вернётся Нет, мы разорвём цикл.

- Если во время извлечения ODBC происходит исключение, мы также прерываем цикл и выводим на печать проблему.

- Если метод fetchone работает успешно и возвращает строку данных, мы распечатываем строку исходных данных, как она есть, на выходе. Этого достаточно для демонстрационных целей, но, естественно, в реальной ситуации вы можете отформатировать как xml, json, csv... или любой другой формат обмена данными. Или же вы можете просто использовать объект необработанной строки данных для выполнения пользовательских задач в последующем коде.

Как запустить сценарий CBExchange.py?

Скрипт CBExchange.py принимает два аргумента позиционной командной строки: connectstr и query.

Нам необходимо скопировать их из студии управления Connect Bridge, как описано выше (пункт 5.2). Когда они у вас под рукой, откройте командную строку, cd в папку, в которую вы сохранили скрипт и запустить твой Python-скрипт передавая ему 2 параметра.

Что еще я могу сделать? Исследовать дальше...

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

ВЫБЕРИТЕ * ОТ СОВМЕСТНОГО СОВЕТА

ГДЕ [HasAttachment] = true и [CreationDate] >= '2019-07-01 00:00:00';

Вы также можете изучить доступные "Хранимые процедуры". Найдите коннектор Exchange (MGEXPlugin2010) и разверните его до тех пор, пока не увидите опцию "Хранимые процедуры". Опять же, эти Хранилищные Процедуры - это интеграция API Connect Bridge, а не фактические процедуры, хранящиеся в базе данных. Но способ работы с ними такой же, как если бы они были.

Некоторые из доступных хранимых процедур видны на этом скриншоте:

Вы можете посмотреть на SP_SELECT_DEFAULT_FOLDER_INBOX для простой хранимой процедуры (без обязательного параметра) или SP_SEND_MESSAGE для немного более сложной.

Ограничения

Инструмент Connect Bridge доступен только для операционных систем Windows, поскольку клиентская библиотека ODBC Linux недоступна. Поэтому, чтобы это работало, вам понадобится Windows-машина.

Заключение

Мы видели, как можно легко получить доступ к данным Exchange на Python с помощью интеграционной платформы Connect Bridge. Теперь представьте себе, что то, что вы видели в этой статье, возможно и с Microsoft Dynamics CRM и Microsoft Exchange! Да, с Connect Bridge это возможно, и способ сделать это похож... вам просто нужно выбрать коннектор для определенного программного обеспечения, которое вам нужно, и пойти с ним.

Если вы хотите изучить коннекторы, доступные в настоящее время на Connect Bridge, то вам следует обратить внимание на следующее https://www.connecting-software.com/connect-bridge-connectors/

Если вам интересно, какие новейшие коннекторы в этом большом наборе, посмотрите на Connect Bridges's 1ТП21Т Финансы и операции и 1ТП21Т Бизнес-центр разъемы, оба построены на протоколе OData. Или взгляните на коннектор OPC UA. Да, я знаю, что это кажется совершенно другим случаем использования..... Но правда в том, что вы можете получить доступ к серверам OPC UA, используя один и тот же инструмент. Просто чтобы дать вам представление о том, что может получиться в результате такого типа интеграции, взгляните на Connect Bridge's витрина IIoT.

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

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

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