使用java导入某个msn帐号的好友列表并发送消息
 
          导入信息的关键是如何对msn的通讯协议进行封装,这里会有两个选择,一个使用openfire(xmlapp协议),另外就是使用jml,前者配置起来相对复杂,但兼容性较好,openfire能够和任何im进行通讯,包括(skype、msn、smalltalk等)、后者对msn和smalltalk比较好,这里只介绍如何使用jml导入用户的msn好友列表.
         (比较郁闷的是,qq的通信协议随着版本的升级不断更改,因此对qq做类似的功能可能不太现实,可能需要和腾讯合作了呵呵).
 
         jml(Java Msn Manager Liberary)是sourceforge上的一个开源项目,相关jar包可在以下地址中下载:
http://huqilong.blog.51cto.com/attachment/200810/53638_1223373939.bmp
建议将其源码一块下载下来,因为需要里面的三个包支持包,jml-src-1.0b3.zip,将lib目录下的jar包copy到你的项目中,然后将jml-1.0b-full.jar包和上述三个包一起引入项目,现在可以写我们的代码了。其实直接copy源代码下的example/的两个类即可,他们分别是:BasicMessenger和SimpleMsn,直接运行simpleMsn就可以了,但是它会报错,原因是你需要传送msn的账户名和密码:代码如下所示:
 
修改main函数:
 
public static void main(String[] args) throws Exception
 {
  new SimpleMsn("123123123123@hotmail.com", "*********").start();
 }
运行下就可以得到我们需要的东东了。会在后台打印,这里面有很多监听接口,比如当登录成功时如何如何,当初始化完毕时如何如何等等,需要你自己来搞定了,我们取得用户列表的代码在这里:
 
private void listContacts()
 {
  MsnContact[] cons = messenger.getContactList().getContacts();
  System.out.println("您现在有:"+cons.length+"个联系人,列表如下!");
        for (MsnContact con : cons) {
            System.out.println("姓名:"+con.getDisplayName());
            System.out.println("email地址:"+con.getEmail());
            System.out.println("在线状态:"+con.getStatus());
            if (con.getStatus() != MsnUserStatus.OFFLINE) {
                System.out.print(con.getEmail()+"开始导入信息");
                messenger.sendText(con.getEmail(), "hello,这是测试信息,并无恶意!");
            }
//            System.out.println(con.getPersonalMessage());
        }
    }
 
 
呵呵,简单吧,如果要导入qq帐户的话用这个就不行了。等我研究出来再说吧!
 
         对他们的包解压然后加入我的一个小程序,个人根绝还是比较方便的,喜欢的话下载吧:
 
 
以下是使用方法:
 
 
 
/**
 * 为了让msn彻底退出,这里采用调用子进程的方法
 * 启动msn
 * 给子进程传递三个运行时参数
 * msn帐号   msn密码  和要传递的内容
 * 子进程取出的好友email列表通过进程输入流读出(对于父进程来说相当于输出流)
 * @author huql
 *如果不这样调用,内存可能不能释放,这是个问题
 */
public static void main(String args[]){ 
 System.getenv();
 String msnCount=[email]1234@hotmail.com[/email];
    String password="19820000";
    String message="你好,欢迎访问[url]www.17k.com[/url],更多精彩尽在其中!";
    String command="java -cp \"e:/workspace/user.17k.com/web/WEB-INF/lib\"/jml.jar; net.sf.jml.example.SimpleMsn "+msnCount+" "+password+" "+message;
 try {
  Process p=Runtime.getRuntime().exec(command);
  BufferedInputStream in = new BufferedInputStream(p.getInputStream());
  BufferedReader br = new BufferedReader(new InputStreamReader(in));
  String content=br.readLine();
  while(content!=null){
  System.out.println(content);
  content=br.readLine();
  }
 } catch (IOException e) {
  e.printStackTrace();
 }
 System.out.println("continue to excute other program...............");
}