`
yangyang
  • 浏览: 174400 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用JAMES实现自己的邮件服务器

阅读更多
James 是一个企业级的邮件服务器,它完全实现了smtp 和 pops 以及nntp 协议。同时,james服务器又是一个邮件应用程序平台。James的核心是Mailet API,而james 服务齐是一个mailet的容器。它可以让你非常容易的实现出很强大的邮件应用程序。James开源项目被广泛的应用于与邮件有关的项目中。你可以通过它来搭建自己的邮件服务器。我们可以利用Mailet API,编程接口来实现自己所需的业务。James集成了Avalon 应用程序框架以及Phoenix Avalon 框架容器。Phoenixjames 服务器提供了强大的支持。需要说明的是Avalon开源项目目前已经关闭。
   我这次使用的安装包是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.batrun.shJames的启动程序。只要记住这个重要文件就可以。
启动之后控制台显示如下:
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.xmljames中的核心配置文件。
Logs 包含了与james有关的Log。调试全靠它了。
Var 包含了一些文件夹通过它们的名字我们大概也能猜测出它们的用途。Mail主要用于存储邮件。nntp主要用于新闻服务器。Users用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如:pig@sina.compig就是所谓用用户。
 
创建用户:
 我们在James上建若干用户,用来测试收发邮件。当然如果你不用james本身的用户也可以。Jamestelnet 的方式提供了接口用来添加用户。下面我来演示一下。
首先使用telnet来连接jamesremote 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.   
  3. import java.util.Date;   
  4. import java.util.Properties;   
  5.   
  6. import javax.mail.Authenticator;   
  7. import javax.mail.Message;   
  8. import javax.mail.PasswordAuthentication;   
  9. import javax.mail.Session;   
  10. import javax.mail.Transport;   
  11. import javax.mail.internet.InternetAddress;   
  12. import javax.mail.internet.MimeMessage;   
  13.   
  14. public class Mail {   
  15.     private String mailServer, From, To, mailSubject, MailContent;   
  16.   
  17.     private String username, password;   
  18.   
  19.     private Session mailSession;   
  20.   
  21.     private Properties prop;   
  22.   
  23.     private Message message;   
  24.   
  25.     // Authenticator auth;//认证   
  26.     public Mail() {   
  27.         // 设置邮件相关   
  28.         username = "kakaxi";   
  29.         password = "kakaxi";   
  30.         mailServer = "localhost";   
  31.         From = "kakaxi@localhost";   
  32.         To = "mingren@localhost";   
  33.         mailSubject = "Hello Scientist";   
  34.         MailContent = "How are you today!";   
  35.     }   
  36.     public void send(){   
  37.         EmailAuthenticator mailauth =    
  38. new EmailAuthenticator(username, password);   
  39.         // 设置邮件服务器   
  40.         prop = System.getProperties();   
  41.         prop.put("mail.smtp.auth""true");   
  42.         prop.put("mail.smtp.host", mailServer);   
  43.         // 产生新的Session服务   
  44.         mailSession = mailSession.getDefaultInstance(prop,   
  45.                 (Authenticator) mailauth);   
  46.         message = new MimeMessage(mailSession);   
  47.   
  48.         try {   
  49.         message.setFrom(new InternetAddress(From)); // 设置发件人   
  50.         message.setRecipient(Message.RecipientType.TO,    
  51. new InternetAddress(To));// 设置收件人   
  52.         message.setSubject(mailSubject);// 设置主题   
  53.         message.setContent(MailContent, "text/plain");// 设置内容   
  54.         message.setSentDate(new Date());// 设置日期   
  55.         Transport tran = mailSession.getTransport("smtp");   
  56.         tran.connect(mailServer, username, password);   
  57.         tran.send(message, message.getAllRecipients());   
  58.         tran.close();   
  59.         } catch (Exception e) {   
  60.             e.printStackTrace();   
  61.         }   
  62.     }   
  63.     public static void main(String[] args) {   
  64.         Mail mail;   
  65.         mail = new Mail();   
  66.         System.out.println("sending......");   
  67.         mail.send();   
  68.         System.out.println("finished!");   
  69.     }   
  70.   
  71. }   
  72.   
  73. class EmailAuthenticator extends Authenticator {   
  74.     private String m_username = null;   
  75.   
  76.     private String m_userpass = null;   
  77.   
  78.     void setUsername(String username) {   
  79.         m_username = username;   
  80.     }   
  81.   
  82.     void setUserpass(String userpass) {   
  83.         m_userpass = userpass;   
  84.     }   
  85.   
  86.     public EmailAuthenticator(String username, String userpass) {   
  87.         super();   
  88.         setUsername(username);   
  89.         setUserpass(userpass);   
  90.     }   
  91.   
  92.     public PasswordAuthentication getPasswordAuthentication() {   
  93.         return new PasswordAuthentication(m_username, m_userpass);   
  94.     }   
  95. }   
<v:shapetype id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" filled="f" stroked="f" coordsize="21600,21600" o:spt="75"> </v:shapetype>
 
实现-Matcher 和 Mailet编写
     我先解释一下大概的流程:当james 接收到一个smtp请求时首先会交给matcher来进行一系列过滤动作。然后由matcher交给相应的mailet来进行处理。James就相当于一个matchermailet的容器。就像tomcat之于servlet。而mailetservlet很是相似。
     我们这里要完成的功能很简单,就是当james邮件服务器接收到鸣人(人名)后把发送者和邮件正文打印到控制台。我们分析这个需求发现我们需要写一个matcher以及一个mailet.matcher用来过滤而mailet用来将邮件内容打印到控制台。为了简单起见,我这次只是继承了GenericMailet GenericRecipientMatcher 两个已经实现的 mailet matcher.具体的MatcherMailet的使用我以后会整理成另外一篇文章。
 
Matcher 的实现
  1. package com.yy.jamesstudy;   
  2.   
  3. import javax.mail.MessagingException;   
  4. import org.apache.mailet.GenericRecipientMatcher;   
  5. import org.apache.mailet.MailAddress;   
  6. /**  
  7.  * System   jamesstudy  
  8.  * Package  com.yy.jamesstudy  
  9.  *   
  10.  * @author Yang Yang  
  11.  * Created on 2007-9-14下午02:17:07  
  12.  */  
  13. public class BizMatcher extends GenericRecipientMatcher {   
  14.   
  15.     public boolean matchRecipient(MailAddress recipient) throws MessagingException {   
  16.         //只接受邮件地址包含鸣人的邮件   
  17.           if (recipient.getUser().indexOf("mingren")!=-1) {   
  18.               return true;   
  19.           }   
  20.         return false;   
  21.     }   
  22. }   
GenericRecipientMatcher 是一个针对收件人进行过滤的matcher.
 
Mailet 的实现
  1. package com.yy.jamesstudy;   
  2.   
  3. import java.io.IOException;   
  4. import javax.mail.MessagingException;   
  5. import javax.mail.internet.MimeMessage;   
  6. import org.apache.mailet.GenericMailet;   
  7. import org.apache.mailet.Mail;   
  8. import org.apache.mailet.MailAddress;   
  9. /**  
  10.  * System   jamesstudy  
  11.  * Package  com.yy.jamesstudy  
  12.  *   
  13.  * @author  Yang Yang  
  14.  * Created on 2007-9-14下午02:16:31  
  15.  */  
  16. public class BizMaillet extends GenericMailet {   
  17.   
  18.     public void service(Mail mail)  {   
  19.         MailAddress ma = mail.getSender();   
  20.         System.out.println("sender:"+ma.toInternetAddress().toString());   
  21.         try {   
  22.             MimeMessage mm = mail.getMessage();   
  23.             System.out.println("content:"+(String)mm.getContent().toString());   
  24.         } catch (IOException e) {   
  25.             e.printStackTrace();   
  26.         } catch (MessagingException e) {   
  27.             e.printStackTrace();   
  28.         }   
  29.     }   
  30. }   
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.xmljames\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.   
  7.    <matcherpackages>  
  8.       <matcherpackage>com.yy.jamesstudy matcherpackage>  
  9.       <matcherpackage>org.apache.james.transport.matchersmatcherpackage>  
  10.       <matcherpackage>org.apache.james.transport.matchers.smimematcherpackage>  
  11.    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 = "kakaxi@localhost";
                   To = "mingren@localhost";
                   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:kakaxi@localhost
content:How are you today!

总结

最终我们看到发送者和正文的信息。That’s all ! 大功告成。
         其实james的功能是非常非常强大的,尤其是它的Mailet API能够帮助我们完成很多与邮件邮件有关的工作如过滤垃圾邮件。用它我们甚至可以搭建我们自己的企业邮件服务器。我们最近的项目中就使用到了。我们通过james接收到的邮件,然后用matcher找到我们想要处理的邮件,然后通过mailet做一些业务上的处理。这篇文章涵盖的面很小。如果大家有兴趣可以研究一下james项目。Config.xml实际上是最重要的文件,如果你把它研究透彻了那么就就算把Mailet API研究透了。以后我可能会写一篇相关的文章,在这就不多说了。希望这篇文章能够对大家有所启发!有所帮助!祝大家工作顺利!
分享到:
评论
8 楼 zhangyi462002 2012-08-08  
firerdl 写道
请问下 我配置<mailet match="BizMatcher" class="BizMaillet"/>了 启动邮件服务器就出错 <mailet match="BizMatcher" class="BizMaillet"/> 到底该怎么配置啊?

哥们这个问题有不有人解决了,我觉得是打包的问题
7 楼 wxb_love 2008-06-17  
以前没有接触过,现保存,以后可能会用到的。谢谢楼主
6 楼 heyujava 2008-06-17  
正学JAMES,支持
5 楼 麦田守望者 2008-04-28  
为什么配置了<mailet match="BizMatcher" class="BizMaillet"/>在config.xml中,但是没有生效呀!环需要配置其它的东西吗?
4 楼 firerdl 2008-04-25  
请问下 我配置<mailet match="BizMatcher" class="BizMaillet"/>了 启动邮件服务器就出错 <mailet match="BizMatcher" class="BizMaillet"/> 到底该怎么配置啊?
3 楼 shijiyu 2008-04-07  
你好 我想问下 你说的这个服务器关于NNTP客户端怎样来实现对服务器新闻搜索功能
2 楼 darkjune 2008-01-30  
最近想看看james的pop3协议部分,还没搞清楚james的协议在哪里搞,看来应该是mime那块
1 楼 niceken 2007-11-11  
您好,我正在研究james邮件服务器在WEB上的开发。
看了您的帖子我做了一些小测试,可以实现,非常感谢。

现在我想在james处理完邮件以后(病毒,垃圾扫描结束以后)把邮件解析出来,然后插入我自建的数据库~

请问怎么判断这封邮件已经经过处理,可以用我自己写的mailet去操作了?我写的matcher/mailet对应该写在配置文件的什么地方?

如蒙赐教,不胜感激

相关推荐

    Java开源邮件服务器james源码

    总的来说,Apache James是一个功能全面且高度可定制的Java邮件服务器,其源代码对于Java开发者来说是一份宝贵的教育资源,有助于理解邮件服务器的工作原理,同时为构建自己的邮件系统或扩展已有功能提供了可能。...

    用JAMES实现自己的邮件服务器.docx

    本文将详细介绍如何使用JAMES(Java Advanced Mail Enterprise Solution)来构建一套属于自己的邮件服务器。 #### 二、JAMES简介 JAMES是一款基于Java开发的企业级邮件服务器,它完全支持SMTP、POP3和NNTP等协议,...

    基于ApacheJames邮件服务器的收发邮件代码及服务

    在本项目中,我们将探讨如何利用Apache James来实现邮件的发送与接收,并通过JavaMail API进行相关的编程操作。 1. **Apache James邮件服务器的安装与配置** - 下载Apache James最新版本的源码或二进制包。 - ...

    james-2.3.2邮件服务器

    **James邮件服务器详解** James邮件服务器是一款开源的、基于Java技术构建的邮件传输代理服务器,其版本号为2.3.2。这个软件提供了一整套邮件服务解决方案,包括SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和...

    apache-james java发送邮件服务器

    标题中的"apache-james java发送邮件服务器"指的是使用Apache James作为邮件发送平台,通过Java编程语言进行配置和操作。 Apache James的主要特点和知识点包括: 1. **开源与社区支持**:Apache James是由Apache...

    James邮件服务器简介与配置

    James邮件服务器是一款由Apache组织开发的开源邮件服务器,完全用Java编写,具备高度的灵活性和可扩展性。这款服务器不仅支持SMTP和POP3协议,还实现了NNTP新闻服务器功能,使其成为一款全面的企业级邮件解决方案。 ...

    james实现邮件服务器.xls

    james实现邮件服务器 全面讲解安装 配置过程 实现局域网以及外网收发邮件 数据库存储用户及邮件配置等

    james邮件内外网收发讲解

    本讲解将聚焦于James邮件服务器的最新版本——3.0.4 beta,探讨如何配置它来实现内外网的邮件收发功能。James是一个开源的、基于Java的邮件传输代理,提供了邮件服务器的全面解决方案。 首先,让我们理解邮件服务器...

    james3.0.1 邮件服务器

    Apache James 3.0.1 是一款开源且免费的邮件服务器软件,专为处理电子邮件通信而设计。这个软件项目由Apache软件基金会维护,提供了一种高效、可扩展且灵活的解决方案,适合各种规模的企业和组织使用。James的核心...

    纯java邮件服务器james配置说明

    Apache James是一款开源的、完全基于Java的邮件服务器,它提供了企业级的邮件处理能力,包括邮件的接收、发送以及管理等功能。这篇配置说明主要指导如何搭建并使用Apache James,以便于构建免费的企业邮件系统。 ...

    apache james(邮件服务器)配置

    ### Apache James 邮件服务器配置详解 ...通过以上步骤,即可完成Apache James邮件服务器的基本配置,并实现内网间的邮件收发功能。此外,通过适当的网络配置,还可实现与外部邮件系统的互联互通。

    James 2.3.2 邮件服务器

    **James邮件服务器详解** James(Java Apache Mail Enterprise Server)是一个开源的、基于Java技术的邮件服务器,它在邮件处理和管理方面提供了全面的功能。版本2.3.2是该服务器的一个稳定版本,提供了多种特性来...

    James邮件服务器

    James邮件服务器是Apache软件基金会开发的一个开源邮件服务器项目,它是一个完全用Java编写的网络应用程序。这个服务器提供了多种邮件服务功能,包括SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP4...

    james3.0邮件服务器及配置说明

    在本文中,我们将深入探讨James 3.0 的主要特性和配置步骤,帮助你搭建和管理自己的邮件服务器。 1. **安装James 3.0** 在开始配置之前,首先确保你的系统环境满足James 3.0 的运行需求,通常需要Java 8 或更高...

    James+Javamail构建邮件服务

    James不仅是一个邮件服务器,更是一个邮件应用平台,通过Mailet(类似于Servlet)机制可以轻松扩展其功能,例如实现Mail2SMS(邮件转短信)、Mail2Fax(邮件转传真)等功能。 James具有非常灵活的配置选项,特别是...

    james和javamail实现邮件收发(带发送附件)

    首先,James(Apache James)是一个开源的邮件服务器,它支持SMTP、POP3和IMAP协议,可以作为企业级的邮件解决方案。James的核心特性之一是其可扩展性,可以通过插件连接到各种数据库,以便存储和管理邮件数据。 ...

    JAVAMail邮箱服务器搭建步骤详解

    如James-Hupa用于WebMail开发,James-Protocols提供了邮件协议框架,James-IMAP实现了IMAP协议,James-Mailbox和James-Mime4j分别处理邮件存储和解析,James-MPT用于测试邮件服务器,而James-jSPF则实现了防止伪造...

    Apache James邮件服务器配置

    Apache James邮件服务器是一款开源的邮件服务器软件,基于Java平台,实现了SMTP、POP3和IMAP4等邮件协议,为企业和个人提供了稳定、可扩展的邮件服务解决方案。本篇将深入探讨如何配置Apache James邮件服务器。 ...

Global site tag (gtag.js) - Google Analytics