经过一番的辛苦努力,终于把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
Using PHOENIX_TMPDIR: C:james emp
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
- 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);
- }
- }
温馨提示:
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>
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.
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的基本实现。
<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>
- <mailetpackages>
- <mailetpackage>com.yy.jamesstudymailetpackage>
- <mailetpackage>org.apache.james.transport.mailetsmailetpackage>
- <mailetpackage>org.apache.james.transport.mailets.smimemailetpackage>
- mailetpackages>
- <matcherpackages>
- <matcherpackage>com.yy.jamesstudy matcherpackage>
- <matcherpackage>org.apache.james.transport.matchersmatcherpackage>
- <matcherpackage>org.apache.james.transport.matchers.smimematcherpackage>
- matcherpackages>
- <mailet match="BizMatcher" class="BizMaillet"/>
Using PHOENIX_TMPDIR: C:james emp
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!
总结