简介

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用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如:pig@sina.com的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 = "kakaxi@localhost";

  24. To = "mingren@localhost";

  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="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就相当于一个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 = "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研究透了。以后我可能会写一篇相关的文章,在这就不多说了。希望这篇文章能够对大家有所启发!有所帮助!祝大家工作顺利!

用JAMES实现自己的邮件服务器的更多相关文章

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

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

  2. James搭建邮件服务器

    来源:http://chenfengcn.iteye.com/blog/356874   1 关于James与Javamail Apache James(Java Apache Mail Enterp ...

  3. 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)

    Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...

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

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

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

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

  6. 搭建james邮件服务器

    把james解压到任何一个非中文无空格目录下: lib下添加必要的jar文件: 运行run.bat命令服务器,使用期间不要关闭. 创建邮件数据库 创建配置文件:james-database.prope ...

  7. 配置 Apache James 邮件服务器以使用加密邮件通讯协议

    可先参照: 使用 Apache James 3.3.0(开源免费) 搭建内网电子邮件服务器(基于 Windows + Amazon Corretto 8)https://www.cnblogs.com ...

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

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

  9. Postfix+Dovecot+MySQL搭建邮件服务器

    网上有很多使用Postfix搭建邮件服务器的文章,但目前貌似没有看到较为完整的一篇.本例将尝试在Ubuntu系统中使用Postfix+Dovecot+MySQL搭建邮件服务器. 说到邮件服务器,网上有 ...

随机推荐

  1. 机器学习与R语言:C5.0

    #---------------------------------------- # 功能描述:演示C50建模过程 # 数据集:汉堡大学信贷模型,信贷数据 # #------------------ ...

  2. Python3.x:抢票

    Python3.x:抢票 一个妹子叫我帮她买动车票,结果竟然没买到票:好吧,不好意思说买不到票,写个抢票程序来完成吧: 1,Chromediver安装: 因为需要chrome支持页面测试,所以需要安装 ...

  3. 在linux环境下安装python3.6

    wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz --no-check-certificat gunzip Python-3. ...

  4. 20145312 《Java程序设计》第九周学习总结

    20145312 <Java程序设计>第九周学习总结 学习笔记 Chapter 16整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 SUN公司为了简化.统一对数据库的操作, ...

  5. 20145329 《Java程序设计》实验一总结

    实验指导教师:娄嘉鹏老师 实验日期:2016.4.8 实验时间:16:30~18:30 实验序号:实验一 实验名称:Java开发环境的熟悉 实验目的与要求: 使用JDK编译.运行简单的Java程序. ...

  6. HBase安装过程

    1).上传,解压,重命名,修改环境变量/etc/profile 2).修改 hbase-env.sh 文件 export JAVA_HOME=/usr/java/jdk1.7.0_27 //Java ...

  7. 采用OpenReplicator解析MySQL binlog

    Open Replicator是一个用Java编写的MySQL binlog分析程序.Open Replicator 首先连接到MySQL(就像一个普通的MySQL Slave一样),然后接收和分析b ...

  8. centos 7 删除 virbr0 虚拟网卡virsh net-list

    这几天研究dubbo,在电脑上装了几台Center os 7虚拟机,最后把提供者部署到虚拟机中时,发现一个有趣的事:在dubbo-admin管理平台上看到两台不同虚拟机中的服务提供者ip都是这个玩意. ...

  9. Package Manager Console的使用

    Find-Package PM> Find-Package autofac https://docs.microsoft.com/en-us/nuget/tools/ps-ref-find-pa ...

  10. Spring boot 外部资源配置

    tomcat配置访问图片路径映射到磁盘路径   首先,我在调试页面的时候发现,图片路径为: 1 /webapps/pic_son/img/1234565456.jpg 但是,tomcat中webapp ...