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

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

开始之前,先声明一下本文操作的系统环境:

1. JDK 6u10b

2. JMail API v1.4.2

3. JAF API v1.1(JavaBean Activation Framework)

4. Apache James 2.3.1

5. Eclipse 3.4 for J2EE Developers

6. Windows 2000 Server sp4

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 服务器。

启动后能在控制台看到如下信息,说明启动成功:

  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. Phoenix 4.2
  5. James Mail Server 2.3.1
  6. Remote Manager Service started plain:4555
  7. POP3 Service started plain:110
  8. SMTP Service started plain:25
  9. NNTP Service started plain:119
  10. 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服务启动一次之后才自动构件该文件。

找到

  1. ……
  2. <postmaster>Postmaster@localhost</postmaster>
  3. ……
  4. <servernames autodetect="true" autodetectIP="true">
  5. <servername>localhost</servername>
  6. </servernames>
  7. ……

把localhost该成你自己想要的邮箱域名, 把自动探测IP属性设置为“false”这里假设改成 zhaipuhong.com 如果开了一个帐号 zph ,那么他的邮件地址就是 zph@zhaipuhong.com (^_^)修改结果如下:

  1. ……
  2. <postmaster>Postmaster@zhaipuhong.com</postmaster>
  3. ……
  4. <servernames autodetect="false" autodetectIP="false">
  5. <servername>zhaipuhong.com</servername>
  6. </servernames>
  7. ……

找到

  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>

将其注释,结果如下:

  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-->

找到下面元素,去掉其注释

  1. <authRequired>true</authRequired>

这样邮箱访问需要帐号验证,你不希望别人用你的帐号收发消息吧……^_^

如此,James服务配置已经完成。

6。创建邮件帐号

创建邮件帐号后,就可以用来收发邮件了。James的账号管理是通过基于Telnet客户机的远程管理器,这点颇为不爽,尤其是我的操作系统下的命令行控制台是不显示telnet命令输入字符的,经常出错。

现在进入命令行控制台,在telnet localhsot 4555 进入James管理器,操作如下:

  1. C:\Documents and Settings\db2admin>telnet localhost 4555

将进入

  1. JAMES Remote Administration Tool 2.3.1 Please enter your login and password Login id:

默认的登陆id 为root 密码也为 root ,登陆成功后结果如下:

  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

创建新用户的命令是:adduser username password

    这里创建了两个账户来作为演示使用: zhaipuhong/zhangpuhong ;      zph/zph

      说明:你可以输入help来获取命令帮助

  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 关闭连接

 

账号创建成功后,使用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

示例程序:

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

说明: 执行测试时,先执行发送,在main方法中注释掉邮件接受方法调用,等待片刻,再注释掉邮件发送方法调用,执行邮件接受方法调用。因为就算163这样优秀的企业级邮箱也不可能瞬间就能收到发送的邮件。

在邮件发送方法中:sendMail(), 可以尝试一下又本邮件服务器向163邮箱发送邮件,如果想通过163邮件服务器想本地发送邮件,你需要配置DSN。

以下为本机接收James邮件服务器提供服务的邮件结果:

  1. 0: zhaipuhong@zhaipuhong.com    I hava my own mail server
  2. Return-Path: <zhaipuhong@zhaipuhong.com>
  3. Delivered-To: zph@zhaipuhong.com
  4. Received: from 127.0.0.1 ([127.0.0.1])
  5. by ZPH (JAMES SMTP Server 2.3.1) with SMTP ID 693
  6. for <zph@zhaipuhong.com>;
  7. Wed, 9 Jul 2008 19:58:38 +0800 (CST)
  8. Date: Wed, 9 Jul 2008 19:58:38 +0800 (CST)
  9. From: zhaipuhong@zhaipuhong.com
  10. To: zph@zhaipuhong.com
  11. Message-ID: <11627000.01215604718796.JavaMail.db2admin@ZPH>
  12. Subject: I hava my own mail server
  13. MIME-Version: 1.0
  14. Content-Type: text/plain; charset=us-ascii
  15. Content-Transfer-Encoding: 7bit
  16. From now, you have your own mail server, congratulation!

从上面的结果可以看出,该邮件是由zhaipuhong@zhaipuhong.com 发给 zph@zhaipuhong.com 的。

多发几封电子邮件,就会发现,James 的邮件接收是一个栈结构,最近收到的邮件编号为0,依次类推……

  • practice.rar (370.3 KB)
  • 描述: 项目的示例代码
  • 下载次数: 2159
  • config.rar (14.7 KB)
  • 描述: James 的配置文件,可以直接替换使用
  • 下载次数: 1302

http://www.iteye.com/topic/213246

http://zhaipuhong.iteye.com/blog/213246

用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)的更多相关文章

  1. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  2. 使用Apache FtpServer搭建FTP服务器 [FlashFXP]

    <server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...

  3. 手动搭建apache james邮件服务器,实现邮件功能

    最近一直在搞邮件这块,本来我们邮件发送是用的腾讯免费的企业邮箱,邮件功能没有问题,但是由于邮件的限制,如下: 这些限制导致我们的部分客户是收不到邮件的,哪怕付费,这样的固定频率限制也是无法解决的,可以 ...

  4. 在windows平台使用Apache James搭建邮件服务器以及使用C#向外网发送邮件

    首先环境搭建: 1.下载安装JDK,并且配置环境变量 2.下载Apache James ,下载解压之后的目录如图 双击bin下边的run.bat批处理文件安装James 服务,提示如下信息说明安装成功 ...

  5. 使用apache ftpserver搭建ftp服务器

    作为一个javaer,遇到任何问题,先查一下java中的解决方案.地球上的许多事情,在java中都能找到完美的解决方案.之前搭建ftp服务器使用的是vsftpd,现在可以把它卸掉了,它以服务的形式运行 ...

  6. Java远程调用邮件服务器,实现邮件发送

    写这篇文章的背景是公司Android客户端需要实现一个功能,实现类似于密码找回或者用户注册完发送一个邮件给用户的功能,当然这些逻辑客户端只负责请求自己的服务端,自己的服务端再去请求邮件服务器. 邮件服 ...

  7. 利用apache ftpserver搭建ftp服务器

    操作环境: win2012r2 x64 datacenter Apache FtpServer 1.2.0 Java SE Development Kit 8u333 commons-dbcp2-2. ...

  8. 通过腾讯邮件服务器发送HTML邮件

    邮件发送工具: private static String host = "smtp.exmail.qq.com";// 服务器地址 private static String p ...

  9. 让Chrome 接管邮件连接,收发邮件更方便了

    页面中除了传统的超链接外,还可以将邮箱地址写入<a>标签,意思不表自明,当然是用户点击后就会打开相应的邮件客户端向这个连接指向的邮件地址发邮件. <a href="mail ...

随机推荐

  1. Socket 心跳包机制总结

    跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着.事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一 ...

  2. ORACLE 五种表的优缺点总结

    ORACLE 五种表的优缺点总结: 1.普通表(heap table):适合大部分设计场景,有长处也有缺点. 长处: a,语法简单方便 b,适合大部分场景 缺点: a,更新日志开销较大 b,Delet ...

  3. spring mvc 接受多对象的处置

    spring mvc 接受多对象的处理 spring mvc感觉非常好用,尤其是对接收对象參数的自己主动绑定非常简便,但对于同一时候传多个对象时有些困扰. 同一时候项目并没有直接使用spring的fo ...

  4. 大约sources.list和apt-get [转载]

    个人觉得,Debian这与最大的方便apt-get安装软件,apt-get这可能是工作:/etc/apt/sources.list文件中保存着一些server的设置,在这些server上有大量的能够用 ...

  5. HDU3714 Error Curves (单峰函数)

    大意: 给你n个二次函数Si(x),F(x) = max{Si(x)} 求F(x)在[0,1000]上的最小值. S(x)=ax^2+bx+c       (0<=a<=100, |b|, ...

  6. Setup SSH and SVN on Windows Server

    cygwin: install sshd, cygrunsrv http://lifehacker.com/205090/geek-to-live--set-up-a-personal-home-ss ...

  7. 辛星PHP教程之yii和ci教程已经写完,望与朋友们交流

     记得有个朋友给我说,你写的PHP框架是不是过于少了.我感觉仅仅有一个thinkphp确实不好,于是就又写了下yii和ci的教程,事实上我之前是研究过这两个框架的,因此写起来也还算得心应手吧.估计接下 ...

  8. Queue 消息的发送与接收(PTP 消息传递模型)

    上篇博客写到了JMS两种消息模型(P2P.pub/sub)<JMS两种消息模型>.本篇博客通过一个实例来进一步了解P2P模型. Queue消息的发送与接收--PTP消息传递模型,样例: Q ...

  9. Delphi5 update1的序列号

    好不容易找到一个: Serial Number: 100-006-1659Key: 6ax0-91x0 ------------------------------------------- 办法2: ...

  10. OpenRisc-50-or1200的freeze模块分析

    引言 之前,我们分析or1200的控制通路中的sprs模块和except模块,本小节,我们就分析一下or1200控制通路的最后一个模块,就是freeze模块. 1,整体分析 freeze模块,顾名思义 ...