Рубрики
Без рубрики

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

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

Автор оригинала: Ana Neto.

Обо мне

Я занимаюсь кодированием с 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, Онлайн) и читать с него электронные письма. Используя этот сценарий в качестве основы, вы можете затем разработать и получить только конкретные электронные письма, которые вы хотите.

Технический стек

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

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

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

  1. Убедитесь, что у вас есть учетные данные для входа в Exchange
  2. Запросите бесплатную пробную версию и установите Connect Bridge
  3. Установите Python для Windows версии 3.7+. Вы можете использовать редактор по вашему выбору для написания сценария.
  4. Установить pyodbc модуль 4.0.26+
  5. Запустите Connect Bridge Management Studio и: 5.1. Добавьте учетную запись для Exchange (Учетные записи – Добавить учетную запись). Для добавления учетной записи необходимо выбрать соединитель MGEXPlugin2010 и использовать учетные данные, указанные в пункте 1. 5.2. Откройте опцию Новый запрос, а затем браузер соединений. Найдите соединитель Exchange и разверните его, пока не увидите соединение по умолчанию. Щелкните правой кнопкой мыши соединение по умолчанию и выберите опцию Получить строку подключения. Скопируйте строку подключения ODBC, так как она вам понадобится, чтобы передать ее скрипту. 5.3. Используйте опцию Новый запрос, чтобы проверить запрос, который будет получать доступ к тому, что вам нужно в Exchange. Я сделаю здесь пример запроса, но именно здесь вы должны указать, что именно вы ищете в обмен. После того, как вы нажмете Новый запрос, откройте браузер соединений слева. Найдите соединитель Exchange (MGEXPlugin2010) и откройте его, пока не появится опция Таблицы. Мы видим, что схема содержит “таблицу”, называемую сообщением, поэтому мы можем построить нашу
#!/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 
  http://www.apache.org/licenses/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 и запрос из входных аргументов командной строки. Я использовал шаблон скрипта argparse pydev для простоты. • В строке 80 мы открываем курсор базы данных с помощью conn • В строке 82 мы выполняем SQL-запрос, полученный из командной строки • В строках с 83 по 92 мы перебираем результаты и считываем их с курсора строка за строкой. • При наведении курсора.fetchone не возвращает ничего, мы разрываем цикл • Если во время выборки ODBC возникает исключение, мы также прерываем цикл и выводим проблему на вывод • Если метод fetchone

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

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

Основные уроки

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

Советы и рекомендации

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

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

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

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

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

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

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