[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就是用户名,就是在这里添加的)
- 用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