使用Java从 Microsoft Exchange Server 获取数据
在软件行业,许多程序需要您需要从某种以前存在的商业软件中获取的信息。换句话说,您可能会遇到与 Microsoft、Salesforce、SAP 和其他软件巨头的软件集成的需求。而且,虽然这看起来很吓人,但你可以做到!让我来告诉你怎么做。
需要与 Microsoft Exchange Server 集成
与所有类型软件集成的最常见方式是使用它们的 API。大型软件公司提供它们正是为了使集成成为可能。
我们以 Microsoft Exchange 为例。您可以在Java中使用 Exchange 的 API 执行的不同操作是:
- 阅读电子邮件。
- 发电子邮件。
- 从日历上的约会中获取信息。
- 插入新约会。
- 编辑现有约会。
- 从任务列表中获取信息。
- 插入新任务。
- 编辑现有任务。
- 从公用文件夹读取。
- 写入公用文件夹。
如何与 Microsoft Exchange Server 集成?
从Java与 Exchange 集成的最传统方法曾经是Exchange Web 服务 (EWS) 。
- EWS SDK 是一个基于 SOAP 的 API 。
- 它作为 Microsoft Exchange 2007 的一部分推出。
- 它不容易使用,但真正的问题是,早在 2018 年 7 月,微软就宣布他们将不再进行任何功能更新。
微软图形
此外,从 2020 年 10 月 13 日起,Microsoft 预计使用 Exchange Web Services for Office 365 集成的每个人都可以切换到 Microsoft Graph。此外,从 2020 年 10 月 13 日起,将停止对 Exchange Web 服务 (EWS) 中的基本身份验证的支持。
微软希望一切都转移到OAuth和Microsoft Graph 。 Microsoft Graph 于 2015 年随 Office 365 一起推出。它通过单个端点将调用委派给多个 Office 365 云服务。在Microsoft Graph中,您有两个选择:
- Microsoft Graph 数据连接。
- 微软图形 API。
Microsoft 非常清楚您可以使用他们的 API 做什么和不可以做什么,因此最好事先检查一下。如果(且仅当)您想要处理大数据或需要详细同意时,您应该查看 Microsoft Graph 数据连接。如果不是这种情况,您需要常规 API,这是最常见的选项。
当前存在两个版本的Microsoft Graph REST API -版本 1.0 和 beta 。您可以查看测试版,但对于任何认真的开发,您自然应该保持生产版本 1.0。对于该版本,请务必阅读文档并学习Java SDK。
连接到 API 的方法
我们可以通过两种方式连接到 API:
- 微软图形 API。
- 集成平台。
微软API
当您进入实际使用 API 的部分时,您应该首先获得:
- Microsoft 帐户:可以是公司或学校帐户。获取应用程序 ID。
- 注册您的应用程序:使用以下方法注册您的应用程序:
- Microsoft 应用程序注册门户。
- Azure Active Directory 管理门户。
- 应用程序 ID:注册后,将为您的应用程序创建一个应用程序 ID,并显示在新应用程序的属性页面上。
您应该将 Azure Active Directory 管理门户用于企业级应用程序。
注意: Microsoft Graph 一直在变化。查看更改日志以了解已经发生的更改(自 2015 年 12 月以来)。如果您想使用它,请确保检查 API 的当前生产版本。
集成平台
- 您可以将集成平台视为可以放置在您和 API 之间的薄层。
- 您为集成平台编写代码,这是*简单得多*。
- 然后是平台工作的整合,翻译和与API“对话”。与 API 不同的是,您需要付费才能使用集成平台,但通常可以从免费试用开始。
- 示例:连接桥平台
Connect Bridge Platform:这个特定集成平台的好处在于它确保了向前和向后兼容性。这意味着您使用 Connect Bridge 构建Java代码,然后管理员可以升级到新的 Exchange 版本,Microsoft 可以启动新版本的 API。而且您不必担心任何这些。
集成平台的工作原理
- Connect Bridge 将 SQL 语句转换为 API 调用。
- 您放在代码中的是标准 SQL。您可以编写普通的 SELECT、UPDATE、INSERT 和 DELETE 语句。
- 它的工作原理就像您使用 JDBC 从关系数据库获取数据和从关系数据库获取数据一样。
- 您甚至可以使用存储过程。
注意:这只是一个抽象层。实际上,您访问的是 API,而不是 Microsoft Exchange 的数据库。
集成平台的问题
某些集成平台的问题在于它们只能在特定环境中工作,但在 Connect Bridge 的特定情况下,这不是问题,因为您可以在以下环境中运行它:
- Azure 构建的 SaaS 平台。
- 本地/自托管(在您自己的虚拟机或云服务器上)。
执行
在本节中,我们将看到如何使用Connect Bridge Management Studio将我们的应用程序集成到 API。
方法
假设 Exchange 和 SharePoint 实例已经存在,以下是您需要遵循的准备步骤:
1.准备好您的目标系统登录信息(在本例中为 Exchange 和 SharePoint)。
2.安装连接桥。
3.运行 Connect Bridge Management Studio。
- 添加 SharePoint 帐户(帐户 - 添加帐户)。要添加帐户,您应该选择连接器 CBSharePointConnector 并使用第 1 点中的凭据。
- 添加 Exchange 帐户(帐户 - 添加帐户)。要添加帐户,您应该选择连接器 MGEXPlugin2010 并使用第 1 点中的凭据。
- 对于每个帐户,请确保测试连接,以便您知道使用的凭据和参数一切正常。
4.打开新查询选项,然后打开连接浏览器。找到 Exchange 连接器并展开它,直到您看到 DefaultConnection。右键单击 DefaultConnection 并选择选项 Get Connection 字符串。您将需要它来将其传递给脚本,因此复制 JDBC 连接字符串。
5.打开新查询选项,然后打开连接浏览器。找到 SharePoint 连接器并展开它,直到您看到 DefaultConnection。右键单击 DefaultConnection 并选择选项 Get Connection 字符串。您将需要它来将其传递给脚本,因此复制 JDBC 连接字符串。
示例:在下面的示例中,我们讨论了用于集成 Microsoft Exchange 和 SharePoint 的Java代码。
Java
// Java Program to demonstrate
// integration of Exchange and
// SharePoint
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
class Program {
public static void main(String[] args)
throws SQLException, ClassNotFoundException
{
Class.forName("com.cnsconnect.mgw.jdbc.MgDriver");
// STEP 1:Create a JDBC connection
// for each target server you get
// the data for the connection string
// from Connect Bridge
String exchangeConnectionString
= "jdbc:MgDriver:IMPL=CORBA;ENC=UTF8;"
+ "HOST=123.456.789.000;PORT=8087;"
+ "UID=demouser;PWD='password';"
+ "ACC=accountExchange;";
String sharepointConnectionString
= "jdbc:MgDriver : IMPL = CORBA; ENC = UTF8;"
+ "HOST = 123.456.789.000; PORT = 8087;"
+ "UID=demouser; PWD = 'password';"
+ "ACC = accountSharePoint;";
Connection exchangeConn
= DriverManager.getConnection(
exchangeConnectionString);
Connection sharepointConn
= DriverManager.getConnection(
sharepointConnectionString);
Statement exchangeSt
= exchangeConn.createStatement();
System.out.println("Connecting to Exchange...");
// STEP 2: Provide an appropriate
// object like a ResultSet +
// STEP 3: Fill the object with data
// from the source server
ResultSet exchangeRs = exchangeSt.executeQuery(
"SELECT * FROM [Appointment]");
// Create a new statement for
// inserting PreparedStatement
// using JDBC
sharepointSt = sharepointConn.prepareStatement(
"INSERT INTO [Calendar] "
+ "([Title],[Description], [Location],"
+ "[StartTime], [EndTime]) "
+ "VALUES ( ?, ?, ?, ?, ?)");
// STEP 4: Manipulate the data or
// apply a workflow rule (or both)
// in this sample: check if the
// appointment is private,
// if not, insert it into SharePoint
while (exchangeRs.next()) {
Boolean isPrivate
= exchangeRs.getBoolean("IsPrivate");
if (isPrivate != null & amp; & isPrivate) {
System.out.println(
"Skipping '"
+ exchangeRs.getString("Subject")
+ "'");
continue;
}
// Fill these parameters with values
// for the SharePoint account
sharepointSt.setString(
1, exchangeRs.getString("Subject"));
sharepointSt.setString(
2, exchangeRs.getString("Body"));
sharepointSt.setString(
3, exchangeRs.getString("Location"));
sharepointSt.setTimestamp(
4, exchangeRs.getTimestamp("StartDate"));
sharepointSt.setTimestamp(
5, exchangeRs.getTimestamp("EndDate"));
System.out.println(
"Inserting '"
+ exchangeRs.getString("Subject") + "'");
// STEP 5: Insert data into
// the target server
sharepointSt.execute();
}
// STEP 6: Clean up and
// lose the connections
exchangeRs.close();
exchangeSt.close();
sharepointSt.close();
exchangeConn.close();
sharepointConn.close();
}
}
输出: