关键字: apache james 实践

       Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写。James 是100%基于Java的电子邮件服务器。它是一种独立的邮件服务器,并提供了一个完整的电子邮件解决方案,用来收、发电子邮件。

 

       本文不赘述James服务器的参数细节,这个以后有机会再详细讨论,这里先从服务器搭建开始,用搭建的服务器收、发电子邮件来熟悉一下Apache James。本人也是新手,希望能得到各位高手的指点,使大家能悟到进阶的方向。

 

       

       1。请下载安装JDK,并设置好其环境变量:JAVA_HOME=…… 、PATH=…… 、CLASSPATH=…… Eclipse 3.4 是目前的最新版本,可以从http://www.eclipse.org/下载。

      

       2。请下载JMail API、JAF API,可以在www.java.sun.com找到他们,找不到也不要紧,本文附件示例代码免费提供一份(^_^)。

 

       3。Apache James 的官方网站为:http://james.apache.org/,当前 Server 的最新版为 2.3.1版. 安装非常简单,下载后得到james-binary-2.3.1.zip 文件,解压后即可。这里假设解压到D盘(D:\james-2.3.1),目录结构如下:

  

D:\james-2.3.1
               |--- apps
               |--- bin
               |
       …………
 
       4。启动 James 服务器
       双击或在命令行下执行D:\james-2.3.1\bin 目录下的 run.bat文件,即可启动 James 服务器。
 
       启动后能在控制台看到如下信息,说明启动成功:
Java代码 
1. Using PHOENIX_HOME: D:\james-2.3.1
2. Using PHOENIX_TMPDIR: D:\james-2.3.1\temp    
3. Using JAVA_HOME: D:\Java\jdk1.6.0_10    
4.   
5. Phoenix4.2
6.   
7. James Mail Server 2.3.1
8. Remote Manager Service started plain:4555
9. POP3 Service started plain:110
10. SMTP Service started plain:25
11. NNTP Service started plain:119
12. FetchMail Disabled  
Using PHOENIX_HOME: D:\james-2.3.1 
Using PHOENIX_TMPDIR: D:\james-2.3.1\temp 
Using JAVA_HOME: D:\Java\jdk1.6.0_10 
 
Phoenix 4.2 
 
James Mail Server 2.3.1 
Remote Manager Service started plain:4555 
POP3 Service started plain:110 
SMTP Service started plain:25 
NNTP Service started plain:119 
FetchMail Disabled
   
       
       要关闭 James 服务,请使用 Ctrl + C
 
       说明:启动前请确保您的JDK环境变量如JAVA_HOME等已经设置好;James 启动时,其SMTP 服务默认在 25 端口启动,POP3 服务默认在 110 端口启动, NNTP 服务默认在 119 端口启动, 请确保这些端口未被占用。比如本系统下就已经安装了Microsoft的 SMTP 服务,造成 James无法启动,解决方法为:开始--->设置--->控制面板--->管理工具--->服务,打开后找到“Simple Mail Transport Protocol(SMTP)”服务项,关闭即可。
 
      
       5。配置服务
       服务器启动后会在本机配置一个默认的服务,这可以用来在本机上本服务器范围内收发邮件,但是邮件发不到163等外网邮箱。我们这里关注的重点就是配置一个能发到外网如163这样的邮箱的邮件,这样才有价值。不过由于本人是在本机上测试,一时不能获取公司的域名参数,无法测试接收外网邮箱(如163)的邮件,见晾,不过做法都是一样的,至少我们可以向外网邮箱发送邮件,局域网内可以收、发邮件。
       
        打开D:\james-2.3.1\apps\james\SAR-INF 下的 config.xml 文件,初次启动James之前,不会有这个文件,只有当James服务启动一次之后才自动构件该文件。
      
        找到
Java代码 
1. ……    
2. <postmaster>Postmaster@localhost</postmaster>    
3. ……    
4. <servernames autodetect="true" autodetectIP="true">    
5.     <servername>localhost</servername>    
6. </servernames>    
7. ……   
…… 
<postmaster>Postmaster@localhost</postmaster> 
…… 
<servernames autodetect="true" autodetectIP="true"> 
<servername>localhost</servername> 
</servernames> 
…… 
  
  
        把localhost该成你自己想要的邮箱域名, 把自动探测IP属性设置为“false”这里假设改成 zhaipuhong.com 如果开了一个帐号 zph ,那么他的邮件地址就是 zph@zhaipuhong.com (^_^)修改结果如下:
 
Xml代码 
1. ……    
2.  <postmaster>Postmaster@zhaipuhong.com</postmaster>    
3. ……    
4.  <servernamesautodetect="false" autodetectIP="false">    
5.     <servername>zhaipuhong.com</servername>    
6.  </servernames>    
7. ……  
…… 
<postmaster>Postmaster@zhaipuhong.com</postmaster> 
…… 
<servernames autodetect="false" autodetectIP="false"> 
<servername>zhaipuhong.com</servername> 
</servernames> 
……
   
        找到
Xml代码 
1.  <mailetmatch="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">    
2.     <processor> relay-denied </processor>    
3.     <notice>550 - Requested action not taken: relaying denied</notice>    
4.  </mailet>  
<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"> 
<processor> relay-denied </processor> 
<notice>550 - Requested action not taken: relaying denied</notice> 
</mailet>
   
        将其注释,结果如下:
Xml代码 
1. <!--mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">    
2.     <processor> relay-denied </processor>    
3.     <notice>550 - Requested action not taken: relaying denied</notice>    
4.  </mailet-->  
<!--mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"> 
<processor> relay-denied </processor> 
<notice>550 - Requested action not taken: relaying denied</notice> 
</mailet-->
     
         找到下面元素,去掉其注释
Xml代码 
1.  <authRequired>true</authRequired>  
<authRequired>true</authRequired>
  
 
         这样邮箱访问需要帐号验证,你不希望别人用你的帐号收发消息吧……^_^
         
         如此,James服务配置已经完成。
 
 
        6。创建邮件帐号
        创建邮件帐号后,就可以用来收发邮件了。James的账号管理是通过基于Telnet客户机的远程管理器,这点颇为不爽,尤其是我的操作系统下的命令行控制台是不显示telnet命令输入字符的,经常出错。
 
        现在进入命令行控制台,在telnet localhsot 4555 进入James管理器,操作如下:
C代码 
1. C:\Documents and Settings\db2admin>telnet localhost 4555   
C:\Documents and Settings\db2admin>telnet localhost 4555 
  
 
        将进入
C代码 
1. JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id:  
JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id:
   
 
        默认的登陆id 为root 密码也为 root ,登陆成功后结果如下:
C代码 
1. JAMES Remote Administration Tool 2.3.1    
2. Please enter your login and password    
3. Login id:    
4. Password:    
5. Welcome root. HELP for a list of commands    
JAMES Remote Administration Tool 2.3.1 
Please enter your login and password 
Login id: 
Password: 
Welcome root. HELP for a list of commands  
 
       创建新用户的命令是:adduser username password
    这里创建了两个账户来作为演示使用: zhaipuhong/zhangpuhong ;      zph/zph
 
      说明:你可以输入help来获取命令帮助
C代码 
1. help display this help 显示帮助信息    
2. listusers display existing accounts 显示现有账户    
3. countusers display the number of existing accounts 显示现有账户数量    
4. adduser [username] [password] add a new user 添加一个新用户    
5. verify [username] verify if specified user exist 核实指定用户是否存在    
6. deluser [username] delete existing user 删除存在的用户    
7. setpassword [username] [password] sets a user's password 设置用户密码    
8. setalias [user] [alias] locally forwards all email for 'user' to 'alias' 设置邮箱别名    
9. showalias [username] shows a user's current email alias 显示别名    
10. unsetalias [user] unsets an alias for 'user' 删除用户别名    
11. setforwarding [username] [emailaddress] forwards a user's email to another email address 转发用户的电子邮件地址到另一个电子邮件地址    
12. showforwarding [username] shows a user's current email forwarding 显示用户的当前邮件转发    
13. unsetforwarding [username] emoves a forward 删除转发    
14. user [repositoryname] change to another user repository 改变另一个用户库    
15. shutdown kills the current JVM (convenient when James is run as a daemon)关闭当前的服务    
16. quit close connection 关闭连接  
help display this help 显示帮助信息 
listusers display existing accounts 显示现有账户 
countusers display the number of existing accounts 显示现有账户数量 
adduser [username] [password] add a new user 添加一个新用户 
verify [username] verify if specified user exist 核实指定用户是否存在 
deluser [username] delete existing user 删除存在的用户 
setpassword [username] [password] sets a user's password 设置用户密码 
setalias [user] [alias] locally forwards all email for 'user' to 'alias' 设置邮箱别名 
showalias [username] shows a user's current email alias 显示别名 
unsetalias [user] unsets an alias for 'user' 删除用户别名 
setforwarding [username] [emailaddress] forwards a user's email to another email address 转发用户的电子邮件地址到另一个电子邮件地址 
showforwarding [username] shows a user's current email forwarding 显示用户的当前邮件转发 
unsetforwarding [username] emoves a forward 删除转发 
user [repositoryname] change to another user repository 改变另一个用户库 
shutdown kills the current JVM (convenient when James is run as a daemon)关闭当前的服务 
quit close connection 关闭连接

 

      账号创建成功后,使用quit退出管理器。现在我们可以开始部署我们的JMail应用了。

 

 

      7。用James收发邮件

      现在我们来写两个简单的程序来体验一下如何使用James收发邮件。请注意,示例程序是通用的。关于如何用JMail API收发邮件,这里不详细介绍,如果还没有接触过请参考一下我之前的文章:

      http://zhaipuhong.iteye.com/admin/blogs/213005

     

      关于接受邮件部分,我们在代码中通过注释来描述。另外我们来回忆一下上述步骤配置James服务器的参数:

      1。smtp 服务器:192.168.1.98或者localhost     192.168.1.98是我的局域网IP,由于我James服务就装在我的机器上,所以我可以用localhost

      2。两个邮件帐号:zhaipuhong/zhaipuhong   对应邮箱地址: zhaipuhong@zhaipuhong.com

                                zph/zph                            对应邮箱地址: zph@zhaipuhong.com

      注意:邮箱域名我们配置的是zhaipuhong.com

 

      示例程序:

 


Java代码 
1. package com.zhaipuhong.j2ee.jmail;   
2.   
3. import java.io.IOException;   
4. import java.util.Properties;   
5.   
6. import javax.mail.Authenticator;   
7. import javax.mail.Folder;   
8. import javax.mail.Message;   
9. import javax.mail.MessagingException;   
10. import javax.mail.PasswordAuthentication;   
11. import javax.mail.Session;   
12. import javax.mail.Store;   
13. import javax.mail.Transport;   
14. import javax.mail.internet.InternetAddress;   
15. import javax.mail.internet.MimeMessage;   
16. import javax.mail.internet.MimeUtility;   
17.   
18. public class HelloJMail {   
19.        
20.     //发送邮件   
21.     public static void sendMail() {   
22.         //String host = "192.168.1.98"; // 指定的smtp服务器,本机的局域网IP   
23.         String host = "localhost"; // 本机smtp服务器   
24.         //String host = "smtp.163.com"; // 163的smtp服务器   
25.         String from = "zhaipuhong@zhaipuhong.com"; // 邮件发送人的邮件地址   
26.         String to = "zph@zhaipuhong.com"; // 邮件接收人的邮件地址   
27.         final String username = "zhaipuhong";  //发件人的邮件帐户   
28.         final String password = "zhaipuhong";   //发件人的邮件密码   
29.   
30.         // 创建Properties 对象   
31.         Properties props = System.getProperties();   
32.   
33.         // 添加smtp服务器属性   
34.         props.put("mail.smtp.host", host);   
35.         props.put("mail.smtp.auth", "true");   
36.   
37.         // 创建邮件会话   
38.         Session session = Session.getDefaultInstance(props, new Authenticator(){   
39. @Override
40.             public PasswordAuthentication getPasswordAuthentication() {   
41.                 return new PasswordAuthentication(username, password);   
42.             }   
43.                
44.         });   
45.   
46.         try {   
47.             // 定义邮件信息   
48.             MimeMessage message = new MimeMessage(session);   
49.             message.setFrom(new InternetAddress(from));   
50.             message.addRecipient(Message.RecipientType.TO, new InternetAddress(   
51.                     to));   
52.             //message.setSubject(transferChinese("我有自己的邮件服务器了"));   
53.             message.setSubject("I hava my own mail server");   
54.             message.setText("From now, you have your own mail server, congratulation!");   
55.   
56.             // 发送消息   
57.             session.getTransport("smtp").send(message);     
58.             //Transport.send(message); //也可以这样创建Transport对象发送   
59.             System.out.println("SendMail Process Over!");   
60.   
61.         } catch (MessagingException e) {   
62.             e.printStackTrace();   
63.         }   
64.     }   
65.        
66.     //接受邮件   
67.     public static void getMail(){   
68.         String host = "localhost";   
69.         final String username = "zph";   
70.         final String password = "zph";   
71.   
72.         // 创建Properties 对象   
73.         Properties props = new Properties();   
74.   
75.         // 创建邮件会话   
76.         Session session = Session.getDefaultInstance(props, new Authenticator(){   
77. @Override
78.             public PasswordAuthentication getPasswordAuthentication() {   
79.                 return new PasswordAuthentication(username, password);   
80.             }   
81.                
82.         });   
83.   
84.            
85.         try {   
86.             // 获取邮箱的pop3存储   
87.             Store store = session.getStore("pop3");   
88.             store.connect(host, username, password);   
89.   
90.             // 获取inbox文件   
91.             Folder folder = store.getFolder("INBOX");   
92.             folder.open(Folder.READ_ONLY);  //打开,打开后才能读取邮件信息   
93.   
94.             // 获取邮件消息   
95.             Message message[] = folder.getMessages();   
96.   
97. 0, n=message.length; i<n; i++) {   
98. 0]   
99.                                                + "\t" + message[i].getSubject());   
100.                 try {   
101.                     message[i].writeTo(System.out);   
102.                 } catch (IOException e) {   
103.                     e.printStackTrace();   
104.                 }   
105.