使用 SMS 消息传递插件扩展 IBM Lotus Sametime Connect V7.5

学习如何通过构建 SMS 消息传递插件扩展新的基于 Eclipse 的 IBM Lotus Sametime Connect V7.5 客户机,该插件允许您直接从 Lotus Sametime 客户机向 Sametime 合作伙伴的移动电话或移动设备发送 SMS(Short Message Service,短消息服务)文本消息。

Kulvir Singh Bhogal, 电子商务顾问, EMC

Kulvir Singh Bhogal 是 IBM Software Services for WebSphere 的顾问,在全美国的客户站点上设计和实现 J2EE 解决方案。您可以通过 kbhogal@us.ibm.com 与 Kulvir 联系。



Mark Talbot (talbotm@us.ibm.com), 开发人员,Industry Solutions, EMC

Mark Talbot 是 IBM 的 Industry Solutions 的开发人员。您可以通过 talbotm@us.ibm.com 与 Mark 联系。



2006 年 9 月 04 日

IBM Lotus Sametime Connect V7.5 基于 Eclipse 平台。因此,如果您熟悉 Java 和 Eclipse 插件的开发,您就可以扩展 Lotus Sametime 客户机。在本文中,我们教您一些与获取 Lotus Sametime 客户机的可扩展性相关的概念。更具体地说,我们指导您开发一个名为 SMS Message 插件的 Sametime 插件。这个插件可以向 Sametime 合作伙伴的移动电话发送 SMS 消息。我们认为,您会更喜欢一个比大众化的 “Hello world!” 示例更真实、更有用的例子。

关于短消息服务(SMS)的一些短语

短消息服务(SMS)是在大部分现代数字移动电话中都提供的一种服务。SMS 允许移动电话用户向其他移动电话用户发送短消息(又名文本消息)。移动电话用户会发现,SMS 是一种与朋友、家庭、同事和其他移动通信者保持联系的快捷、不连续的途径。只要您看见移动电话用户的拇指在电话键盘上按动,就能够亲身体会到 SMS 消息的流行。

在短消息服务中,消息通过存储转发机制发送到短消息服务中心(SMSC)。中心随即尝试向指定的接收者发送消息。SMS 没有送达保证,因为消息传送是一种 “尽力而为” 的服务。尽管存在这方面的不足,但 SMS 已经有了为数众多的追随者。据估计,截止到 2004 年中,SMS 消息的发送数量已经达到令人惊讶的每年 5000 亿条。

通过电子邮件发送 SMS 消息

至此,您可能想知道 Lotus Sametime Connect 的 SMS Message 插件如何能够通过电子邮件发送消息。之所以能够如此,是因为美国主要的移动电话公司都允许您使用与通信者移动电话号码相关联的电子邮件地址发送信息。以下是一些主要美国移动电话供应商的电子邮件地址格式细目:

  • T-Mobile:电话号码@tmomail.net
  • Virgin Mobile:电话号码@vmobl.com
  • Cingular:电话号码@cingularme.com
  • Sprint PCS:电话号码@messaging.sprintpcs.com
  • Verizon:电话号码@vtext.com
  • Nextel:电话号码@messaging.nextel.com

例如,我们要向一个假想的 Sprint PCS 移动电话号 512-555-5555 发送 SMS 消息。为此,我们可以向 5125555555@messaging.sprintpcs.com 发送电子邮件。SMS Message 插件利用通过电子邮件发送 SMS 消息的能力。通篇文章,我们将可用来发送 SMS 消息的电子邮件地址称为 SMS 电子邮件地址。


SMS Message 插件预览

在开始构建 SMS Message 插件的旅程之前,最好先预览一下插件的外观如何。图 1 显示了正在运行的 SMS Message 插件。这个插件允许您注册一个用于向 Sametime 合作伙伴发送 SMS 消息的电子邮件地址。

图 1. 注册一个电子邮件地址
注册一个电子邮件地址

在为 Sametime 合作伙伴注册好一个 SMS 电子邮件地址之后,Sametime 用户就可以向合作伙伴的移动电话发送 SMS 消息了,如图 2 所示。

图 2. 发送一条 SMS 消息
发送一条 SMS 消息

与本文相关联的是一个 ZIP 文件,它包含我们的 Eclipse 项目工作空间的 ZIP 归档文件。要使用源代码,将把我们的工作空间解压到您的本机目录中。启动 Eclipse IDE 的时候,以 data 选项开头,后接该工作空间的位置。例如,如果您把我们的工作空间解压到目录 c:\eclipse\smsMessage 下,启动 Eclipse IDE 的命令如下:

eclipse – data c:\eclipse\smsMessage


JavaMail API

JavaMail API 是 Java SDK 的可选包。它允许 Java 应用程序读、写、发送电子消息(email)。我们假设您熟悉 JavaMail API。如果不熟悉,我们建议您首先阅读 developerWorks 教程 “JavaMail API 基础教程” 来熟悉 JavaMail API。我们使用 JavaMail API 通过电子邮件发送 SMS 消息。在本文撰写之时,JavaMail API 版本 1.4 已经发布;您可以从 Sun 开发者网络下载。

除了下载 JavaMail API,您还需要从 Sun 开发者网络下载 JavaBeans Activation Framework 标准扩展。在本文撰写时,JavaBeans Activation Framework 版本 1.1 已经面世;您可以从 Sun 开发者网络下载。

要使用 JavaMail API 发送电子邮件,需要两个 JAR 文件:一个是 JavaMail API 的 JAR 文件(specifically mail.jar),另一个是来自 JavaBeans Activation Framework 的 JAR 文件(activation.jar)。您创建一个插件保存这两个 JAR 文件(更多信息请参见 “创建插件项目来容纳 JavaMail API JAR 文件” 部分)。


找到您的本地邮箱(您的 SMTP 服务器名)

要发送电子邮件,Sametime 插件必须知道发送电子邮件的 SMTP 服务器。确保您有一个可用的 SMTP 邮件服务器;您需要服务器名和端口号(要获得这些信息,您可以去打扰一下您的网络管理员)。如果您不知道和 / 或无法获得 SMTP 服务器,您可自行安装一台以供测试。PostCast 服务器是邮件服务器程序的一个不错的、免费的选择,它可以使您的机器成为一台对外的 SMTP 邮件服务器。


获得并准备 Eclipse 3.2 IDE

我们假设您已经安装了 Eclipse 3.2 IDE。若尚未安装,可以访问 Eclipse 网站获取该应用程序。我们使用 Eclipse IDE 开发 SMS Message 插件。

启动 Eclipse IDE 并将目标平台改成 Lotus Sametime V7.5。把目标平台从 Eclipse 平台改成 Sametime 平台使您可扩展 Sametime 平台而不是扩展 Eclipse 平台。

把目标平台改成 Lotus Sametime V7.5 的操作步骤如下:

  1. 在 Eclipse 中,选择 Window - Preferences。
  2. 在 Preferences 对话框的左窗格中展开 Plug-in Development 项,随后选中 Target Platform。
  3. 右窗格中将出现 Target Platform Preference Page。单击 Browse 更改位置。
  4. 将您的目标平台更改为系统中包含 Lotus Sametime V7.5 插件目录的目录位置。例如,如果您把 Lotus Sametime V7.5 安装在默认位置,目标平台位置应为 C:\Program Files\IBM\Sametime Connect 7.5。
  5. 单击 Reload。即可看到 Sametime 插件如图 3 所示。
图 3. Sametime 指定的目标平台
Sametime 指定的目标平台

为 SMS Message 插件创建插件项目

为了使用 SMS 消息传递功能扩展 Sametime GUI,您需要创建一个插件。而要创建 SMS Message 插件,您需要一个在开发过程中容纳插件的插件项目。在 Eclipse 中创建插件项目的操作步骤如下:

  1. 选择 File - New - Project。
  2. 在 New Plug-in Project 向导中,选择 Plug-in Development - Plug-in Project。然后单击 Next。
  3. 键入 com.devworks.example.mail 作为项目名,然后单击 Next。
  4. 键入 SMS Message 作为插件名。键入 DeveloperWorks 作为插件提供者。参见图 4。
    图 4. SMS Message 插件
    SMS Message 插件
  5. 请注意,应该选中选项 “This plug-in will make contributions to the UI”。Sametime API 提供了一种扩展 Sametime UI 的途径。如果您仅扩展 Sametime UI,那么将其插入 Eclipse UI 并不是必要的。在这个例子中,您创建了一个 Eclipse 首选项页面,它扩展了 Eclipse UI。相应地,在 New Plug-in Project 向导中,我们指定将插件插入 UI。
  6. 接受其余默认值,并单击 Finish。

创建插件项目来容纳 JavaMail API JAR 文件

您创建一个单独的插件和插件项目来容纳 JavaMail API JAR 文件。因为 JavaMail API JAR 文件有一个单独的插件,您可以从 SMS Message 插件中分离辅助 JavaMail 特定的 JAR。因此,其他需要访问 JavaMail API 的插件可以从辅助插件中受益。

要创建 JavaMail 插件,按照前面的介绍,调用 New Plug-in Project 向导。键入 com.devworks.example.javax.mail 作为插件 ID。插件名为 JavaMail,插件提供者为 DeveloperWorks。在 Plug-in Options 部分,清除 “Generate an activator, a Java class that controls the plug-in ’ s life cycle” 和 “This plug-in will make contributions to the UI” 选项(参见图 5)。接受其余默认值,并单击 Finish。

图 5. JavaMail 插件
JavaMail 插件

下一步,向 JavaMail 插件中导入 JavaMail JAR 文件。为此,右击 com.devworks.example.java.mail 插件项目。在上下文菜单中选择 Import 打开 Import 向导。在 Import 向导中选择 General - File System,然后单击 Next。在接下来的窗口中单击 Browse。导航到包含 JavaMail JAR 文件的目录。从您先前下载的 JavaMail 包中选择 mail.jar 文件,然后单击 Finish(参见图 6)。

图 6. 导入 JavaMail JAR 文件
导入 JavaMail JAR 文件

重复上面的过程,从您先前下载的 JavaBeans Activation Framework 包中导入 activation.jar。

当您完成以后,这两个 JAR 文件就导入到了 JavaMail 插件项目中。最后,您需要编辑 META-INF/MANIFEST.MF 文件向外部插件(即 SMS Message 插件)公开 JavaMail 类。用下面显示的内容代替已存在的 MANIFEST.MF 文件的内容:

Manifest-Version: 1.0 
 Bundle-ManifestVersion: 2 
 Bundle-Name: SMS Message 
 Bundle-SymbolicName: com.devworks.example.javax.mail 
 Bundle-Version: 1.0.0 
 Bundle-Vendor: DeveloperWorks 
 Bundle-Localization: plugin 
 Bundle-ClassPath: activation.jar, 
 mail.jar 
 Export-Package: javax.activation, 
 javax.mail, 
 javax.mail.event, 
 javax.mail.internet, 
 javax.mail.search, 
 javax.mail.util

下一步,您需要向您的绑定的构建路径中添加 activation.jar 和 mail.jar。右击 com.devworks.javax.mail 插件,在上下文菜单中选择 Properties。此时将显示插件的属性。在左窗格中选择 Java Build Path。在右窗格中选择 Libraries 选项卡。单击 Add JARs 按钮。添加 activation.jar 和 the mail.jar,如图 7 所示。

图 7. 添加 JAR 文件
添加 JAR 文件

在编辑 JavaMail 插件清单文件以公开 JavaMail 类之后,您需要修改 SMS Message 插件,从辅助 JavaMail 插件中导入 JavaMail 类。为此,编辑 SMS Message 插件的 META-INF/MANIFEST 文件,修改后的 MANIFEST 文件显示如下:

Manifest-Version: 1.0 
 Bundle-ManifestVersion: 2 
 Bundle-Name: Send SMS 
 Bundle-SymbolicName: com.devworks.example.mail;singleton:=true 
 Bundle-Version: 1.0.0 
 Bundle-Activator: com.devworks.example.mail.Activator 
 Bundle-Vendor: DeveloperWorks 
 Bundle-Localization: plugin 
 Require-Bundle: org.eclipse.ui, 
 org.eclipse.core.runtime, 
 com.ibm.collaboration.realtime.people, 
 com.devworks.example.javax.mail, 
 com.ibm.rcp.realtime.livenames 
 Eclipse-LazyStart: true

特别注意 Require-Bundle 部分,建立 SMS Message 插件与 JavaMail 插件(由项目名:com.devworks.example.javax.mail 表示)之间的依赖关系。


SMTP 服务器首选项页面

使用首选项页面允许 Sametime 客户机用户指定自己的 SMTP 服务器名和端口信息,如图 8 所示。

图 8. Preferences 对话框
Preferences 对话框

Lotus Sametime 客户机公开扩展点,允许您向 Sametime 客户机首选项添加首选项页面。在首选项页面中,有三个首选项。第一个首选项是 SMTP 服务器名,第二个首选项是 SMTP 服务器端口。这些首选项的值用来向外发送电子邮件。第三个首选项是发送者电子邮件地址。这个地址表明了用来发送 SMS 消息的电子邮件地址。

在 Eclipse 中使用 Extension 向导创建首选项页面。关于如何使用 Extension 向导的更多信息请参阅 developerWorks 文章 “为 IBM Lotus Sametime Connect V7.5 设计 Google Maps 插件” 深入介绍了如何创建首选项页面的概念。

Extension 向导创建了名为 PreferenceConstants 的类,用于保存插件的常量。用以下代码代替自动生成的代码:

public class PreferenceConstants { 
	 public static final String SMTP_SERVER = "smtpServer"; 
	 public static final String PORT_NUMBER = "portNumber"; 
	 public static final String SENDER_ADDRESS = "senderAddress";"; 
 }

如您所见,分别有字符串常量存储 SMTP 服务器名、SMTP 服务器端口以及发送者电子邮件地址。

PreferenceInitializer 类(也是自动生成的)为首选项设置默认值。用以下代码代替自动生成的代码。可以看到,这段代码仅仅设置了 SMTP 服务器端口号一个值,这个值默认是 25。

public class PreferenceInitializer 
 extends AbstractPreferenceInitializer { 

	 public void initializeDefaultPreferences() { 
		 IPreferenceStore store = Activator.getDefault() 
				 .getPreferenceStore(); 		
				 store.setDefault 
				 (PreferenceConstants.PORT_NUMBER, 
				"25"); 
	 } 
 }

SMSPreferencePage 类(也是自动生成的)是表示首选项页面的类。需要再一次使用以下显示的代码代替自动生成的代码。在以下代码中,我们创建三个字段编辑器。每个字段编辑器分别对应一个首选项。SMSPreference 类使用网格布局。

public class SMSPreferencePage 
 extends FieldEditorPreferencePage 
 implements IWorkbenchPreferencePage { 

	 public SMSPreferencePage() { 
		 super(GRID); 
		 setPreferenceStore(Activator.getDefault().getPreferenceStore()); 
		 setDescription("Preferences for SMS Messaging."); 
	 } 
	
		 public void createFieldEditors() { 
		 addField( 
			 new StringFieldEditor(PreferenceConstants.SMTP_SERVER, 
			"SMTP Server:", getFieldEditorParent())); 
		 addField( 
			 new StringFieldEditor(PreferenceConstants.PORT_NUMBER, 
			"Port Number:", getFieldEditorParent())); 
		 addField( 
			 new StringFieldEditor(PreferenceConstants.SENDER_ADDRESS, 
			"Sender Address:", getFieldEditorParent())); 
	 }

上述代码提供的界面如图 8 所示,使 Sametime 客户机用户能够输入信息。


PostOffice 类和 sendMail 方法

通过电子邮件发送 SMS 消息看上去是一项困难的任务,但可以通过 com.devWorks.example.mail.PostOffice 类完成,在开发过程中,这个类保存在 com.devworks.example.mail 插件项目中。更具体地说,这个任务由它的静态 sendMail 方法负责完成的。

public static void sendMail(String smtpServer, int port, 
	 String body, String sender, String recipient) 
	 throws AddressException, MessagingException 
 { 
  
  Properties props = System.getProperties(); 
  props.put("mail.smtp.host", smtpServer); 
  props.put("mail.smtp.port", String.valueOf(port)); 
	    
  Session session = Session.getDefaultInstance(props, null); 

  // create a new message 
  Message msg = new MimeMessage(session); 

  // set sender and recipient 
  InternetAddress senderAddress = 
  new InternetAddress(sender); 
  msg.setFrom(senderAddress); 
  InternetAddress recipientAddress = 
  new InternetAddress(recipient); 
  msg.addRecipient(Message.RecipientType.TO,recipientAddress); 
	   
  // populate the message 
  msg.setText(body); 
  msg.setSentDate(new Date()); 
  
  // send the message 
  Transport.send(msg); 
 }

sendMail 方法利用 JavaMail API 实现业务功能 —— 发送电子邮件到指定接收者的 SMS 电子邮件地址(即我们可以发送 SMS 消息的地址)。在这个方法中,我们使用 SMTP 服务器信息(服务器名和端口)创建 javax.mail.Session 对象。然后,我们使用 Session 对象创建一个新的 javax.mail.internet.MimeMessage 对象。发送者和接收者的电子邮件地址字符串成为 javax.mail.internet.InternetAddress 对象。这些 InternetAddress 对象被指定为发送者(使用 Message 对象的 setFrom 方法)和接收者(使用 Message 对象的 addRecipient 方法)。

最后,填充消息主体,并且使用 javax.mail.Transport 对象发送电子邮件。

注意 sendMail 方法是如何处理异常 javax.mail.internet.AddressException 和 javax.mail.MessagingException 的。处理这些异常的重担落在方法的消费者 MailUtilities 类身上,稍后我们将介绍这个类。


AddressStore 类

向 Sametime 合作伙伴发送 SMS 消息的 SMS 电子邮件地址存储在属性文件中。您可以手动编辑该属性文件。

注意:该属性文件必须放在 SMS 消息绑定的上一级目录中。

文件格式很简单,就是 Sametime 合作伙伴 ID 后面跟着一个等号 (=),等号后跟着发送 SMS 的电子邮件地址。下面是一个属性文件内容的例子:

#Thu Jun 22 13:07:05 GMT-06:00 2006
talbotm@us.ibm.com=5555553434@cingularme.com
kbhogal@us.ibm.com=5555553434@cingularme.com

为了使用户获得一个更友好、更方便的体验,我们允许 Sametime 客户机用户以图形化的方式操纵属性文件的内容。要更新合作伙伴的 SMS 电子邮件地址信息,右击该合作伙伴,随后选择 Associate SMS Email 选项,如图 9 所示。在 “The PersonAction extension point” 部分中,我们介绍如何在右击合作伙伴时出现的上下文菜单中添加一项。

图 9. Lotus Sametime Connect 中的 Associate SMS Email 选项
Lotus Sametime Connect 中的 Associate SMS Email 选项

前面描述的属性文件通过 com.devworks.example.mail.AddressStore 类访问。AddressStore 类提供了 getter 和 setter 方法从属性文件中检索数据。getSMSEmailAddress(String partnerId) 方法返回给定的合作伙伴 ID 的 SMS 电子邮件地址。setSMSEmailAddress(String partnerId, String emailAddress) 为给定的合作伙伴 ID 设置 SMS 电子邮件地址。AddressStore 类也有一个私有方法 initAddressCache,首次调用公有方法 AddressStore 时调用该方法。下面的代码片段显示了一部分 AddressStore 类。注意 Properties 对象的存在,该对象存储属性文件数据。另外还要注意名为 init 的 Boolean 变量的存在。一旦使用 initAddressCache 方法初始化 AddressStore 类,这个变量就表示一个被设置为 true 的标志。

public class AddressStore { 
    public static Properties properties = new Properties(); 
    public static boolean init=false; 

    private AddressStore() { 
}

如下所示,initAddressCache() 方法读取属性文件,该属性文件存储与合作伙伴 ID 的名称值对应的 SMS 电子邮件地址。

private static void initAddressCache() { 
		 properties = new Properties(); 
		 URL propFile = Activator.getDefault().getBundle(). 
		 _getResource("address.properties"); 
		 try { 
			 InputStream inStream = propFile.openStream(); 
			 properties.load(inStream); 
			 inStream.close(); 
			 init = false; 
		 } catch (IOException e) { 
			 e.printStackTrace(); 
		 } 	
	 }

要获取 address.properties 文件的位置,您首先要获取共享绑定实例。从共享绑定实例中,得到 address.properties 的 URL 位置。通过 URL 位置,您可以打开读属性文件的流。然后从 InputStream 对象中加载属性。在加载 Properties 对象之后,关闭输入流,然后设置布尔型标志变量 (init) 值为 true,确定 AddressStore 对象已经被初始化。

AddressStore 类的 getSMSEmailAddress(String partnerId) 方法返回合作伙伴 ID 的 SMS 电子邮件地址。如果对于给定的合作伙伴没有电子邮件地址,就返回一个空的 String。在这个方法中,您首先检查 AddressStore 对象是否已经初始化。如果 AddressStore 对象还没有初始化,那么要初始化该对象。使用 Properties 对象的 getter 方法检索合作伙伴的 SMS 电子邮件地址。

public static String 
 getSMSEmailAddress(String partnerId) { 
	 String partnerEmail; 
	 if (!init) 
			 initAddressCache(); 
		 Object addressObject = properties.get(partnerId); 
		 if (addressObject != null) 
			 partnerEmail = (String) addressObject; 
		 else 
			 partnerEmail = ""; 
		 return partnerEmail; 
	 }

setSMSEmailAddress(String partnerId, String emailAddress) 方法将合作伙伴的名称值对设置为缓存 Properties 对象中的 SMS 电子邮件地址。此外,这个方法还会使用更新的或者新的名称值对更新 address.properties 文件。通过 initAddressCache() 方法,您从共享绑定实例的 getResource 方法中获得 URL。使用该 URL,创建 FileOutputStream 对象。通过该 FileOutputStream 对象,您使用更新的属性更新 address.properties 文件。

public static boolean 
 setSMSEmailAddress(String partnerId, String emailAddress) { 
		 boolean success = false; 
		 if (!init) 
			 initAddressCache(); 
		 properties.setProperty(partnerId, emailAddress); 
		 URL propURL = Activator.getDefault().getBundle() 
		 _.getResource("address.properties"); 
		 try { 
			 if (propURL==null) 
			 propURL = new URL("file:\\\\\\address.properties"); 
		 } catch (MalformedURLException e1) { 
			 e1.printStackTrace(); 
		 } 
		 String bundleLocation = Activator.getDefault() 
		 _.getBundle().getLocation(); 
		 File propFile = new File(bundleLocation + 
		 propURL.getPath()); 
		 FileOutputStream out; 
		 try { 
			 out = new FileOutputStream(propFile); 
			 String header = null; 
			 properties.setProperty(partnerId, emailAddress); 
			 properties.store(out, header); 
			 out.close(); 
			 success = true; 
		 } catch (FileNotFoundException e) { 
			 e.printStackTrace(); 
		 } catch (IOException e) { 
			 e.printStackTrace(); 
		 } 
		 return success; 
	 }

MailUtilities 类

com.devworks.example.MailUtilities 类包含许多加强 SMS Message 插件功能的方法。

public class MailUtilities {

showMessage(String message, String text) 方法是一种向 Sametime 客户机用户显示消息框的图形化实用方法。该方法的 text 参数表示消息的标题,message 参数表示消息框的主体。在下面的方法中,您在默认的构造函数中创建 Shell 对象。MessageBox 部件接受 Shell 对象作为构造函数的参数。然后,设置 MessageBox 对象的 message 和 text。之后,就向 Sametime 客户机用户显示消息框。

public static void 
	 showMessage(String message, String text) { 
		 Shell shell = new Shell(); 
		 MessageBox messageBox = new MessageBox(shell); 
		 messageBox.setMessage(message); 
		 messageBox.setText(text); 
		 messageBox.open(); 
	 }

MailUtilities 类的 setUserMail(String id) 方法显示对话框询问合作伙伴的电子邮件地址。用户提供的信息存储在属性文件中。我们再次使用 InputDialog 部件从用户处获取 Sametime 合作伙伴的 SMS 电子邮件地址。然后使用 AddressStore 类的 setSMSEmailAddress 方法保存用户提供的 SMS 电子邮件地址。

public static void 
	 setUserMail(String displayName, String id) {) { 
		 Shell shell = new Shell(); 
		 String dialogTitle = "Set SMS email address for " 
		 _+ displayName; 
		 String dialogMessage = "Enter the email address."; 
		 String initialValue = AddressStore.getSMSEmailAddress(id); 
		 IInputValidator validator = null; 
			 InputDialog dialog = new InputDialog(shell, 
			 dialogTitle, dialogMessage, initialValue, 
		 validator); 
		 dialog.open(); 
		 dialog.create(); 
		 String input = dialog.getValue(); 
		 int returnCode = dialog.getReturnCode(); 
		 if (returnCode == InputDialog.OK) 
			 AddressStore.setSMSEmailAddress(id, input); 
	 }

另一个 MailUtilities 类的工作方法是 sendSMSMessage 方法。这个方法向用户显示一个对话框,用户可在其中输入发送给 Sametime 合作伙伴的 SMS 消息(参见图 2)。为了通过电子邮件发送 SMS 消息,这个方法需要提供 PostOffice 的 sendMail 方法,该方法带有 SMTP 服务器和端口信息。从首选项存储中检索该信息。sendSMSMessage 方法向用户显示 InputDialog 部件,该部件收集要发送的 SMS 消息。

在用户单击 OK 后,您得到 InputDialog 为用户提供的响应。然后检查用户是否单击了 OK 或者 Cancel。如果用户单击 OK,就使用 PostOffice.sendMail() 方法。

public static void 
	 sendSMSMessage(String displayName, String id, String emailAddress) { 
		 String smtpServer = Activator.getDefault().getPreferenceStore() 
			 .getString(PreferenceConstants.SMTP_SERVER); 
		 int port = Integer.parseInt(Activator.getDefault().getPreferenceStore() 
			 .getString(PreferenceConstants.PORT_NUMBER)); 
		 String sender = Activator.getDefault().getPreferenceStore() 
			 .getString(PreferenceConstants.SENDER_ADDRESS); 

		 Shell shell = new Shell(); 
		 String dialogTitle = "Send SMS Message to " + displayName; 
		 String dialogMessage = "Enter an SMS Message."; 
		 String initialValue = ""; 
		 IInputValidator validator = null; 
		 InputDialog dialog = new InputDialog(shell, 
			 dialogTitle, dialogMessage, initialValue, validator); 
		 dialog.open(); 
		 dialog.create(); 
		 String body = dialog.getValue(); 
		 int returnCode = dialog.getReturnCode(); 
		 if (returnCode == InputDialog.OK) { 
			 if (emailAddress == null) { 
				 MailUtilities.showMessage("No email address 
				 found for:" + displayName, 
				"Partner not Found"); 
			 } else if ((smtpServer == null) || 
			 (smtpServer.trim().equals(""))) { 
				 MailUtilities.showMessage("No SMTP Server 
				 Specified.","SMTP Error"); 
			 } else if ((body == null) || (body.trim().equals(""))) { 
				 MailUtilities.showMessage("No Message to 
				 Send.","Message Error"); 
			 } else if ((sender == null) || (sender.trim().equals(""))) { 
				 MailUtilities.showMessage( 
						"No Reply to Email Address Specified.", 
						"Reply-to Address Error"); 
			 } 
			 else { 
				 try { 
					 PostOffice.sendMail(smtpServer, 
						 port, body, sender, emailAddress); 
				 } catch (AddressException e) { 
					 MailUtilities.showMessage( 
							"Problem with the specified 
							 address.","AddressError"); 
					 e.printStackTrace(); 
				 } catch (MessagingException e) { 
					 MailUtilities.showMessage("Problem with 
					 the message.","MessageError"); 
					 e.printStackTrace(); 
				 } 
			 } 
		 } 
	 }

org.eclipse.ui.popupMenus 扩展点

要在右击 Sametime 合作伙伴时出现的上下文菜单中添加菜单项,需要创建扩展 LiveNameActionDelegate 类的类。还必须在 plugin.xml 文件中添加条目。关于该主题的更多信息,我们建议您阅读 developerWorks Lotus 文章 “利用 LDAP 目录查看插件扩展 Lotus Sametime 客户机” 深入了解这个概念。

com.devworks.example.mail.AssociateSMSMailDelegate 类负责显示 GUI,允许您关联一个 Sametime 合作伙伴可以接收到 SMS 消息的 SMS 电子邮件地址。当调用 Associate SMS Email 上下文菜单项时,触发 run 方法,而该方法又调用 MailUtilities setUserMail 方法,向用户显示为选定的 Sametime 合作伙伴输入 / 更新 SMS 电子邮件地址的界面(参见图 1)。

public class AssociateMailDelegate extends LiveNameActionDelegate { 
	 public void run(IAction arg0) { 
        Person persons[] = getSelectedPersons(); 
		 Person person = persons[0]; 
		 if (person != null) { 
			 String id = person.getContactId(); 
			 String displayName = person.getDisplayName(); 
			 System.out.println("Associating Email for" + id); 
			 //$NON-NLS-1$ 
			 MailUtilities.setUserMail(displayName, id); 	 } 
	 } 
 }

要在右击 Sametime 合作伙伴时出现的上下文菜单中添加 Associate SMS Email 菜单项,需要在 plugin.xml 文件中添加如下代码。注意扩展点的定义是如何指向 AssociateMailDelegate 类的。

<extension 
       point="org.eclipse.ui.popupMenus"> 
    <objectContribution 
          adaptable="false"
          id="com.devworks.example.mail.prersonselection"
          objectClass="com.ibm.collaboration.realtime.livenames.PersonSelection"> 
       <action 
             class="com.devworks.example.mail.AssociateMailDelegate"
             enablesFor="1"
             id="com.devworks.example.mail.AssociateMailDelegate"
             label="Associate SMS Email"
             style="push"/> 
    </objectContribution> 
 </extension>

com.devworks.example.mail.SMSMessageDelegate 类负责调用 AddressStore 对象的 getSMSEmailAddress 方法,以从选定的 Sametime 合作伙伴中检索 SMS 电子邮件地址。这种检索在该类的 runWithEvent 方法被触发时发生,而当选中 Send SMS Message 上下文菜单项时触发 runWithEvent 方法。找到 SMS 电子邮件地址之后,使用 MailUtilities 类的 sendSMSMessage 方法发送电子邮件消息。

public class SMSMessageDelegate extends LiveNameActionDelegate { 
	 public void run(IAction arg0) { 
        Person persons[] = getSelectedPersons(); 
		 Person person = persons[0]; 
		 if (person != null) { 
			 String id = person.getContactId(); 
			 String displayName = person.getDisplayName(); 
			 System.out.println("Performing Lookup for" + id); 
			 //$NON-NLS-1$ 
			 String emailAddress = AddressStore.getSMSEmailAddress(id); 
			 MailUtilities.sendSMSMessage(displayName, id, emailAddress); 
		 } 
	 } 
 }

通过在 plugin.xml 文件中向现有扩展点添加另一个活动,即可将 Send SMS Message 菜单项添加到右击 Sametime 合作伙伴时出现的上下文菜单中。

<extension 
       point="org.eclipse.ui.popupMenus"> 
    <objectContribution 
          adaptable="false"
          id="com.devworks.example.mail.prersonselection"
          objectClass="com.ibm.collaboration.realtime.livenames.PersonSelection"> 
       <action 
             class="com.devworks.example.mail.SMSMessageDelegate"
             enablesFor="1"
             id="com.devworks.example.mail.SMSMessageDelegate"
             label="Send SMS Message"
             style="push"/>       
       <action 
             class="com.devworks.example.mail.AssociateMailDelegate"
             enablesFor="1"
             id="com.devworks.example.mail.AssociateMailDelegate"
             label="Associate SMS Email"
             style="push"/> 
    </objectContribution> 
 </extension>

结束语

短消息服务的普及是不可否认的。最近,SMS 已用来在移动电话用户之间发送二进制内容,如铃音。本文认识了 SMS 的普及,并且向您展示了如何扩展 Lotus Sametime Connect V7.5 客户机,从而向 Sametime 合作伙伴的移动电话和设备发送 SMS 消息。扩展 Sametime 客户机的能力来源于它基于 Eclipse 的架构。在本文中,我们向您展示了如何利用这种可扩展性,利用 JavaMail API 发送 SMS 消息。


下载

描述名字大小
Sample Eclipse plug-insametime_sms_src.zip10 KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Lotus
ArticleID=157552
ArticleTitle=使用 SMS 消息传递插件扩展 IBM Lotus Sametime Connect V7.5
publish-date=09042006