Apache James使用的方法及相关心得(转)

经过一番的辛苦努力,终于把James 配置搞定啦,好记性不如烂笔头啊,赶紧记下我的成功经过,以备以后查阅!

首先要做的就是配置域名的MX 记录啦:

先添加一条A记录:

mail.abc.com 指向 你的服务器IP!

然后添加域名的MX 记录,指向mail.abc.com A 记录( 即域名MX 记录的值为mail.abc.com).

OK ,域名的配置就完成啦!

接下来安装配置James :

James 不需要编译安装,解压即可以使用,把james 下载来后,必须先启动一下!

进入James 根目录下的bin 目录,启动:

127.0.0.1[bin]$ ./run.sh

Log 如下:

127.0.0.1[bin]$ ./run.sh

Using PHOENIX_HOME: /usr/local/james-2.3.2

Using PHOENIX_TMPDIR: /usr/local/james-2.3.2/temp

Using JAVA_HOME: /home/java/jdk1.6.0_11

Running Phoenix:

Phoenix 4.2

James Mail Server 2.3.2

Remote Manager Service started plain:4555

POP3 Service started plain:110

SMTP Service started plain:25

NNTP Service started plain:119

FetchMail Disabled

JVM exiting abnormally. Shutting down Phoenix.

然后按Ctrl+C 停止。

第一次运行后,系统会在 apps 目录下面生成一些初始化的配置文件。如果第一次运行有问题,用 netstat 检查一下是否有系统默认的端口被占用了,比如 110,25 等。

进入配置文件目录修改config.xml 文件:

127.0.0.1 [SAR-INF]$ pwd

/usr/local/james-2.3.2/apps/james/SAR-INF

127.0.0.1 [SAR-INF]$ vi config.xml

查找替换所有的 localhost 为你的域名,比如 abc.com

查找所有 autodetect 属性,修改为 false 。 AutodetectIP 也设为 false.

注释掉  
        <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor> 
        <processor> relay-denied </processor> 
        <notice>550 - Requested action not taken: relaying denied</notice> 
        </mailet>

配置 DNS Server ,由于我未配置自己的 DNS 服务器,所以使用 Google 的 Public DNS :

<dnsserver> 
        <servers> 
        <server>8.8.8.8</server>

<server>8.8.4.4</server>         
</servers>
</dnsserver>

设置 autodiscover 为 false

注意 ,设置 DNS 这步很重要,发送邮件不成功的问题经常会出在这里!

有些文章说 ping 域名提供商管理设置的域名 DNS 来获得 IP ,我试过,这种方法基本上是不行了,所以我使用 Google 的 Public DNS 。

当然,也可以自己做 DNS 服务器,使用 Bind 则可,但其麻烦程度不敢苟同,不建议新手使用!

配置 smtp server , pop3 server 等 
查找所有 myMailServer, 替换为你的域名。如: 
<helloName autodetect="false">myMailServer</helloName> ,将 myMailServer 修改为你的域名。比如: abc.com

注释以下的语句:

<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">
           <processor> relay-denied </processor>
            <notice>550 - Requested action not taken: relaying denied</notice>
         </mailet>

打开 smtp 认证 
<authRequired>true</authRequired>

smtp 认证的作用在于不让未能授权的人使用你的邮件服务器发送垃圾邮件,在 <servername></servername> 里指定哪些域名可以使用这个邮件服务器,如:

<servername>abc.com</servername>

<servername>abc.com.cn</servername>

则当发送人地址为 XXX.abc.com 或者 XXX.abc.com.cn 时才能通过,如果写成 XXX.bbc.com 的话就不会通过验证,这种方式就禁止了不法人士使用啦!

修改 root 口令。 account login="root" password="mypassword"

启动 James( 使用 Phoenix.sh) :

./Phoenix.sh start

最后使用 telnet 添加邮件用户 ( 具体命令在 telnet 后输入 help 查看 ) :

telnet server-name 4555

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

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

简介

James 是一个企业级的邮件服务器,它完全实现了smtp 和 pops 以及nntp 协议。同时,james服务器又是一个邮件应用程序平台。James的核心是Mailet API,而james 服务齐是一个mailet的容器。它可以让你非常容易的实现出很强大的邮件应用程序。James开源项目被广泛的应用于与邮件有关的项目中。你可以通过它来搭建自己的邮件服务器。我们可以利用Mailet API,编程接口来实现自己所需的业务。James集成了Avalon 应用程序框架以及Phoenix Avalon 框架容器。Phoenix为james 服务器提供了强大的支持。需要说明的是Avalon开源项目目前已经关闭。

   快速上手

安装james

我这次使用的安装包是james 2.3.1。大家可以从这里下载到http://james.apache.org/download.cgi

现在让我们开始我们激动人心的james之旅。首先我们将james-binary-2.3.1.zip解压缩下载到你的安装目录。我们可以把这个过程理解为安装的过程。我在这里将它解压到c:\.并且把它改名为james.这样我们的james就安装好了。目录为C:\james。很简单吧!

准备知识 - 学习一些必要的知识

在我使用james的时候让我感觉首先理解james的应用程序结构是很重要的。否则你会在使用中感到很困惑。

它的应用程序结构是这样的:

James

|_ _apps

|_ _bin

|_ _conf

|_ _ext

|_ _lib

|_ _logs

|_ _tools

我们重点介绍一下两个文件夹bin 和 apps.

bin目录中的run.bat和run.sh是James的启动程序。只要记住这个重要文件就可以。

启动之后控制台显示如下:

Using PHOENIX_HOME:   C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME:      C:\j2sdk1.4.2_02

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

Apps 目录下有个james的子目录这个目录是它的核心。

james

|_ _SAR-INF

|_ _conf

|_ _logs

|_ _var

|_mail

|_address-error

|_error

|_indexes

|_outgoing

|_relay-denied

|_spam

|_spool

|_nntp

|_....

|_users

SAR-INF 下有一个config.xml是james中的核心配置文件。

Logs 包含了与james有关的Log。调试全靠它了。

Var 包含了一些文件夹通过它们的名字我们大概也能猜测出它们的用途。Mail主要用于存储邮件。nntp主要用于新闻服务器。Users用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如:[email protected]的pig就是所谓用用户。

创建用户:

 我们在James上建若干用户,用来测试收发邮件。当然如果你不用james本身的用户也可以。James以telnet 的方式提供了接口用来添加用户。下面我来演示一下。

首先使用telnet来连接james的remote manager .

1.telnet localhost 4555 回车

2.然后输入管理员用户名和密码(user/pwd : root/root 是默认设置这个可以在config.xml中修改)

JAMES Remote Administration Tool 2.3.1

Please enter your login and password

Login id:

root

Password:

root

Welcome root. HELP for a list of commands

3.添加用户

adduser kakaxi kakaxi

User kakaxi added

Adduser mingren mingren

User mingren added

4.查看添加情况

listusers

Existing accounts 2

user: mingren

user: kakaxi

得到上面的信息说明我们已经添加成功。

发送器

这个类主要用来测试我们的邮件服务器,可以不用将其打入包中。

java 代码

  1. package com.yy.jamesstudy;
  2. import java.util.Date;
  3. import java.util.Properties;
  4. import javax.mail.Authenticator;
  5. import javax.mail.Message;
  6. import javax.mail.PasswordAuthentication;
  7. import javax.mail.Session;
  8. import javax.mail.Transport;
  9. import javax.mail.internet.InternetAddress;
  10. import javax.mail.internet.MimeMessage;
  11. public class Mail {
  12. private String mailServer, From, To, mailSubject, MailContent;
  13. private String username, password;
  14. private Session mailSession;
  15. private Properties prop;
  16. private Message message;
  17. // Authenticator auth;//认证
  18. public Mail() {
  19. // 设置邮件相关
  20. username = "kakaxi";
  21. password = "kakaxi";
  22. mailServer = "localhost";
  23. From = "[email protected]";
  24. To = "[email protected]";
  25. mailSubject = "Hello Scientist";
  26. MailContent = "How are you today!";
  27. }
  28. public void send(){
  29. EmailAuthenticator mailauth =
  30. new EmailAuthenticator(username, password);
  31. // 设置邮件服务器
  32. prop = System.getProperties();
  33. prop.put("mail.smtp.auth", "true");
  34. prop.put("mail.smtp.host", mailServer);
  35. // 产生新的Session服务
  36. mailSession = mailSession.getDefaultInstance(prop,
  37. (Authenticator) mailauth);
  38. message = new MimeMessage(mailSession);
  39. try {
  40. message.setFrom(new InternetAddress(From)); // 设置发件人
  41. message.setRecipient(Message.RecipientType.TO,
  42. new InternetAddress(To));// 设置收件人
  43. message.setSubject(mailSubject);// 设置主题
  44. message.setContent(MailContent, "text/plain");// 设置内容
  45. message.setSentDate(new Date());// 设置日期
  46. Transport tran = mailSession.getTransport("smtp");
  47. tran.connect(mailServer, username, password);
  48. tran.send(message, message.getAllRecipients());
  49. tran.close();
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. }
  53. }
  54. public static void main(String[] args) {
  55. Mail mail;
  56. mail = new Mail();
  57. System.out.println("sending......");
  58. mail.send();
  59. System.out.println("finished!");
  60. }
  61. }
  62. class EmailAuthenticator extends Authenticator {
  63. private String m_username = null;
  64. private String m_userpass = null;
  65. void setUsername(String username) {
  66. m_username = username;
  67. }
  68. void setUserpass(String userpass) {
  69. m_userpass = userpass;
  70. }
  71. public EmailAuthenticator(String username, String userpass) {
  72. super();
  73. setUsername(username);
  74. setUserpass(userpass);
  75. }
  76. public PasswordAuthentication getPasswordAuthentication() {
  77. return new PasswordAuthentication(m_username, m_userpass);
  78. }
  79. }

<v:shapetype id="_x0000_t75" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"> </v:shapetype>

实现-Matcher 和 Mailet编写

我先解释一下大概的流程:当james 接收到一个smtp请求时首先会交给matcher来进行一系列过滤动作。然后由matcher交给相应的mailet来进行处理。James就相当于一个matcher和mailet的容器。就像tomcat之于servlet。而mailet和servlet很是相似。

我们这里要完成的功能很简单,就是当james邮件服务器接收到鸣人(人名)后把发送者和邮件正文打印到控制台。我们分析这个需求发现我们需要写一个matcher以及一个mailet.matcher用来过滤而mailet用来将邮件内容打印到控制台。为了简单起见,我这次只是继承了GenericMailet 和GenericRecipientMatcher 两个已经实现的 mailet 和 matcher.具体的Matcher和Mailet的使用我以后会整理成另外一篇文章。

 

Matcher 的实现

  1. package com.yy.jamesstudy;
  2. import javax.mail.MessagingException;
  3. import org.apache.mailet.GenericRecipientMatcher;
  4. import org.apache.mailet.MailAddress;
  5. /**
  6. * System   jamesstudy
  7. * Package  com.yy.jamesstudy
  8. *
  9. * @author Yang Yang
  10. * Created on 2007-9-14下午02:17:07
  11. */
  12. public class BizMatcher extends GenericRecipientMatcher {
  13. public boolean matchRecipient(MailAddress recipient) throws MessagingException {
  14. //只接受邮件地址包含鸣人的邮件
  15. if (recipient.getUser().indexOf("mingren")!=-1) {
  16. return true;
  17. }
  18. return false;
  19. }
  20. }

GenericRecipientMatcher 是一个针对收件人进行过滤的matcher.

Mailet 的实现

  1. package com.yy.jamesstudy;
  2. import java.io.IOException;
  3. import javax.mail.MessagingException;
  4. import javax.mail.internet.MimeMessage;
  5. import org.apache.mailet.GenericMailet;
  6. import org.apache.mailet.Mail;
  7. import org.apache.mailet.MailAddress;
  8. /**
  9. * System   jamesstudy
  10. * Package  com.yy.jamesstudy
  11. *
  12. * @author  Yang Yang
  13. * Created on 2007-9-14下午02:16:31
  14. */
  15. public class BizMaillet extends GenericMailet {
  16. public void service(Mail mail)  {
  17. MailAddress ma = mail.getSender();
  18. System.out.println("sender:"+ma.toInternetAddress().toString());
  19. try {
  20. MimeMessage mm = mail.getMessage();
  21. System.out.println("content:"+(String)mm.getContent().toString());
  22. } catch (IOException e) {
  23. e.printStackTrace();
  24. } catch (MessagingException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }

GenericMailet 是一个mailet的基本实现。

编译

我们把这两个java文件的class文件编译成一个名字为:jamesstudy.jar 的jar文件。

发布-Matcher 和 Mailet以及config.xml

1.发布jar文件

我们把这个jar文件发布到C:\james\apps\james\SAR-INF\lib。

注意:如果没有找到相关目录,则需要先启动一遍james,相关的文件夹才会被创建。还有一点需要特别说明:lib目录是通过我们手动创建的。

2.将Matcher 和 Mailet发布到config.xml中,config.xml在james\apps\james\SAR-INF\下

1)我们首先找到如下内容

  1. <mailetpackages>
  2. <mailetpackage>org.apache.james.transport.mailetsmailetpackage>
  3. <mailetpackage>org.apache.james.transport.mailets.smimemailetpackage>
  4. mailetpackages>
  5. <matcherpackages>
  6. <matcherpackage>org.apache.james.transport.matchersmatcherpackage>
  7. <matcherpackage>org.apache.james.transport.matchers.smimematcherpackage>
  8. matcherpackages>

2)加入包声明

  1. <mailetpackages>
  2. <mailetpackage>com.yy.jamesstudymailetpackage>
  3. <mailetpackage>org.apache.james.transport.mailetsmailetpackage>
  4. <mailetpackage>org.apache.james.transport.mailets.smimemailetpackage>
  5. mailetpackages>
  6. <matcherpackages>
  7. <matcherpackage>com.yy.jamesstudy matcherpackage>
  8. <matcherpackage>org.apache.james.transport.matchersmatcherpackage>
  9. <matcherpackage>org.apache.james.transport.matchers.smimematcherpackage>
  10. matcherpackages>

3)加入 Matcher 和 Mailet的关联关系

找到 <processor name="root"></processor> 元素在它的下面加入

xml 代码

  1. <mailet match="BizMatcher" class="BizMaillet"/>

Mailet元素代表了一个matcher和一个mailet的组合。Match属性:是指matcher的类名。而class 属性:是指mailet的类名。

最后别忘了,保存退出。并且重新启动james服务器。

测试- 验证我们的mail应用程序

我们主要通过mail类来测试我们的应用。还记得我们刚才写的那个mail类吗?!在那个类中我们初始化了相关的信息.

username = "kakaxi";

password = "kakaxi";

mailServer = "localhost";

From = "[email protected]";

To = "[email protected]";

mailSubject = "Hello Scientist";

MailContent = "How are you today!";

发件人是卡卡西,收件人是mingren.这两个用户我们在前面都已经创建完毕。我们用他们来测试james的邮件收发以及mailet api的应用。

根据需求假设我们发给james 服务器(这里是james的默认配置:localhost)的邮件的收件人是鸣人。那么我们就能通过matcher监测到这封邮件,并且调用相应的mailet来进行处理。由mailet打印出相应的邮件发送者和正文。运行Mail类后得到

Using PHOENIX_HOME:   C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME:      C:\j2sdk1.4.2_02

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

sender:[email protected]
content:How are you today!

总结

最终我们看到发送者和正文的信息。That’s all ! 大功告成。

其实james的功能是非常非常强大的,尤其是它的Mailet API能够帮助我们完成很多与邮件邮件有关的工作如过滤垃圾邮件。用它我们甚至可以搭建我们自己的企业邮件服务器。我们最近的项目中就使用到了。我们通过james接收到的邮件,然后用matcher找到我们想要处理的邮件,然后通过mailet做一些业务上的处理。这篇文章涵盖的面很小。如果大家有兴趣可以研究一下james项目。Config.xml实际上是最重要的文件,如果你把它研究透彻了那么就就算把Mailet API研究透了。以后我可能会写一篇相关的文章,在这就不多说了。希望这篇文章能够对大家有所启发!有所帮助!祝大家工作顺利!

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

时间: 2024-10-13 05:34:36

Apache James使用的方法及相关心得(转)的相关文章

搭建Apache James邮件服务

什么是邮件服务器 邮件服务器是一种用来负责电子邮件收发管理的设备,而邮件服务就是责邮件的收信和发信功能,其最主要有pop和smtp两个协议.关于这两个协议,有着很多的知识点涵盖其中,这里不过多介绍.下面是我接触过的两个可以实现邮件服务的解决方案. 1.易邮邮件服务 在windows系统下,可以使用 易邮邮件服务 ,这个服务器简单而且实用,用在平时开发,测试或者局域网间的邮件收发还是挺方便的,不过我没有找到官方的,可以将易邮邮件服务安装在Linx的相关资料,因此不使用这个.这是易邮邮件服务的官方网

Apache James搭建内网邮件服务器

Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也很有必要来尝试一把邮件服务器的搭建,这里选取的是james这个工具. 为什么要使用内网邮件服务器? a.安全这里仅限个人观点.对于任何一个企业来说,必要安全保密是非常重要的. b.不受internet的限制虽然说现在到处都是wifi,但是有一个能够自己来控制和使用的邮件服务器肯定是不错的选择. 什么

HttpClient有关方法及相关优化整理

HttpClient4中采用 ThreadSafeClientConnManager来保证线程的安全,优于2.0的 MultiThreadedHttpConnectionManager类.另外Apache官方强烈推荐只使用一个HttpClient的实例,所以我 们可以将以下demo方法写成单例模式. demo将使用StringEntity来完成不指定参数名发送Post,已经采用ThreadSafeClientConnManager来保证线程的安全 ? 1 2 3 4 5 6 7 8 9 10 1

Apache 代理服务的配置方法

有的时候,需要将多个网站部署在同一个域名下,对外统一访问入口,但是不同的程序, 监听端口不同,如果需要统一,就需要做代理.下面就详细介绍一下,Apache 代理服务的配置方法,另外也可以用ngix做代理. 一.安装apache服务器:( 略 ) 二.配置apache代理服务参数: 1.  打开右下角apache服务器图标: 2.  点击打开如下图所示,选中Apache2.2,点击Stop停止apache服务: 3.  查找apache程序的安装目录,我的目录是: 4.  打开 conf 文件夹,

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

首先环境搭建: 1.下载安装JDK,并且配置环境变量 2.下载Apache James ,下载解压之后的目录如图 双击bin下边的run.bat批处理文件安装James 服务,提示如下信息说明安装成功: Using PHOENIX_HOME: C:\james Using PHOENIX_TMPDIR: C:\james\temp Using JAVA_HOME: Phoenix 4.0.1 james 2.3.2.1 Remote Manager Service started plain:4

钢条切割问题求解方法及相关思考

钢条切割问题求解方法及相关思考 题目来源于<算法导论>第15章第一节.问题如下: 给定一个长度为n英寸的钢条和一个价格表pi(i=1,2,3,...n),求能够使销售收益rn最大的切割方案. 问题1:一共有多少种切割方式? 思路一:对于一个长度为n英寸的钢条,其中一共有n-1个节点可供切割,在每一个节点处都可以选择切割或者不切割,将对一根钢条的切割过程视为从第一个节点直到第n-1个节点逐一选择切割或者不切割的一个过程,利用乘法原理,可以算出来总共有2n-1种切割方案.以四个节点的钢条为例: 思

Ubuntu14.14开启Apache Rewrite功能的方法详解

Ubuntu上开启Apache Rewrite功能的方法发布时间:2012-09-11编辑:脚本学堂本文介绍ubuntn系统中开启apache的urlrewrite功能的方法. 在Windows上开启Apache的urlRewrite非常简单,因为apache的用户配置都是放在http.conf文件中,要开启Rewrite功能,只需要把该文件中LoadModule rewrite_module modules/mod_rewrite.so前面的注视去掉,然后重启APACHE即可. 但在Ubunt

DOM方法index()相关问题(为何$(this).index(this)是错误的 )

index() 方法返回指定元素相对于其他指定元素的 index 位置. 完全语法为:$(selector).index(element) ,其中element为可选参数. 1.若是省略element,则 获得第一个匹配元素相对于其同胞元素的 index 位置. 例如在如下代码中 <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></sc

MyEclipse安装插件的三种方法和使用心得

MyEclipse安装插件的三种方法和使用心得 本文讲解MyEclipse(MyEclipse10)的三种方法,以TestNG为例 Eclipse update site URL:  http://beust.com/eclipse. 一.通过MyEclipse Configuration Center在线安装 1. 打开MyEclipse10,在菜单栏选择MyEclipse→MyEclipse Configuration Center,即可进入到MyEclipse Configuration