如何从交换服务器上读取电子邮件-python-tutorial-using-connect-bridge

如何从Exchange服务器读取邮件--使用Connect Bridge的Python教程。

Ana NetoCompany news, Connectors, Technical Leave a Comment

"需要将 Python 脚本连接到 Exchange 服务器?我们将向您展示使用 Connect Bridge 工具的简便方法。

介紹

本文介绍了如何使Python连接到Exchange,即如何使用Python语言脚本从微软Exchange服务器(Exchange 2010、2013、2016、2019、Online)读取邮件。

数据传输是通过ODBC层进行的,因此从脚本方面来看,它与使用python访问Microsoft SQL Server或通过ODBC访问任何数据库完全相同。你只需使用 pyodbc模块 我们使用的是python 3.7版本和pyodbc 4.0.26版本)。实际的API集成是由一个叫做Connect Bridge的工具完成的,然后在你的Python脚本上,你就像读取数据库一样读取数据。

请注意,Connect Bridge是一种商业产品。您可以 获得免费试用 为,所以你可以免费为自己尝试这种方法。

这个 "Connect Bridge "是什么?

Connect Bridge 是一个由Connecting Software开发的集成平台。它允许你的脚本通过ODBC驱动、JDBC驱动或Web服务连接任何软件......避免了研究和学习你要连接的程序的API的需要!

在这篇文章中,我们使用Connect Bridge连接到微软Exchange,但你也可以从微软SharePoint或Salesforce或Dynamics等CRM中获取数据。而且数据传输实际上可以是双向的。也就是说,你也可以向这些系统输入数据,尽管这次我们的重点是读取数据。

我从哪里开始呢?

我们的目标是创建一个简单的Python脚本来访问Exchange服务器并从中读取电子邮件。我们假设Exchange实例已经存在。这些是你需要遵循的简单步骤。

1. 请确保您手头有Exchange的登录凭证。

2. 申请免费试用并安装Connect Bridge。

3. 安装Python for Windows ver.3.7+。3.7+.你可以使用你选择的编辑器来编写脚本。

4. 安装pyodbc模块4.0.26+。

5. 运行Connect Bridge管理工作室并。

5.1. 为Exchange添加一个账户(账户-添加账户)。为了添加账户,你应该选择连接器MGEXPlugin2010,并使用第1点中提到的证书。

5.2. 打开 "新建查询 "选项,然后打开 "连接浏览器"。找到Exchange连接器并展开它,直到看到DefaultConnection。右键单击DefaultConnection并选择Get Connection string。复制ODBC连接字符串,因为你需要它来传递给脚本。

5.3. 使用 "新建查询 "选项来测试一个可以在Exchange中访问所需内容的查询。

Image

我们将在这里做一个查询示例,但您应该在这里输入您要在 Exchange 中查找的内容。点击 "新建查询 "后,打开左侧的 "连接浏览器"。找到 Exchange 连接器(MGEXPlugin2010)并打开,直到看到 "表 "选项。我们可以看到,该模式包含一个名为 "Message "的 "表",因此我们可以将查询构建为 SELECT * FROM Message WHERE CreationDate >= '2019-01-01 00:00:00' LIMIT 10; 从 Exchange 的电子邮件列表中选择 10 个在 2019 年 1 月 1 日之后创建的条目。请再次注意,虽然看起来我们是在直接使用数据库,但事实并非如此。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: 22.07.2019 

''' 

  

import sys 

import os 

import pyodbc 

  

from argparse import ArgumentParser 

from argparse import RawDescriptionHelpFormatter 

  

__all__ = [] 

__version__ = 0.2 

__date__ = '2019-07-22' 

__updated__ = '2019-07-22' 

  

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 保存这些参数

- query 包含我们要运行的查询,并作为参数输入

- connstr 保存作为参数的 ODBC 连接字符串,我们将其传递给 pyodbc 模块以创建 ODBC 连接

- conn 是 ODBC 连接

下面是我们的脚本在做什么

- 第 70 至 78 行的目标是从命令行参数输入中获取 connstr 和 query 变量。

- 在第 80 行,我们使用 conn 打开数据库游标

- 在第 82 行,我们执行从命令行获取的 SQL 查询

- 在第 83 行至第 92 行中,我们循环读取结果,并从游标中逐行读取。

-当 cursor.fetchone 返回 None 时,我们将中断循环

- 如果在获取 ODBC 数据的过程中出现异常,我们也会中断循环并将问题打印输出

- 如果 fetchone 方法成功并返回了数据行,我们就会将原始数据行原样打印到输出端。这样做只是为了演示目的,但在现实世界中,你自然可以将其格式化为 xml、json、csv......或任何其他数据交换格式。或者,你也可以简单地使用原始数据行对象,在后续代码中执行自定义任务。

如何运行CBExchange.py脚本?

CBExchange.py脚本接受两个位置命令行参数:connstr和query。

我们需要从Connect Bridge管理工作室复制这些内容,如上所述(5.2点)。当你手头有了它们,打开一个命令行,cd到你保存脚本的文件夹,然后 运行你的Python脚本 将2个参数传递给它。

cmd-how-to-run-your-pyton

我还能做什么?进一步探索...

如前所述,可以建立更复杂的查询,这样你就能得到你想要的邮件。例如,如果你只想获得带有附件和特定创建日期的邮件,查询将是

SELECT * FROM Message

WHERE [HasAttachment] = true and [CreationDate] >= '2019-07-01 00:00:00';

你也可以探索可用的 "存储程序"。找到Exchange连接器(MGEXPlugin2010)并展开,直到你能看到 "存储程序 "选项。同样,这些存储程序是Connect Bridge的API集成,不是实际的数据库存储程序。但使用它们的方法和它们是一样的。

在此截图中可以看到一些可用的存储程序。

CB Exchange Server Sync - 如何同步Outlook日历?
你可以看一下SP_SELECT_DEFAULT_FOLDER_INBOX,以获得一个简单的存储过程(没有强制参数),或者SP_SEND_MESSAGE,以获得一个更复杂的存储过程。

限制因素

Connect Bridge工具只适用于Windows操作系统,因为没有ODBC Linux客户端库。所以,要想使用这个工具,你需要一台Windows机器。

结论

我们已经看到了如何使用Connect Bridge集成平台在Python中访问Exchange数据,这很容易做到。现在想象一下,你在这篇文章中所看到的,在微软Dynamics CRM和微软Exchange中也是可以实现的是的,在Connect Bridge中这是可能的,而且方法也是类似的......你只需要为你想要的特定软件挑选连接器,然后就可以了。

如果你想了解目前Connect Bridge的连接器,可以去的地方是 https://www.connecting-software.com/connectors/

连接器-列表-连接-桥梁-Python

如果您想知道这一大组连接器中哪些是最新的,请查看 Connect Bridges Dynamics 365 财务与业务和 Dynamics 365 Business Central 连接器,两者都基于 OData 协议。 或者看看 OPC UA 连接器。是的,我知道这似乎是一个完全不同的用例....。但事实上,你可以使用相同的工具访问 OPC UA 服务器。为了让你了解这种集成的结果,请看 Connect Bridge 的例子。 IIoT展示.

我们希望这篇文章对你有所帮助

这里还有一些我们在博客上讨论其他整合可能性的帖子。


关于作者

Ana Neto

作者 Ana Neto, 技术顾问 于 Connecting Software。

"自 1997 年以来,我一直是一名软件工程师,最近开始喜欢写作和公开演讲。您对本文有任何问题或评论吗?欢迎在下方留言!"

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.