`
wangpx
  • 浏览: 202416 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

如何用java远程访问Domino邮箱数据1

    博客分类:
  • java
阅读更多

应用场景

我们需要远程访问 IBM Lotus Domino R6 服务器,从中获取用户邮箱的邮件信息等关键数据。我们不需要提供每一个用户密码以及 ID 文件。

技术关键词

Java

Java Lotus Notes/Domino 是理想的开发组合。

DIIOP

IIOP Internet Inter-ORB Protocol 一种传输层协议。它用于 CORBA 2.0 及兼容平台上。 IIOP 协议是要建立以下几个部分:一个 IIOP HTTP 的网关,使用这个网关可以让 CORBA 客户访问 WWW 资源;一个 HTTP IIOP 的网关,通过这个网关可以访问 CORBA 资源;一个为 IIOP HTTP 提供资源的服务器,一个能够将 IIOP 作为可识别协议的浏览器。

其中 ORB Object Request Broker( 请求对象代理 ) 一个中间件 。它可以建立对象之间的 client/server 关系。通过 ORB ,一个 client 可以透明的引用同一台机器上或网络上的一个 server 对象的方法。 ORB 解释该调用并负责查找一个实现该请求的对象,找到后,把参数传给该对象,调用它的方法,最后返回结果。

那么, DIIOP Domino IIOP 什么意思呢 就是一个服务器端的任务 通过 Domino ORB 来使得 Domino Server Java applets 交互 双方使用 IIOP 来交互和交换对象数据。

IOR

IOR Interoperable Object Reference

实际上,就是 Domino 服务器上的一个文件 diiop_ior.txt 的内容,类似于:

IOR:01012d032900000049444c3a6c6f………………………

,它在 c:\lotus\domino\data\domino\html 文件夹下。

客户端 java 程序向 domino 服务器发出 CORBA 请求 服务器通过 HTTP 协议返回给客户端 IOR 字符串, 之后客户端通过 IIOP 协议与服务器进行通讯。

从这一点来看, IOR 实际上是一个对象的字符串编码,包含对 Domino 服务器的 CORBA 访问的识别信息。客户 java 程序 将字符串 IOR 解码,就可以用它来寻找到对应的主机并建立远程会话了。

Domino对象

Domino对象类的结构基于包容模型,包容模型定义了对象的范围。容器对象通常被用来访问它所包含的子对象。
关闭一个容器对象意味着其包含的全部子对象也将被关闭。例如,你建立了一个Database对象,使用它创建了一个Document对象,如果 关闭了 Database对象,Document 对象也会随之关闭。如果容器对象超时,它将会被自动关闭,其包含的对象也将被自动关闭。因此你应该在容器对象超时或关闭前保存你的任何改变。

Domino Database

Domino 中的 Database ,指的是在一个名字下存储的,一个集合,包含了 Document 以及相应的 form view folder Java 中有 lotus.domino.Database

我们通常可以通过 session 对象的 getDatabase 方法,或者 DbDirectory 对象的 getFirstDatabase/ getNextDatabase 方法,来获取 Database 对象的实例。

Domino View

Database 集合中有着各种 View Java 中有 lotus.domino.View 。可以通过 Database 对象的 getView 方法,来获取 View 对象的实例。

Domino Document

Domino 中的 Document ,指的是在一个 Database 的一个条目,包含了 fileds text numbers graphics 等等。 Java 中有 lotus.domino.Document

可以通过 Database 对象的 getView 方法,来获取 View 对象的实例。

环境准备

客户端 java 开发:

安装 Lotus Notes Client

安装 Eclipse 3.1 with Eclipse-JDT-SDK

安装 JRE 1.3.1 Lotus Notes/Domino R5/6 版本使用的是 Java 1.3.1 ,所以必须安装该软件以使用正确的版本来编译项目。( Lotus Notes/Domino 7 使用 JDK 1.4 。)虽然许多 Java 代理和程序都可以编译,而且没什么问题,但可能会陷入另一些问题,比如使用一个 JDK 版本构建程序,却在另一个版本上运行。

从服务器端 Lotus 目录下复制 NCSO.jar 以及 NCSO.cab 文件。远端访问 Domino Server ,需要这个 jar 包。

Domino 提供了两个 JAR 文件,用于编程访问 Domino 对象。这两个文件是 Notes.jar NCSO.jarNotes.jar 用来访问 本地的 Domino 服务器(此时 Lotus Domino Java 程序运行在相同的服务器上)。NCSO.jar 包含了用来访问远程服务器的其他 CORBA/IIOP 代码。

在决定使用哪个 JAR 文件时,请考虑以下因素:

  • 运行的 Java 程序和 Lotus Domino 的相对关系如何?如果它们运行在相同的机器上,那么使用 Notes.jar 可以获得更好的性能。
  • 您关心可扩展性吗?即使现在您是在相同的机器上运行 Java 程序(单独的 Java 程序和非 J2EE 的程序)和 Lotus Domino ,将来您可能会发现需要将其扩展到专用的服务器上。在这种情况中,请使用 NCSO.jar ,这样可以获得更好的适应能力。
  • Java 程序要在一个应用服务器上运行吗?在 WebSphere 的情况中,即使它与 Lotus Domino 在相同的机器上,也需要使用 NCSO.jar

  如果你不用超级管理员用户名密码创建连接 session ,而是采用 Domino Server ID ,那么请从 Domino 服务器上 Lotus 目录下复制一个 server.id 文件以备用。

如果你想直接使用 diiop_ior.txt 把这个 diiop_ior.txt 复制到本地。

Domino 服务器端配置:

必须配置的项目:

必须设置 Domino 服务器监听 IIOP 请求

首先确保安装了 DIIOP ,你可以在安装过程中选择 DIIOP ,这样当安装结束,启动 Domino Server Console 时,就会看到提示“

DIIOP Server     Listen for connect requests on TCP Port:63148

DIIOP Server     Ultility task ”。

可以在 Domino Console 中执行 show task load diiop 命令,可以帮助判断现在是否已经安装了 DIIOP 。如果还没有安装,请从 Domino 安装光盘上安装 DIIOP

 

否则,就要修改 lotus 目录下的 Notes.ini 文件了。找到以 ServerTask 开头的一行,找找看等号后面的字符串中是否有 DIIOP ,如果没有,就加上一个,然后重新启动 Domino Server 。这样, Domino 启动时就会自动加载 DIIOP

ServerTask 一行类似于:

ServerTasks=Update,Replica,Router,AMgr, AdminP,CalConn,Sched,DIIOP,HTTP,LDAP

 

如何获取 IOR

DIIOP 进程启动时,它在 Domino HTTP 根目录( Windows Domino 默认的安装目录为 C:\lotus\domino\data\domino\html )中创建一个名为 diiop_ior.txt IOR Internet Object Reference )对象。

如何得到这个 diiop_ior.txt 内容 ( 也就是 IOR ) ,有两个办法:

第一个就是,您通过 HTTP 方式向服务器请求这个文件。那么这个时候,如果您使用 Lotus Domino 作为 HTTP 服务器,就必须告诉 DIIOP 将这些文件放到您的 HTTP 服务器的根 HTML 目录中。配置方法如下所示:

 

1.        运行 Domino Admin 6 ,点击 “XXX Domain” 图标,打开 Domino Server 文档。

2.        选择 Internet Protocols 属性页 - DIIOP 子属性页。

3.        External HTML directory 字段中,输入非 Domino HTTP 服务器的根 HTML 目录的完整路径名。

4.        保存这个 Server 文档,并重新启动 DIIOP

第二个办法,是把这个 diiop_ior.txt 复制到客户端机器上,直接使用

 

TCP/IP 连接检查:

远程访问还需要设置 Domino Server 和客户端进行 TCP/IP 连接。 Domino Server 必须能够通过 TCP/IP 进行访问。必须能够用 Internet 名称从客户端 ping 到服务器。

DIIOP 设置:

检查 Domino Directory Server 文档。转至 Ports 选项卡,然后转向 Internet Ports 选项卡。查看 Web 选项卡(用于 HTTP )并找到 DIIOP 选项卡。这些部分有用于指定端口号以及启用 / 禁用端口的字段。通常, HTTP 的端口号是 80 DIIOP 的端口号是 63148 。下图显示了 Internet Ports--DIIOP 选项卡:

 

No.

Items

Descriptions

1

Name and Password

DIIOP 验证需要名称和密码

2

Anonymous

DIIOP 验证不需要名称和密码

3

Enforce server access settings

DIIOP 使用 Security 选项卡下的 Server Access 设置

 

如果访问数据库时不知道文件名称(例如,要使用 DbDirectory.getFirstDatabase ),那么必须允许通过网络浏览文件名。转至 Internet Protocols 选项卡、 HTTP 选项卡和 R5 Basics 选项卡。然后将 “Allow HTTP clients to browse databases” 设为 Yes


 

配置权限:

必须给你当前建立 session 的用户配置权限,否则你将会遇到下面的错误:

 

NotesException: You must have permission to sign documents for server based agents

    at lotus.domino.NotesExceptionHelper.read(Unknown Source)

    at lotus.domino.NotesExceptionHolder._read(Unknown Source)

    at lotus.priv.CORBA.iiop.RepImpl.invoke(Unknown Source)

    at lotus.priv.CORBA.portable.ObjectImpl._invoke(Unknown Source)

    at lotus.domino.corba._IDocumentStub.send(Unknown Source)

    at lotus.domino.cso.Document.send(Unknown Source)

    at SendMail.send(SendMail.java:203)

    at SendMail.main(SendMail.java:28)

转至 Security 选项卡,找到“ Programmability  Restrictions ”,在“ Run unrestricted methods and operations: ”和“ Sign agents to run on behalf of someone else: ”后面输入你的用户名:

 

总之,如果你遇到了权限错误,就到这里来配置。

 

 

开始编写

Add External JARs

Eclipse 3.1 ,选中你的项目,右键菜单中“ Build Path à Add External Archives ”,在文件选择对话框中找到并选中你前面复制到本地的 NCSO.jar ,如下图所示。

 

添加了 JAR 文件之后,可以使用项目中 Notes Java API 定义的类和接口。 Domino Designer on-line help 中有关于 Notes Java API 的文档。

然后 选择 JRE System Library 采用 1.3.1 版本的。

获取 IOR

首先,我们去获取 IOR

 

还是前面说过的两种办法。

第一种,与 Domino Server 联系获取:

Code

String dominoHost = "192.168.1.223";  // 这里填写主机名或 IP 地址

String strIOR = null;

      URL url = new URL("http://" + dominoHost + "/diiop_ior.txt");

      InputStream in = url.openStream();

      BufferedReader br = new BufferedReader(new InputStreamReader(in));

      for (boolean bExit = false; !bExit; ) {

        String line = br.readLine();

        if (line == null) {

          bExit = true;

        }

        else {

          if (strIOR == null)

            strIOR = line;

          else

            strIOR = strIOR + line;

          if (strIOR.startsWith("IOR:"))

            bExit = true;

        }

      }

      br.close();

第二种,取得本地文件:

Code

FileInputStream fin = new FileInputStream("c:\\diiop_ior.txt");

InputStreamReader fisr = new InputStreamReader(fin);

BufferedReader br = new BufferedReader(fisr);

String ior = br.readLine();

fin.close();

 

创建 session

我们调用 NotesFactory createSessionWithIOR 方法,通过前面获取的 IOR ,创建一个 session 对象。

Code

Session s = NotesFactory.createSessionWithIOR(ior,

                                 "super admin" ,"admin password");

 

打开 names.nsf

我们调用 session getDatabase 方法,打开指定服务器上的 names.nsf ”数据库

Code

final static String DB_NAMES = "names.nsf";

Database dbCache = s.getDatabase(s.getServerName(),

                                      DB_NAMES, false);

 

得到 Users View

我们调用 Database getView 方法,打开指定数据库上的 ($Users) ”视图

Code

View view = dbCache.getView("($Users)");

 

遍历 Users View

我们可以遍历指定数据库上的 ($Users) ”视图,得到每一个用户的 Document

也可以指定一个用户,专门取得他的 Mail File

Code

Document docKey = view.getDocumentByKey("zheng yun");

                        if (docKey == null)

                      System.out.println("docKey not found!");

                   else

                     {

                          strMailFile = docKey.getItemValueString("MailFile");

                      if (strMailFile == null)

                              System.out.println("strMailFile is null!");

                      else

                              System.out.println("strMailFile = " + strMailFile);

                }

输出结果就是: mail\zyun.nsf 或者 mail\zyun

这样,我们就知道了该用户的邮箱所在的数据库文件的路径了。

 

打开邮箱数据库文件

知道了一名用户的邮箱文件名称,我们可以再用 session getDatabase 方法打开该数据库:

Code

Database dbMail = s.getDatabase(s.getServerName(),

    "mail\\zyun.nsf", false);

if(dbMail == null)

    System.out.println("cannot open database");

 


 

分享到:
评论

相关推荐

    如何用java远程访问Domino邮箱数据

    Java远程访问Domino邮箱数据是通过使用Lotus Domino Java API(Lotus Domino JNA或Lotus Domino Access for Java)来实现的。这个过程涉及到多个步骤和技术,包括理解Lotus Domino的架构、设置Java环境以及使用特定...

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino

    java访问domino,通过http访问Domino,java快速访问Domino,java集成lotus domino 完全提供源码 界面请查阅 https://blog.csdn.net/weijia3624/article/details/113108704

    Java访问Domino的编程指南.doc

    Java 访问 Domino 对象可以使用 Domino API 读取 Domino 数。 Java 访问 Domino 对象需要了解 Domino 的基本结构和 Java 的编程语言特性。同时,Java 访问 Domino 对象需要经历预备步骤、JDK 及 IDE、API 及 访问...

    使用Java mail API访问Lotus Domino邮箱

    在本场景中,我们将深入探讨如何使用Java Mail API来访问Lotus Domino邮箱系统。Lotus Domino是由IBM开发的企业级协作平台,其中包含了电子邮件、日历、任务等功能。 首先,为了与Lotus Domino服务器进行交互,你...

    java访问domino数据库.rar

    - 压缩包中的“Java-CORBA访问远程Domino服务器.doc”可能涵盖了使用Common Object Request Broker Architecture (CORBA)来访问远程Domino服务器的方法。CORBA提供了一种跨平台的分布式对象模型,允许不同系统间的...

    用java访问domino对象

    访问 Domino 对象使用 Java 本文主要介绍了使用 Java ...使用 Java 访问 Domino 对象需要了解 lotus.domino 包的使用和 NotesFactory 类的方法,了解本地调用和远程调用的区别,并且使用 NotesThread 类来管理线程。

    java连接Lotes邮件服务器(Domino) 读取邮件内容附件完整实例

    1. **连接设置**:使用JNDI(Java Naming and Directory Interface)或Lotus Java API(LotusJCA)来配置与Domino服务器的连接。这涉及到设置服务器名称、数据库路径、用户名和密码等信息。 2. **打开数据库**:...

    java连接domino帮助文档

    1. **JDBC驱动**:尽管Lotus Domino本身并不直接支持JDBC(Java Database Connectivity),但IBM提供了JDBC桥接器,允许通过JDBC接口访问Domino数据。这使得Java应用程序能够像操作关系型数据库一样操作Domino数据库...

    Domino和Java互相访问.doc

    1. **Domino与Java的互操作性** - Domino是IBM的一款协作软件,主要用于电子邮件、日历、任务管理等。它支持Java技术,允许开发者使用Java进行扩展和集成。 - 从描述中可以看到,Domino 6.0支持JDK 1.3和JSDK 2.0...

    Java访问Domino服务器.docx

    在《Java 访问 Domino 服务器》文档中,我们将学习如何使用 Java 语言访问 Domino 服务器。Domino 服务器是一个功能强大的电子邮件服务器,它提供了许多有用的功能,如全文检索、安全性和开发时效等。通过 Java 语言...

    Java 对 Domino 的访问

    Java对Domino的访问是IBM Lotus Domino开发中的一个重要主题,它允许开发者利用Java语言与Domino服务器进行交互,实现各种功能,如数据存取、邮件处理、应用逻辑控制等。在IBM官网上,这一主题被详细解读并分为上下...

    java webservice flash在domino中的使用

    1. **创建Java Web服务**:编写Java类,定义需要暴露的服务方法,使用JAX-WS或Apache CXF等工具将Java类部署为Web服务。 2. **配置Domino**:在Domino服务器上设置Web服务,确保HTTP服务和Java运行时环境已启用,并...

    Domino的Java编程指南

    要使用Java访问Domino对象,首先需要在环境中配置JDK和IDE,例如Eclipse或IntelliJ IDEA。然后,引入Lotus Domino的JAR库,这些库提供了访问Domino对象的API。常见的访问协议有IIOP(Internet Inter-ORB Protocol)...

    java调试domino邮件常见问题

    - 使用`ping`命令检查Domino服务器是否可访问。 - 使用`telnet`命令测试端口是否开放,特别是DIIOP默认使用的端口63148。 - 检查防火墙设置,确保相应的端口没有被阻止。 如果出现任何网络连接问题,需要先解决这些...

    用Java 操作Domino 数据库例子

    以下是一个使用Java读取Domino数据库并将数据写入XML文件的示例代码: ```java package test; import lotus.domino.*; import java.util.*; import java.io.*; public class ReadThread1 implements Runnable { ...

    用java访问domino对象[收集].pdf

    ### 使用Java访问Domino对象详解 #### 一、概述 本文档主要介绍如何利用Java语言访问Domino对象,包括数据库、视图、文档等。这些操作对于开发基于Lotus Domino/Notes的应用程序至关重要。文中所述内容主要适用于...

    lotus domino java代理_获取传递值json

    Lotus Domino 是一种基于Notes技术的服务器端应用程序, Lotus Domino Java 代理是指在 Domino 服务器上运行的 Java 代理程序,可以用来处理用户请求、提供数据服务等。今天,我们将讨论如何在 Lotus Domino Java ...

    java连接domino lotus.domino

    Notes.jar lotus.domino.* java连接domino 没有分数的可以到 http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=50943&filename=DominoJSPArticle.zip&method=http&locale=worldwide

    java操作domino

    - Java API为开发者提供了通过Java应用程序操作Domino数据库的能力,使得可以在Java应用中实现对Domino数据的增删查改等功能。 3. **基本概念**: - **NotesThread**: 用于初始化和清理线程环境。 - **Sessions*...

Global site tag (gtag.js) - Google Analytics