jdmail二次开发
jdmail提供4种接口:
1.URL参数传递:主要用于实现不同系统间跨平台、跨服务器的用户单点登录、统一验
证。
2.jdmail 本地开发接口 api:主要用于基于jdmail的二次开发,开发包部署在jdmail
同台服务上。
3.jdmail 远程开发接口api:主要用于嵌入其它应用系统,远程调用jdmail功能,实现
用户统一管理、单点登录、用户管理、邮件管理等功能。
4.jdmail  短信开发接口
5.jdmail  彩信及PlugIN开发接口
(一)URL参数传递
1)URL参数传递:
操作说明:
0. 统一登陆:
URL: [url]http://localhost:8080/mailmain[/url]?
type=login&uid=test&pwd=test&domain=test.com
1.增加用户,
URL: api.jsp?pwd=管理员密码&type=add&domain=域名&username=用户名&password=密
码&maxsize=最大空间&maxsize=最大邮件数
返回值: 0 -- 成功, 非0 失败
2.删除用户
URL: api.jsp?pwd=管理员密码&type=delete&domain=域名&username=用户名
返回值: 0 -- 成功, 非0 失败
3.更改用户密码
URL: api.jsp?pwd=管理员密码&type=edit&domain=域名&username=用户名&password=
新密码
返回值: 0 -- 成功, 非0 失败
4.获取用户新邮件数
URL: api.jsp?pwd=管理员密码&type=getnewmsg&domain=域名&username=用户名
返回值: 0 或正数 -- 用户新邮件数, 负数 失败
5.获取用户密码
URL: api.jsp?pwd=管理员密码&type=getpassword&domain=域名&username=用户名
返回值: 用户密码
(二)Jdmail 本地调用接口API说明
一.com.jdmail.web.MailMain
系统主入口点,当WEBMAIL 启动时,服务器执行其中的init 进行系统初始化工作。
主要成员变量:
1.public static ServerConf s_config
参考“二”
二.com.jdmail.web. ServerConf
系统执行时,环境变量管理类。通过该类可获得WEBMAIL时的各种执行路径值。
主要方法:
1.public String  getTempPath();
获得临时目录。
2.public String  getLogPath();
或得WEB 日志目录。
3.public long getSessionTimeout();
获得用户Session 超时值。
4.public String  getBackupPath();
获取系统备份目录。
5.public String  getMailServerPath();
获取服务器安装目录。
6.public String  getMailDirPath();
获取MAILDIR 目录。
7.public String  getServerTempPath();
获取服务器临时目录。
8.public String  getSpoolLocalPath();
获取本地处理队列目录。
三.com.jdmail.web. MailSession
本类用于表示用户连接SESSION。
主要方法:
1.public void update();
更新SESSION。
2.public String getTempPath();
获取用户临时目录。
四.com.jdmail.web. SessionAdmin
本类用于管理用户SESSION。
主要方法:
1.public void logout(String id);
注销用户SESSION。Id 为WEB服务器的SESSION ID。
五.com.jdmail.web. UserInfo
本类代表一个成功登录用户。
主要变量:
1.public String domain
用户的域。
2.public String ip
用户的登录IP
3.public UserAccount account ;
用户帐号信息。
4.public UserProfile profile
用户个人配置信息。
5.public UserSignature us_signature
用户签名档信息。
主要方法:
1.public String getUid()
获取用户ID(用户名)。
2.public UserSpace getUserSpace()
获取用户使用空间。
3.public boolean LockUserPop3()
临时给用户加POP3锁。
4.public void UnLockUserPop3()
解用户POP3锁
5.public boolean LockUserMsgID()
加用户MSGID 锁
6.public void UnLockUserMsgID()
解用户MSGID 锁。
六.com.jdmail.util. TMConfig
本类表示系统配置。
主要变量:
参考server.xml 服务器文件。
主要方法:
1.public void init(String filename)
初始化类,filename server.xml文件路径。
2.public void save()
保存系统配置
七.com.jdmail.util. UserAccount
本类代表用户帐号信息。
主要变量:
本类变量与account 表(或account.xml 文件)相对应。
主要方法:
1.public void init(String filename)
初始化类。Filename 为acount.xml 文件路径。
2.public void init(String filename,String profilefile)
初始化类。Filename 为acount.xml 文件路径。Profilefile 为profile.xml文件路径

3.public void mysqlInit(String domain, String username,boolean bInitProfile)
数据库方式初始化类。bInitProfile 表示是否载入用户profile 信息。
4.public int save(boolean isNew,boolean alreadyCheck)
保存用户信息。
isNew – 用户是否是新增用户
alreadyCheck – 用户信息有效性是否已检查
返回值:
0 – 成功
1 – 失败,已超出域总分配空间。
2 – 失败
5.public int saveProfile(boolean isNew,boolean alreadyCheck)
保存用户信息,同时保存用户profile 信息。
6.public int mysqlSave()
数据库方式保存用户信息。
八.com.jdmail.util. UserProfile
本类表示用户个人信息。
主要变量:
本类变量与profile 表(或profile.xml 文件)相对应。
九.com.jdmail.util. UserSignature
本类表示用户签名档。
主要变量:
本类变量与signature表(或signature.xml 文件)相对应。
十.com.jdmail.util.UserSpace
本类表示用户空间使用情况。
主要变量:
1.public int iTotalSize
用户总分配空间。以K为单位。
2.public int iUsedSize
3.已使用空间。以K为单位
4.public int iUnusedSize
未使用空间。
5.public int iPrecUsedSize
使用空间百分率。
6.public int iPrecUnusedSize
未使用空间百分率。
7.public int iMsgNum
用户邮件数。
十一.com.jdmail.web. DomainAdmin
域管理类。
主要方法:
1.public static void delete(String[] strDomains)
删除域,strDomains 要删除的域名数组。
十二.com.jdmail.web.DomainList
域列表。
主要方法:
1.public void init(String filename, String sqlWhere)
初始化类,filename domain.xml 文件路径,sqlWhere 域过滤条件。
2.public Domain find(String name)
3.查找指定的域。
4.public Domain remove(String name)
从域列表删除域,注意,本方法并不是真正删除域目录。
5.public void save()
保存域列表
十三.com.jdmail.web.Domain
本类表示一个域。
主要变量:
本类变量与domains表(或domains.xml 文件)相对应。
主要方法:
1.public boolean makeDomain()
生成一个域,包括生成域目录。
返回值:true 成功,false 失败。
十四.com.jdmail.web.FolderAdmin
本类用于用户文件夹管理。
主要方法:
1.public static int add(String strDomain,String strUserName,String
newFolder)
增加文件夹。
参数:
strDomain  -- 域名
strUserName – 用户名
newFolder – 文件夹名,可用中文。
返回值:
0 – 成功
1 – 失败,文件夹已存在。
2 – 失败,生成文件夹失败。
2.public static int del(String strDomain,String strUserName,String sFolder)
删除文件夹
返回值:
0 – 成功
1 – 失败
3.public static int rename(String strDomain,String strUserName,String
oldFolder,String newFolder)
重命名文件夹。
4.public static void save(String strDomain,String strUserName,ArrayList
alFolder)
保存文件夹信息。对应于folder.xml 文件。
十五.com.jdmail.web. Folder
本类表示一个文件夹。
主要变量:
1.public String FolderName
文件夹编号
2.public String FolderDesc
文件夹显示名
3.public String ImapName
IMAP 文件夹名
4.public boolean Sub
是否被定阅
5.public int iTotalMsg
文件夹总邮件数。
6.public int iNewMsg
新邮件数
7.public int iReadMsg
以读邮件数
十六.com.jdmail.mime. Message
本类表示一封邮件。
在系统里,邮件分为四种格式:
1.MSG_MAIL 正常邮件格式
2.MSG_MAILDIR MAILDIR 里的邮件格式。
3.MSG_SPOOLLOCAL 本地处理队列邮件格式。
4.MSG_SPOOLQUEUE 正在处理队列里的格式。
主要方法:
1.public Message(int iFormat)
类构建方法,iFormat 邮件格式。
2.public int Open(String pszMsgFile)
打开邮件,pszMsgFile 邮件文件路径。
3.public int OpenWhole(String pszMsgFile, String sTempAttachPath)
打开邮件,并解包附件到sTempAttachPath目录。
4.public int Close()
关闭邮件
十七.com.jdmail.mime. MimePart
邮件的MIMEPART 部分。
主要变量:
1.public long m_i_PartStart
本部份开始位置。
2.public long m_i_PartEnd
本部份结束位置。
3.public long m_i_BodyStart
本部份BODY开始位置。
4.public int iIsMessage_RFC822
本部分是否是一个RFC822格式体。
5.public MimeHeader m_MimeHeader
邮件头。
十八.com.jdmail.mime. MimeHeader
邮件头。
主要变量:
哈哈1.public Vector m_pSL_HeaderPair
值对表。
2.private Vector m_pSL_ContentTypeParamPair
ContentType 参数表。
    主要方法:
1.public HeaderPair FindHeaderPair(String pKey)
查找值对。
2.public HeaderPair FindContentParam(String pKey)
查找ContentType 参数
十九.com.jdmail.mime. HeaderPair
邮件头值对。
主要变量:
1.public String m_pKey
 参数名
3.public  String m_pValue
参数值。
二十.com.jdmail.mime. MimeAttach
邮件附件。
二十一.com.jdmail.web. MessageAdmin
邮件管理。
主要方法:
1.public static int getMsgCount(String strDomain,String strUserName,String
strFolder)
获取用户指定文件夹里的邮件数。
2.public static ArrayList getFolderList(String strDomain,String
strUserName,int iFlag)
获取用户的文件夹列表。
3.public static  Folder  findFolder(ArrayList alFolder,String name)
查找指定用户的文件夹。
4.  public static  ArrayList getMsgList(String strDomain,String
strUserName,String strFolder, int iFrom,int iItems,int SortType)
或取指定用户指定文件夹邮件列表。
5.public static  Message getMsg(String strDomain,String strUserName,String
strFolder,String iItems)
获取用户指定的邮件。
6.  public static void  moveMsg(String strDomain,String strUserName,
MailSession ms,String mbid,String org_mbtype, String new_mbtype,String[]
msgnums)
移动用户邮件。
7.  public static void  deleteMsg(String strDomain,String strUserName,
MailSession ms,String mbid,String mbtype,String[] msgnums)
删除用户邮件。
(三) jdmail远程调用接口API说明
1. 设置接口访问用户名和密码
配置位置:系统管理――》参数设置――》一般参数 
例子如下图:
 
       为了保证系统的安全性,每次调用接口都需要提供正确的用户名和密码。
2. API 调用环境类
类名:jdmail.api.remote. Env
说明:Env 类提供整个API 与服务器的通讯和配置管理。
方法:
1.  public static Env getEnv(String url, String username, String password);
说明:通过该方法可获取一个类实例。
参数说明:
1) url: webmail服务器根url
2) username:API访问用户名
3) password:API访问密码
返回值:
Env 对象:成功:Env 对象
Null:失败
3. 帐号操作类
类名:jdmail.api.remote.user. R_UserAccount
说明:UserAccount类提供所有用户管理相关功能,包括新增,删除,修改用户,和获
取用户相关信息。
属性:
1. public UserAccount m_useraccount
m_useraccount 提供用户帐号的详细信息。
方法:
1. public static int createUserAccount(Env env, R_UserAccount ua);
说明:用于建立新用户。
参数说明:
1) env : Env 对象
2)ua:R_UserAccount 对象,R_UserAccount对象通过m_useraccount 属性传递 用户
帐号详细信息。
返回值:
0:成功
-1:超出分配空间
-2:用户已存在
-3:失败
-4:超出分配用户数
例子:
参考附件的:public static int createUserAccount(Env env);
2. public static int changeUserPassword(Env env, R_UserAccount ua);
说明:用于更改用户密码。
参数说明:
1)  env : Env 对象
2) ua:R_UserAccount 对象,R_UserAccount对象通过m_useraccount 属性传递 用户
帐号详细信息。
返回值:
0:成功
-1:失败
  
例子:
参考附件的:public static int changeUserPassword (Env env);
3. public static int deleteUserAccount(Env env, R_UserAccount ua);
说明:用于删除用户。
参数说明:
1) env : Env 对象
2)ua:R_UserAccount 对象,R_UserAccount对象通过m_useraccount 属性传递 用户
帐号详细信息。
返回值:
0:成功
-1:失败
例子:
参考附件的:public static int deleteUserAccount (Env env);
4. public static int auth(Env env, String username,String domain,String
password);
   说明:用于验证用户。
参数说明:
1) env : Env 对象
2)username:用户名。
3)domain:域名
4)password:密码
返回值:
0:成功
1:失败
例子:
参考附件的:public static int testAuth (Env env);
5. public static int getNewMsgNum(Env env, R_UserAccount ua);
说明:用于删除用户。
参数说明:
1) env : Env 对象
2)ua:R_UserAccount 对象,R_UserAccount对象通过m_useraccount 属性传递 用户
帐号详细信息。
返回值:
>= 0 :新邮件数
-1:失败
例子:
参考附件的:public static int getNewMsgNum (Env env);
4. 文件夹操作类
类名:jdmail.api.remote.message.R_FolderAdmin
说明:R_FolderAdmin类提供与文件夹相关的操作功能。
方法:
1. public static int getFolderList(Env env, String username,String
domain ,ArrayList alRet);
说明:用于返回指定用户的文件夹列表。
参数说明:
1) env : Env 对象
2)username:用户名
3)domain:域名
4)alRet: 用于保存返回文件夹列表的 java.util.ArrayList 对象。
返回值:
0:成功
-1:失败
-2:该用户不存在
例子:
参考附件的:public static int testGetFolderList(Env env);
5. 邮件操作类
类名:jdmail.api.remote.message.R_MessageAdmin
说明:R_MessageAdmin类提供与用户邮件相关的操作功能。
方法:
1. public static int getMessageCount(Env env, String username,String domain,
String foldername);
说明:用于获取用户的指定文件夹的邮件数。
参数说明:
1) env : Env 对象
2)username:用户名
3)domain:域名
4)foldername: 文件夹编号。
返回值:
>=0:邮件数
-1:失败
例子:
参考附件:public static int testGetMessageCount(Env env);
   2.  public static int getMessageIDList(Env env, String username,
   String domain, String foldername, int iFrom, int
iCount,
   ArrayList alRet)
说明:用于获取用户的指定文件夹的邮件编号列表。
参数说明:
1) env : Env 对象
2)username:用户名
3)domain:域名
4)foldername: 文件夹编号。
5)iFrom:起始邮件序号,注意:本方法是于倒数计算邮件,所以要获取所有邮件,应
该是 iFrom 值与getMessageCount 返回值相同。
6)iCount:指定要获取的邮件数
7)alRet:用于保存返回文件夹列表的 java.util.ArrayList 对象。
返回值:
>=0:邮件数
-1:失败
例子:
参考附件:public static int testGetMessageIDList (Env env);
   3.  public static byte[] getMessage(Env env, String username,
   String domain, String foldername, String messageID) 
 说明:用于获取用户的指定邮件原文,然后可用package jdmail.mime 内相关类对邮
件内容进行分析。
参数说明:
1) env : Env 对象
2)username:用户名
3)domain:域名
4)foldername: 文件夹编号。
5)messageID:邮件编号,该邮件编号可通过getMessageIDList 获取。
返回值:
byte[] 对象:邮件原文
null:失败
例子:
参考附件:public static int testGetMessage(Env env);
4.  public static int sendMessage(Env env, String username, String domain,
   String to, String subject, String body);
说明:用于发送邮件。
参数说明:
1) env : Env 对象
2)username:用户名
3)domain:域名
4)to: 收件人
5)subject:主题
6)body: 邮件正文
返回值:
0:成功
-1:失败
例子:
参考附件:public static int sendMail (Env env);

附件(TestApi.java):
package jdmail.api.remote;
import java.util.*;
import jdmail.api.remote.user.*;
import jdmail.api.remote.message.*;
import jdmail.mime.*;
import jdmail.util.*;
import java.io.*;
/**
 * testcase for api
 *
 * @author
 * @version 1.0.0
 *
 */
public class TestApi {
 public static void main(String[] args) {
  // 建立调用环境
  Env env = Env.getEnv(" [url]http://localhost:8899/tmweb/mailmain[/url]",
"admin",
    "admin");
  // int iRet = sendMail(env);
  int iRet = createUserAccount(env);
  iRet = changeUserPassword(env);
  iRet = deleteUserAccount(env);
  iRet = 0;
 }
 /**
  * 测试新建用户
  *
  * @param iIndex
  * @return
  */
 public static int createUserAccount(Env env) {
  R_UserAccount rua = new R_UserAccount();
  rua.m_useraccount = new UserAccount();
  UserAccount ua = rua.m_useraccount;
  ua.username = "ab";
  ua.setPassword("ab");
  ua.usertype = "U";
  ua.m_domain = "a.com";
  ua.m_UserProfile = new UserProfile();
  ua.m_UserProfile.first_name = "ab";
  ua.m_UserProfile.last_name = "";
  ua.m_UserProfile.organiztion = "";
  ua.m_UserProfile.department = "";
  ua.m_UserProfile.address = "";
  ua.m_UserProfile.city = "";
  ua.m_UserProfile.postalcode = "";
  ua.m_UserProfile.telephone = "";
  ua.m_UserProfile.state_province = "";
  ua.m_UserProfile.country = "";
  ua.m_UserProfile.items = 50;
  ua.enable = "true";
  ua.enable_smtp = "true";
  ua.enable_pop3 = "true";
  ua.enable_imap4 = "true";
  ua.enable_webaccess = "true";
  ua.enable_localdomain = "false";
  ua.max_mailbox_size = -1;
  ua.max_mailbox_msgs = -1;
  int iRet = R_UserAccount.createUserAccount(env, rua);
  return iRet;
 }
 /**
  * 测试删除用户
  *
  * @return
  */
 public static int deleteUserAccount(Env env) {
  R_UserAccount rua = new R_UserAccount();
  // rua.m_useraccount = new
  rua.m_useraccount = new UserAccount();
  UserAccount ua = rua.m_useraccount;
  ua.username = "ab";
  ua.m_domain = "a.com";
  int iRet = R_UserAccount.deleteUserAccount(env, rua);
  return iRet;
 }
 /**
  * 测试更改密码
  *
  * @return
  */
 public static int changeUserPassword(Env env) {
  R_UserAccount rua = new R_UserAccount();
  rua.m_useraccount = new UserAccount();
  UserAccount ua = rua.m_useraccount;
  ua.username = "ab";
  ua.m_domain = "a.com";
  // 新密码
  ua.setPassword("123");
  int iRet = R_UserAccount.changeUserPassword(env, rua);
  return iRet;
 }
 /**
  * 测试获取用户的新邮件数
  *
  * @return
  */
 public static int getNewMsgNum(Env env) {
  // 建立R_UserAccount api对象
  R_UserAccount rua = new R_UserAccount();
  // 指定要取最新邮件数的用户
  rua.m_useraccount = new UserAccount();
  UserAccount ua = rua.m_useraccount;
  ua.username = "a1";
  ua.m_domain = "a.com";
  // 调用api取最新邮件数的用户
  int iRet = R_UserAccount.getNewMsgNum(env, rua);
  return iRet;
 }
 /**
  * 测试用户验证
  *
  * @return
  */
 public static int testAuth(Env env) {
  // 参数说明:
  // env , 用户名,域,密码
  int iRet = R_UserAccount.auth(env, "a1", "a.com", "a");
  return iRet;
 }
 /**
  * 测试获取文件夹列表
  *
  * @return
  */
 public static int testGetFolderList(Env env) {
  ArrayList alRet = new ArrayList();
  int iRet = R_FolderAdmin.getFolderList(env, "a1", "a.com",
alRet);
  if (iRet == 0) { // 如果执行成功
   Folder folder = null;
   for (int i = 0; i < alRet.size(); i++) {
    folder = (Folder) alRet.get(i);
    System.out.println("folderid:" +
folder.FolderName);
    System.out.println("foldername:" +
folder.FolderDesc);
   }
  }
  return iRet;
 }
 public static int testGetMessageCount(Env env) {
  // 获取 [email]a1@a.com[/email] 的收件箱中的总邮件数
  int iCount = R_MessageAdmin.getMessageCount(env, "a1",
"a.com", "new");
  System.out.println("total msgs:" + iCount);
  int iRet = 0;
  return iRet;
 }
 public static int testGetMessageIDList(Env env) {
  int iCount = R_MessageAdmin.getMessageCount(env, "a1",
"a.com", "new");
  ArrayList alRet = new ArrayList();
  int iRet = R_MessageAdmin.getMessageIDList(env, "a1",
"a.com", "new",
    iCount - 1, iCount, alRet);
  if (iRet > 0) {
   for (int i = 0; i < iRet; i++) {
    System.out.println("msgid:" + (String)
alRet.get(i));
   }
  }
  return iRet;
 }
 public static int testGetMessage(Env env) {
  StringBuffer sbFile = new StringBuffer();
  // System.get
  int iCount = R_MessageAdmin.getMessageCount(env, "a1",
"a.com", "new");
  ArrayList alRet = new ArrayList();
  int iRet = R_MessageAdmin.getMessageIDList(env, "a1",
"a.com", "new",
    iCount - 1, iCount, alRet);
  byte[] bs = null;
  if (iRet > 0) {
   for (int i = 0; i < iRet; i++) {
    System.out.println("msgid:" + (String)
alRet.get(i));
    bs = R_MessageAdmin.getMessage(env, "a1",
"a.com", "new",
      (String) alRet.get(i));
    if (bs != null) {
     try {
      System.out.println("message
source:" + new String(bs));
      String strTempMsgFile =
"e:\\temp\\"
        + (String)
alRet.get(i);
      RandomAccessFile raf = new
RandomAccessFile(
        
strTempMsgFile, "rw");
      raf.write(bs);
      raf.close();
      Message tempMsg = new
Message(Message.MSG_MAIL);
      tempMsg.OpenProfile
(strTempMsgFile, false);
      System.out.println("邮件内容
:");
      HeaderPair hp =
tempMsg.m_MimePart.m_MimeHeader
        
.FindHeaderPair("subject");
      if (hp != null) {
       String subject =
MailCoder.ext_decode(hp.m_bsValue);
       System.out.println
("subject:" + subject);
      }
      tempMsg.Close();
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
   }
  }
  return iRet;
 }
 /**
  * 测试发送邮件
  *
  * @return
  */
 public static int sendMail(Env env) {
  // 参数说明:
  // env , 发件人域,发件人用户名,收件人邮件地址,标题,内容
  int iRet =
  .sendMessage(env, "a2", "a.com", " [email]a1@a.com[/email]",
    "test中文标题 subject", "test中文邮件体xxx
body");
  return 0;
 }
}