gaobo543013306

[Java][Mail]用JAMES实现自己的邮件服务器

停掉系统默认的25端口程序,不然会出问题

关闭它 # /etc/init.d/postfix stop

永久关闭它:#  chkconfig --level 2345 postfix off

 

到官网下载安装包和jdk

 james-binary-2.3.1.tar.gz  linux版

 james-binary-2.3.1.ZIP   win版

安装JDK ,解压后。运行一次项目 .路径千万不要有中文  james-2.3.2.1\bin\run.sh or run.bat。启动后关闭(报错先不管)

./home/james/bin/run.sh  
我的james是放置在home目录下的。如果出现权限不足的问题,可以输入chmod 777 james来更改权限。

配置:

james-2.3.2.1\bin\SAR-INF\config.xml

 

以下必须做:

①  、查找替换所有的 localhost为域名 \查找所有myMailServer,替换为域名。

②  、查找所有autodetect属性,修改为false。autodetectIP也设为false。

1,找到以下这段代码并注释掉

<!--<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor">

   <processor> relay-denied </processor>

   <notice>550 - Requested action not taken: relaying denied</notice>

</mailet> -->


2,找到以下这段代码并注释掉,如果这段不注释的话,就可能会发生只能在内部收发邮件及发送到外网的邮箱中,如163,qq之类的。但不能收到由这些外网邮箱发给你的邮件。这个需要注意

  <!-- <mailet match="InSpammerBlacklist=dnsbl.njabl.org." class="ToProcessor">
           <processor> spam </processor>
           <notice>550 Requested action not taken: rejected - see http://njabl.org/ </notice>
         </mailet>   -->


James 收/发外网邮件的配置

1)配置邮件服务器域名或IP;

在发送邮件时肯定要有个域名,如:4545@163.com;@符号后面的就是邮件服务器的域名;当然也有这种域名:

1212@36.52.12.36.com;域名用IP表示;但无论怎样.这个域名都指向了一台机器,就是邮件服务器;也就是安装了JAMES的这台机器。

 

找到<servernames />项;配置如下:

  <servernames autodetect="false" autodetectIP="false">         <servername>ywymsy.cn</servername>

</servernames>

2)DNS配置;这一步至关重要,稍不注意就无法和外网联系;找到<dnsserver />项配置如下

<dnsserver>

  <servers>

<server>61.139.2.69</server>

<server>ywymsy.cn</server>

  </servers>

  <autodiscover>false</autodiscover> <!--自动发现-->

  <authoritative>false</authoritative>

  <maxcachesize>50000</maxcachesize>

</dnsserver>

上面一个是本地DNS的IP,下面一个就是邮件服务器;DNS可以配置多个

DNS一定是当地的DNS ,我们租用的腾讯云是上海的服务器,我配置了个四川的DNS结果就发送不出去,检查logs发现dnsserver日志有如下段,后百度个上海的DNS换上去就好了,如果发生不出去,可以查看该日志排查下。如果DNS没做域名解析,需要配置邮件服务器哦的域名到邮件服务器的hosts 文件才能发送外网邮件。

13/01/18 00:31:51 INFO  dnsserver: DNS Server is: 61.139.2.69
13/01/18 00:31:51 INFO  dnsserver: DNS Server is: ywymsy.cn
13/01/18 00:32:14 WARN  dnsserver: Query error!
java.net.SocketTimeoutException
 at org.xbill.DNS.Client.blockUntil(Client.java:43)
 at org.xbill.DNS.UDPClient.recv(UDPClient.java:43)
 at org.xbill.DNS.UDPClient.sendrecv(UDPClient.java:70)
 at org.xbill.DNS.SimpleResolver.send(SimpleResolver.java:256)
 at org.xbill.DNS.ExtendedResolver$Resolution.start(ExtendedResolver.java:93)
 at org.xbill.DNS.ExtendedResolver.send(ExtendedResolver.java:359)
 at org.apache.james.dnsserver.DNSServer.rawDNSLookup(DNSServer.java:337)
 at org.apache.james.dnsserver.DNSServer.lookup(DNSServer.java:291)
 at org.apache.james.dnsserver.DNSServer.findMXRecordsRaw(DNSServer.java:202)
 at org.apache.james.dnsserver.DNSServer.findMXRecords(DNSServer.java:237)
 at org.apache.james.dnsserver.DNSServer$1.<init>(DNSServer.java:427)
 at org.apache.james.dnsserver.DNSServer.getSMTPHostAddresses(DNSServer.java:426)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.apache.avalon.phoenix.components.application.BlockInvocationHandler.invoke(BlockInvocationHandler.java:134)
 at com.sun.proxy.$Proxy0.getSMTPHostAddresses(Unknown Source)
 at org.apache.james.James.getSMTPHostAddresses(James.java:860)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.apache.avalon.phoenix.components.application.BlockInvocationHandler.invoke(BlockInvocationHandler.java:134)
 at com.sun.proxy.$Proxy11.getSMTPHostAddresses(Unknown Source)
 at org.apache.james.transport.mailets.RemoteDelivery.deliver(RemoteDelivery.java:452)
 at org.apache.james.transport.mailets.RemoteDelivery.run(RemoteDelivery.java:1139)
 at java.lang.Thread.run(Thread.java:748)
13/01/18 00:32:14 INFO  dnsserver: Couldn\'t resolve MX records for domain qq.com.
13/01/18 00:32:34 WARN  dnsserver: Query error!

 

3)SMTP,POP3等..设置;

a:找到:<authorizedAddresses>127.0.0.0/8</authorizedAddresses>

将它改成:

<authorizedAddresses>192.168.1.0/24, 127.0.0.0/8</authorizedAddresses>

这里设置后,只要在这个配置范围内的IP发送或接收的邮件就不会被过滤;里面的数值根据本地的网络来设置,如:

我这里的是192.168.0.0/24, 127.0.0.0/8;有可能有的是这样:192.168.1.0/24, 127.0.0.0/8

b:找到<smtpserver />;将< authRequired />解除注释,用来开启验证的。

<authRequired>true</authRequired>

 

c:找到<remotemanager />,更改你的管理员密码,默认的管理员用户名是root.更改为你想设置的密:

<remotemanager enabled="true">

  <port>4555</port>

  <handler>

     <helloName >ywymsy.cn </helloName>

     <administrator_accounts>

        <account login="root" password=""/>

     </administrator_accounts>

     <connectiontimeout> 60000 </connectiontimeout>

  </handler>

</remotemanager>

 

数据存储到数据库

默认情况下,James的用户信息存储在文本中,虽然加了密,但由于文本存档不足,不便于查询及相应处理。这里数据库采用MySQL。

二、用户信息的数据存储

配置方法如下:
第一步:在MySQL中新建一个数据库mail,用户名root,密码也为root;
第二步:数据库驱动包放到james-2.3.1/lib目录下。没有这一步在你启动james服务器时会滚屏出现许多错误提示,首行是java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver说明了没有发现MySQl的数据库驱动。

第三步:找到<data-sources>项,默认内容为空,在注释掉的代码中应该可以找到如下代码,如果找不到就手动写上:
<data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource">
         <driver>com.mysql.jdbc.Driver</driver>
         <dburl>jdbc:mysql://127.0.0.1/mail?autoReconnect=true</dburl>
         <user>username</user>
         <password>password</password>
         <max>20</max>
</data-source>
<driver>是指MySQL的JDBC驱动,<dburl>指数据库的访问路径,IP后的mail即MySQL中新建数据库名,也可以自己取名字,和数据库保持一致,接下来是用户名、密码及最大连接数。
第四步:
找到<inboxRepository>将其注释掉,默认如下:
<inboxRepository>
<repository destinationURL="file://var/mail/inboxes/" type="MAIL"/>
</inboxRepository>
再在它下面就可以找到以下代码,将其注释去掉若找不到手动将上面代码修改如下(修改的话默认代码就不用加注释了):
<inboxRepository>
   <repository destinationURL="db://maild/nbox/" type="MAIL"/>
</inboxRepository>
第六步:

注释: <!-- <inboxRepository>

         <repository destinationURL="file://var/mail/inboxes/" type="MAIL"/>

      </inboxRepository> -->

       <!--   <repositoryPath> file://var/mail/error/</repositoryPath> -->

  <!-- <outgoing> file://var/mail/outgoing/ </outgoing>  -->

<!--    <repositoryPath>file://var/mail/spam/</repositoryPath> -->

  <!-- <repositoryPath> file://var/mail/address-error/</repositoryPath> -->

<!--    <repositoryPath>file://var/mail/relay-denied/</repositoryPath> -->

  <!-- <spoolrepository destinationURL="file://var/mail/spool/" type="SPOOL"/> -->

<!--     <repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository">

         <destination URL="file://var/users/"/>

      </repository>  -->

 

开启<inboxRepository>

         <repository destinationURL="db://maildb/inbox/" type="MAIL"/>

      </inboxRepository>

<repositoryPath> db://maildb/deadletter/error </repositoryPath>

            <outgoing> db://maildb/spool/outgoing </outgoing>

  <repositoryPath> db://maildb/deadletter/spam </repositoryPath>

<repositoryPath> db://maildb/deadletter/address-error </repositoryPath>

<repositoryPath> db://maildb/deadletter/relay-denied </repositoryPath>

<spoolrepository destinationURL="db://maildb/spool/spool" type="SPOOL"/>

<repository name="LocalUsers" class="org.apache.james.userrepository.JamesUsersJdbcRepository" destinationURL="db://maildb/users">

<!--<sqlFile>是指明了在db中的数据表结构及相关数据库信息。 -->

         <sqlFile>file://conf/sqlResources.xml</sqlFile>

      </repository>

至 此,数据库配置完成,启动James,若正常无误,请通过telnet添加一个新用户,比如adduser holen 123456,然后检查MySQL中的mail数据库,下面将产生三个表users,inbox,spool,users里存放建立的邮件用户信息,inbox顾名思义就是各用户的收件箱里边当然是收到的各邮件信息,spool未读邮件  outgoing 发件箱   spam 垃圾邮件  .这是James根据file: //conf/sqlResources.xml的内容创建的。
通过以上配置,James的用户信息就可以保存在数据库中了。

启动run.bat 或者run.sh   不报错就ok了。

用Telnet管理用户(可以利用这个用户发送邮件,例如QQ中的208017534@qq.com其中208017534就是用户名,就是在这里添加的)

  1. 用cmd进入MS-DOS里面,输入telnet 域名 4555

2  然后输入用户名和密码 (文中有配置说明) 

3  添加用户,我们可以输入命令:

adduser admin password来添加一个的邮件用户,则其用户名为:admin,密码为:password

4 删除用户

deleteuser admin

 

以上配置好后就可以发送外网邮件和内网邮件了,如果要接收外网邮件,需要到解析域名的地方做MX域名解析,并且让其更好的支持SMTP/POP3协议,如下图

 

如果还是不能发送外网邮件,就自己测试一下网络的25端口能通不,我就是折腾了好久才发现25端口出不去,后发现腾讯云关闭了,不过可以找客服申请打开

 

 

 

smtp 协议发送邮件:

telnet smtp.163.com 25

ehlo smtp   或者   helo smtp
auth login
eGlhb3l1(加密后的用户名xiaoyu)
eGlhb3l1(加密后的密码xiaoyu)
mail from:<76126128@qq.com>
rcpt to:<543013306@qq.com>
data

Content-Type: text/plain;charset=UTF-8  (设置编码格式)
From:76126128@qq.com
To:543013306qq.com
Subject:test
 回车符
test
 回车符
.(最后这个小数点一定要加上,标识结束)


状态码说明:
220 : 服务就绪
250 :请求邮件动作正确,完成(HELO,MAIL FROM,RCPT TO,QUIT 指令执行成功会返回此信息)
235 :认证通过
221 :正在处理
354 :开始发送数据,结束以 .(DATA指令执行成功会返回此信息)
500 :语法错误,命令不能识别
550 :命令不能执行,邮箱无效
552 :中断处理:用户超出文件空间

pop3协议接收邮件:

telnet pop.qq.com 110  110为远程登录pop3服务器的端口号(此处以qq邮箱为例)

user 用户名     用户名即你的邮箱名在@之前的部分

pass 密码

list 回车,列出你邮箱中的邮件

常用查看邮件命令:

    STAT None 处理 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数

  UIDL [Msg#] 处理 返回邮件的唯一标识符,POP3会话的每个标识符都将是唯一的

  LIST [Msg#] 处理 返回邮件数量和每个邮件的大小

  RETR [Msg#] 处理 返回由参数标识的邮件的全部文本

  DELE [Msg#] 处理 服务器将由参数标识的邮件标记为删除,由quit命令执行

  RSET None 处理 服务器将重置所有标记为删除的邮件,用于撤消DELE命令

  TOP [Msg#] 处理 服务器将返回由参数标识的邮件前n行内容,n必须是正整数

  NOOP None 处理 服务器返回一个肯定的响应

 

邮件服务器无登陆发送邮件:

nslookup

set type=mx (指定需要解析的类型   解析后如果没有MX主机,会提示查找不到记录,这样的信息表示该域名是没有做邮件服务器记录)

163.com (输入收件人域名 ,回车后解析)

set type=a (查找主机记录类型,主机映射到IP地址)

163.com (输入收件人域名 ,回车后解析)

telnet mx0.163.com 25  (telnet mx解析出来的域名 或者 A记录记录解析出来的Ip)

ehlo 本机IP 或者   helo 本机IP

 mail from:<76126128@qq.com>
rcpt to:<8454051@qq.com>
data

Content-Type: text/plain;charset=UTF-8  (设置编码格式)
From:76126128@qq.com
To:8454051@qq.com
Subject:test
 回车符
test
 回车符
.(最后这个小数点一定要加上,标识结束)

 

 

 

相关链接  http://blog.csdn.net/szwangdf/article/details/25122651

http://blog.sina.cn/dpool/blog/s/blog_025270e901012zrz.html

 

发表于 2018-01-08 13:54  世事浮云  阅读(880)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: