用JAMES实现自己的邮件服务器.docx
- 文档编号:23354856
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:14
- 大小:20.41KB
用JAMES实现自己的邮件服务器.docx
《用JAMES实现自己的邮件服务器.docx》由会员分享,可在线阅读,更多相关《用JAMES实现自己的邮件服务器.docx(14页珍藏版)》请在冰豆网上搜索。
用JAMES实现自己的邮件服务器
用JAMES实现自己的邮件服务器
简介
James是一个企业级的邮件服务器,它完全实现了smtp和pops以及nntp协议。
同时,james服务器又是一个邮件应用程序平台。
James的核心是MailetAPI,而james服务齐是一个mailet的容器。
它可以让你非常容易的实现出很强大的邮件应用程序。
James开源项目被广泛的应用于与邮件有关的项目中。
你可以通过它来搭建自己的邮件服务器。
我们可以利用MailetAPI,编程接口来实现自己所需的业务。
James集成了Avalon应用程序框架以及PhoenixAvalon 框架容器。
Phoenix为james 服务器提供了强大的支持。
需要说明的是Avalon开源项目目前已经关闭。
快速上手
安装james
我这次使用的安装包是james2.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的启动程序。
只要记住这个重要文件就可以。
启动之后控制台显示如下:
UsingPHOENIX_HOME:
C:
\james
UsingPHOENIX_TMPDIR:
C:
\james\temp
UsingJAVA_HOME:
C:
\j2sdk1.4.2_02
Phoenix4.2
JamesMailServer2.3.1
RemoteManagerServicestartedplain:
4555
POP3Servicestartedplain:
110
SMTPServicestartedplain:
25
NNTPServicestartedplain:
119
FetchMailDisabled
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@的pig就是所谓用用户。
创建用户:
我们在James上建若干用户,用来测试收发邮件。
当然如果你不用james本身的用户也可以。
James以telnet 的方式提供了接口用来添加用户。
下面我来演示一下。
首先使用telnet来连接james的remotemanager.
1.telnetlocalhost4555 回车
2.然后输入管理员用户名和密码(user/pwd :
root/root 是默认设置这个可以在config.xml中修改)
JAMESRemoteAdministrationTool2.3.1
Pleaseenteryourloginandpassword
Loginid:
root
Password:
root
Welcomeroot.HELPforalistofcommands
3.添加用户
adduserkakaxikakaxi
Userkakaxiadded
Addusermingrenmingren
Usermingrenadded
4.查看添加情况
listusers
Existingaccounts2
user:
mingren
user:
kakaxi
得到上面的信息说明我们已经添加成功。
发送器
这个类主要用来测试我们的邮件服务器,可以不用将其打入包中。
java代码
∙package com.yy.jamesstudy;
∙
∙import java.util.Date;
∙import java.util.Properties;
∙
∙import javax.mail.Authenticator;
∙import javax.mail.Message;
∙import javax.mail.PasswordAuthentication;
∙import javax.mail.Session;
∙import javax.mail.Transport;
∙import javax.mail.internet.InternetAddress;
∙import javax.mail.internet.MimeMessage;
∙
∙public class Mail {
∙ private String mailServer, From, To, mailSubject, MailContent;
∙
∙ private String username, password;
∙
∙ private Session mailSession;
∙
∙ private Properties prop;
∙
∙ private Message message;
∙
∙ // Authenticator auth;//认证
∙ public Mail() {
∙ // 设置邮件相关
∙ username = "kakaxi";
∙ password = "kakaxi";
∙ mailServer = "localhost";
∙ From = "kakaxi@localhost";
∙ To = "mingren@localhost";
∙ mailSubject = "Hello Scientist";
∙ MailContent = "How are you today!
";
∙ }
∙ public void send(){
∙ EmailAuthenticator mailauth =
∙new EmailAuthenticator(username, password);
∙ // 设置邮件服务器
∙ prop = System.getProperties();
∙ prop.put("mail.smtp.auth", "true");
∙ prop.put("mail.smtp.host", mailServer);
∙ // 产生新的Session服务
∙ mailSession = mailSession.getDefaultInstance(prop,
∙ (Authenticator) mailauth);
∙ message = new MimeMessage(mailSession);
∙
∙ try {
∙ message.setFrom(new InternetAddress(From)); // 设置发件人
∙ message.setRecipient(Message.RecipientType.TO,
∙new InternetAddress(To));// 设置收件人
∙ message.setSubject(mailSubject);// 设置主题
∙ message.setContent(MailContent, "text/plain");// 设置内容
∙ message.setSentDate(new Date());// 设置日期
∙ Transport tran = mailSession.getTransport("smtp");
∙ tran.connect(mailServer, username, password);
∙ tran.send(message, message.getAllRecipients());
∙ tran.close();
∙ } catch (Exception e) {
∙ e.printStackTrace();
∙ }
∙ }
∙ public static void main(String[] args) {
∙ Mail mail;
∙ mail = new Mail();
∙ System.out.println("sending......");
∙ mail.send();
∙ System.out.println("finished!
");
∙ }
∙
∙}
∙
∙class EmailAuthenticator extends Authenticator {
∙ private String m_username = null;
∙
∙ private String m_userpass = null;
∙
∙ void setUsername(String username) {
∙ m_username = username;
∙ }
∙
∙ void setUserpass(String userpass) {
∙ m_userpass = userpass;
∙ }
∙
∙ public EmailAuthenticator(String username, String userpass) {
∙ super();
∙ setUsername(username);
∙ setUserpass(userpass);
∙ }
∙
∙ public PasswordAuthentication getPasswordAuthentication() {
∙ return new PasswordAuthentication(m_username, m_userpass);
∙ }
∙}
shapetypeid="_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">
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 的实现
∙package com.yy.jamesstudy;
∙
∙import javax.mail.MessagingException;
∙import org.apache.mailet.GenericRecipientMatcher;
∙import org.apache.mailet.MailAddress;
∙/**
∙ * System jamesstudy
∙ * Package com.yy.jamesstudy
∙ *
∙ * @author Yang Yang
∙ * Created on 2007-9-14下午02:
17:
07
∙ */
∙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 的实现
∙package com.yy.jamesstudy;
∙
∙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;
∙/**
∙ * System jamesstudy
∙ * Package com.yy.jamesstudy
∙ *
∙ * @author Yang Yang
∙ * Created on 2007-9-14下午02:
16:
31
∙ */
∙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>
∙
∙
∙
∙ matcherpackages>
2)加入包声明
∙
∙
∙
∙
∙ mailetpackages>
∙
∙
∙
∙
∙
∙ matcherpackages>
3)加入 Matcher 和 Mailet的关联关系
找到
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="HelloScientist";
MailContent="Howareyoutoday!
";
发件人是卡卡西,收件人是mingren.这两个用户我们在前面都已经创建完毕。
我们用他们来测试james的邮件收发以及mailetapi的应用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAMES 实现 自己 邮件 服务器