一、域名配置(外网访问)
首先要做的就是配置域名的MX 记录:
先添加一条A记录:
mail.abc.com 指向服务器IP!
然后添加域名的MX 记录,指向mail.abc.com A 记录( 即域名MX 记录的值为mail.abc.com).
OK ,域名的配置就完成!
二、安装部署
James 不需要编译安装,解压即可以使用,把 james 下载来后,必须先启动一下!
进入James 根目录下的bin 目录,启动:
[bin]$ ./run.sh
然后按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 服务器, :
<dnsserver>
<servers>
<server>x.x.x.x</server>
<server>y.y.y.y</server>
</servers>
</dnsserver>
设置 autodiscover 为 false
注意 ,设置 DNS 这步很重要,发送邮件不成功的问题经常会出在这里!
配置 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
|_ _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@csdn.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 代码
实现-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的使用我以后会整理成另外一篇文章。
温馨提示:
GenericMailet 和GenericRecipientMatcher依赖于 apache-mailet-base 以下Maven项
复制代码
<dependencies>
<dependency>
<groupId>org.apache.james</groupId>
<artifactId>apache-mailet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.james</groupId>
<artifactId>apache-mailet-base</artifactId>
<version>3.1.0</version>
</dependency>
<!--<dependency>-->
<!--<groupId>org.apache.james</groupId>-->
<!--<artifactId>apache-mailet-standard</artifactId>-->
<!--<version>3.1.0</version>-->
<!--</dependency>-->
</dependencies>
复制代码
Matcher 的实现
复制代码
import javax.mail.MessagingException;
import org.apache.mailet.GenericRecipientMatcher;
import org.apache.mailet.MailAddress;
public class BizMatcher extends GenericRecipientMatcher {
public boolean matchRecipient(MailAddress recipient) throws MessagingException {
//只接受邮件地址包含鸣人的邮件
if (recipient.getUser().indexOf("mingren")!=-1) {
return true;
}
return false;
}
}
复制代码
GenericRecipientMatcher 是一个针对收件人进行过滤的matcher.
Mailet 的实现
复制代码
import java.io.IOException;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.apache.mailet.GenericMailet;
import org.apache.mailet.Mail;
import org.apache.mailet.MailAddress;
public class BizMaillet extends GenericMailet {
public void service(Mail mail) {
MailAddress ma = mail.getSender();
System.out.println("sender:"+ma.toInternetAddress().toString());
try {
MimeMessage mm = mail.getMessage();
System.out.println("content:"+(String)mm.getContent().toString());
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
复制代码
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)我们首先找到如下内容
复制代码
<mailetpackages>
<mailetpackage>org.apache.james.transport.mailetsmailetpackage>
<mailetpackage>org.apache.james.transport.mailets.smimemailetpackage>
mailetpackages>
<matcherpackages>
<matcherpackage>org.apache.james.transport.matchersmatcherpackage>
<matcherpackage>org.apache.james.transport.matchers.smimematcherpackage>
matcherpackages>
复制代码
2)加入包声明
3)加入 Matcher 和 Mailet的关联关系
找到 <processor name="root"></processor> 元素在它的下面加入
xml 代码
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:ssssi@localhost
content:How are you today!