Apache James配置个人笔记(完整解决DNS问题), 网页版的参考 Claros In Touch webmail(Pop3/IMAP)

那鹏
2023-12-01


Apache James配置个人笔记(完整解决DNS问题)

Claros In Touch是一个功能强大,多协议支持的webmail(Pop3/IMAP)系统 (后续补充)

经过一番的辛苦努力,终于把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.


vim命令   :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 


注释掉  
        <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 : 
如果是自己的服务器一般都有dns    查看dns地址:cat /etc/resolv.conf,  没有就用一下公共的吧
<dnsserver> 
        <servers> 

<server>114.114.114.114</server> <!-- 国内公共DNS,比google的要快点 -->  
        <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://181054867.iteye.com/blog/777797        支持原作!






JAMES 垃圾邮件过滤

      最近公司发布了一个JAMES邮件服务器, 第二天早一来, 发现spool里面有几万的垃圾邮件. 
      在网上仔细查了一下, 一般都是自定义一个matcher和一个mailet, 如: 

      Java代码  

  1.       package com.eazitour.mailet;  
  2.       
  3.       import java.util.Collection;  
  4.       import java.util.Iterator;  
  5.       import java.util.Vector;  
  6.       import javax.mail.MessagingException;  
  7.       import org.apache.mailet.GenericMatcher;  
  8.       import org.apache.mailet.Mail;  
  9.       import org.apache.mailet.MailAddress;  
  10.       
  11.       public class FilterSenderMatcher extends GenericMatcher {  
  12.       private static  String[] hosts = null;  
  13.       @Override  
  14.       public Collection match(Mail mail) throws MessagingException {  
  15.       //System.out.println("getCondition:" + getCondition());  
  16.       if (hosts == null && getCondition() != null) {  
  17.       hosts = getCondition().split(",");  
  18.       }  
  19.       if (hosts == null || hosts.length == 0 || getCondition() == null) {  
  20.       return mail.getRecipients();  
  21.       }  
  22.       MailAddress mailAddress = mail.getSender();  
  23.       //System.out.println("mailAddress.toString():" + mailAddress.toString());  
  24.       for (String strTemp : hosts) {  
  25.       if (mailAddress.toString().toLowerCase().indexOf(strTemp) != -1) {  
  26.       //System.out.println(mailAddress.toString().toLowerCase().indexOf(strTemp));  
  27.       return mail.getRecipients();  
  28.       }  
  29.       }  
  30.       //mail.getRecipients().clear();//code1  
  31.       return null;  
  32.       }  
  33.       }  

      可发现这种做法根本就过滤不了后缀是本服务器域名的邮件, 但JAMES包下的:org\apache\james\transport\matchers很多matche是这种写法. 经过尝试, 得把code1处的注释打开才可以过滤. 
      正确的操作步骤: 
1.编写自己的Matcher, 上面一段code(把code1处的注释打开), 和Mailet. 

      Java代码  

  1.       package com.eazitour.mailet;  
  2.       import javax.mail.MessagingException;  
  3.       import org.apache.mailet.GenericMailet;  
  4.       import org.apache.mailet.Mail;  
  5.       import org.apache.mailet.MailAddress;  
  6.       public class FilterSenderMailet extends GenericMailet {  
  7.       @Override  
  8.       public void service(Mail mail) throws MessagingException {  
  9.       //      MailAddress ma = mail.getSender();     
  10.       //        System.out.println("sender:"+ma.toInternetAddress().toString());   
  11.       }  
  12.       }  
  13.       
  14.       

2. 把这两个JAVA类打包成JAR包, 放到james-2.3.2\apps\james\SAR-INF\lib目录下, 同时也要把james-2.3.2\apps\james.sar里面的james-2.3.2.jar,mail-1.4.1.jar,mailet-2.3.jar,mailet-api-2.3.jar这些包解压出来也放到这个目录下面, 不然会报找不到类的异常. 
3.修改config.xml文件, 在<mailetpackages>后面添加:<mailetpackage>com.eazitour.mailet</mailetpackage>, 在<matcherpackages>后面添加:<matcherpackage>com.eazitour.mailet</matcherpackage>, 即是刚才的那两个类的包名. 
4.修改config.xml文件, 添加过滤,在<spoolmanager>下面,<mailet match="All" class="PostmasterAlias"/>的后面添加:<mailet match="FilterSenderMatcher=@eazitour.com,@eazitour.cn"  class="FilterSenderMailet"/>, FilterSenderMatcher即为Mathcer的类的名字, FilterSenderMailet也mailet的类的名字, 它会在上面配置的包下面去找这两个类, 先通过matcher, 如果matcher返回的不是null的collection, 刚会下一步调用mailet; 如果matcher返回null, 但mail.getRecipients()不为null, 邮件会发送成功, 但不调用mailet, 所以code1处的注释要打开才不会发送. 
      OK,大功告成!





 类似资料: