Apache James 搭建自己的邮件服务器
–>
原文 address:http://blog.csdn.net/jwdstef/article/details/39495097
中小企业是否可以免费拥有自己的邮件系统,而不是去购买腾讯,163的企业邮箱。答案是肯定的,可以,Java开源的邮件系统很多,经过筛选,调研最终我们选择用James来搭建自己的邮件系统。接下来我们来看看window7环境下如何用James来搭建邮件系统:
Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写。James 是100%基于Java的电子邮件服务器。它是一种独立的邮件服务器,并提供了一个完整的电子邮件解决方案,用来收、发电子邮件。
前期准备
1.Jdk1.6 需要配置Java环境变量,这个就不在这里详细介绍如何配置了。
2.James运行文件,下载地址http://james.apache.org/download.cgi
下载完成后直接解压,解压后找到D:\X-EI\apache-james-2.3.2\james-2.3.2\bin目录下的run.bat文件,就可以启动james邮件服务器了。
ps:如果James用到的端口被占用,可能启动的时候会报错,然后一闪而过,这个时候我们可以去修改James的POP3,SMTP,NNTP协议的端口,他们三个默认的端口为110,25,119.这三个协议我们可能见的比较多,但是你是否了解他们都代表什么意思呢,既然我们提到了这三个协议,那么我们就来看看这三个协议代表什么意思。
-
POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,由RFC
1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。 - SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
- NNTP(Network News Transport Protocol),中文释义:(RFC-977)网络新闻传输协议。这是一个主要用于阅读和张贴新闻文章(俗称为“帖子”,比较正式的是“新闻组邮件”)到Usenet上的Internet应用协议,也负责新闻在服务器间的传送。NNTP用于向Internet上NNTP服务器或NNTP客户(新闻阅读器)发布网络新闻邮件的协议,提供通过Internet使用可靠的基于流的新闻传输,提供新闻的分发、查询、检索和投递。NNTP还专门设计用于将新闻文章保存在中心数据库的服务器上,这样用户可以选择要阅读的特定条目,还提供过期新闻的索引、交叉引用和终止。
归纳下就是pop3是收邮件的协议,smtp是发邮件的协议,nntp是新闻协议。
如何修改James这几个协议的端口
找到目录D:\X-EI\apache-james-2.3.2\james-2.3.2\apps\james\SAR-INF底下的config.xml文件,用editplus或者其他编辑器打开文件,ctrl+f搜索pop3
[html]
view plain
copy
- <pop3server enabled=“true”>
- <!– POP3协议端口 –>
- <port>1130</port>
- <handler>
- <helloName autodetect=“false”>jwdstef.com</helloName>
- <connectiontimeout>120000</connectiontimeout>
- </handler>
- </pop3server>
我这里把原来的110端口修改成1130端口了,其他的两个端口修改也一样。
[html]
view plain
copy
- <smtpserver enabled=“true”>
- <!– SMTP协议端口 –>
- <port>25</port>
- <handler>
- <helloName autodetect=“false”>jwdstef.com</helloName>
- <connectiontimeout>360000</connectiontimeout>
- <authRequired>true</authRequired>
- <authorizedAddresses>192.168.0.0/255.255.255.0,127.0.0.0/8</authorizedAddresses>
- <maxmessagesize>0</maxmessagesize>
- </handler>
- </smtpserver>
[html]
view plain
copy
- <nntpserver enabled=“true”>
- <!– NNTP协议端口 –>
- <port>119</port>
- <handler>
- <helloName autodetect=“false”>jwdstef.com</helloName>
- <connectiontimeout>120000</connectiontimeout>
- <authRequired>false</authRequired>
- </handler>
- </nntpserver>
我们修改完这个几个端口后,就可以顺利启动James服务了。
配置服务
默认配置启动James服务,只能给内网发送邮件,我们的要求是可以给外网的其他邮箱发邮件,比如163,qq,sina等邮箱发送邮件,那么我们必须修改James默认配置,接下来我们就来看看如何修改
在D:\X-EI\apache-james-2.3.2\james-2.3.2\apps\james\SAR-INF下打开config.xml文件,找到
[html]
view plain
copy
- <postmaster>[email protected]</postmaster>
- <servernames autodetect=“true” autodetectIP=“true”>
- <servername>localhost</servername>
- </servernames>
修改localhost为你自己的域名,假如我们的域名是jwdstef.com,那么修改完成为:
[html]
view plain
copy
- <postmaster>[email protected]</postmaster>
- <servernames <span style=“color:#cc0000;”>autodetect=“false” autodetectIP=“false”</span>>
- <servername>jwdstef.com</servername>
- </servernames>
修改dns服务,打开cmd,执行ipconfig /all 找到自己的DNS服务
[html]
view plain
copy
- <servers>
- <!–Enter ip address of your DNS server, one IP address per server –>
- <!– element. –>
- <server>mail.126.com</server>
- <server>smtp.163.com</server>
- <server>202.106.195.68</server>
- <server>192.168.1.98</server>
- <server>jwdstef.com</server>
- </servers>
- <autodiscover>false</autodiscover>
- <authoritative>false</authoritative>
找到
[html]
view plain
copy
- <mailet match=“RemoteAddrNotInNetwork=127.0.0.1” class=“ToProcessor”>
- <processor> relay-denied </processor>
- <notice>550 – Requested action not taken: relaying denied</notice>
- </mailet>
将其注释掉。并且开启SMTP Server 身份验证,打开
[html]
view plain
copy
- <span style=“font-family:Microsoft YaHei;”><authRequired>true</authRequired></span>
打开后邮箱访问需要帐号验证,这样保证邮箱的安全性。
James 邮件用户的用户信息默认保存在apps\james\var\users 目录下,通过修改配置文件apps\james\SAR-INF\config.xml,可以把用户信息保存到数据库中,
配置方法如下
找到
[html]
view plain
copy
- <users-store>
- <repository name=“LocalUsers” class=“org.apache.james.userrepository.UsersFileRepository”>
- <destination URL=“file://var/users/”/>
- </repository>
改为
[html]
view plain
copy
- <users-store>
- <repository name=“LocalUsers” class=“org.apache.james.userrepository.JamesUsersJdbcRepository” destinationURL=“db://intouch/users”>
- <sqlFile>file://conf/sqlResources.xml</sqlFile>
- </repository>
- </users-store>
[html]
view plain
copy
- 通过修改用户的存储介质从file变成了db,db://intouch/users 中intouch是数据库的名字,users是邮件系统存储用户的表名
然后我们需要让邮件信息也保存在数据库,邮件信息的保存需要修改
[html]
view plain
copy
- 找到<inboxrepository>项, 默认是<repository destinationurl=“file://var/mail/inboxes/” type=“mail”>
- 屏蔽掉,在它下面有个例子<repository destinationurl=“db://maildb/inbox/” type=“mail”>,**它.
- 然后是spool,找到<spoolrepository>将默认屏蔽掉.
- **<repository destinationurl=“db://maildb/spool/spool” type=“spool”/>
- 这时候数据库中会自动建两个表:spool和inbox;spool是临时表,只要通过邮件服务器的邮件,不管是发,收,都会存到这个表里。存入的时候邮件有个状态:message_state,状态的值有几种,transe..span,root等第一个表示正在传,当传完后邮件服务器会自动删除这条邮件(此功能可配置,后面有介绍,通过改删除邮件的SQL可屏蔽此功能);当接收一个邮件时,也是先放在spool表里。然后往inbox表里转存;
我这里使用的数据库是Mysql,首先我在mysql里面创建好数据库intouch,找到<data-source>
[html]
view plain
copy
- <data-source name=“intouch” class=“org.apache.james.util.dbcp.JdbcDataSource”>
- <driver>com.mysql.jdbc.Driver</driver>
- <dburl>jdbc:mysql://localhost/intouch?autoReconnect=true</dburl>
- <user>root</user>
- <password>123</password>
- <max>20</max>
- </data-source>
配置好数据库连接。然后将对应数据库的jar包放到D:\X-EI\apache-james-2.3.2\james-2.3.2\lib下
这样James的数据库连接就配置好了,启动James服务,我们会看到mysql数据库intouch库里面多了一个users表。
我们还需要配置一个地方,修改c:/windows/system32/drivers/etc/hosts 文件,增加一个地址映射。
[html]
view plain
copy
- 127.0.0.1 jwdstef.com
以上配置完成后,James邮箱所有配置完成。
接下来我们需要登录邮件服务器,去增加用户,发送邮件,接收邮件。
执行CMD,打开命令窗口,执行命令telnet jwdstef.com 4555,
[html]
view plain
copy
- JAMES Remote Administration Tool 2.3.1
- Please enter your login and password
- Login id:
- root
- Password:
- root
- Welcome root.HELP for a list of commands
这里的4555端口是默认的,为了安全,我们最好修改下这个端口,还有登录的用户名和密码,最好也修改了。修改的位置
[html]
view plain
copy
- <remotemanager enabled=“true”>
- <!–服务连接端口–>
- <port>4555</port>
- <handler>
- <helloName autodetect=“false”>jwdstef.com</helloName>
- <administrator_accounts>
- <!–服务连接管理员帐号密码–>
- <account login=“root” password=“root”/>
- </administrator_accounts>
- <connectiontimeout> 60000 </connectiontimeout>
登录成功后,我们可以添加用户,命令如下:
adduser 帐号 密码
完成配置后,我们增加了用户,但是如何收发邮件呢,通过命令去收发邮件肯定不可能,所以我们需要一个webmail来收发邮件,我们可以自己搭建一个webmail客户端应用,也可以使用foxmail等邮件客户端软件。
我们先看看如何配置foxmail,使其可以连接到我们刚才搭建的邮件服务器,完成邮件的收发。
打开foxmail进入设置页面,添加账号
jwdstef这个用户是我在James服务后台通过命令 adduser jwdstef jd1增加的。配置完成后,我们就可以收发邮件了。我们来试试给163的邮箱发一封邮件
登录163邮箱
收到邮件,说明我们的邮件服务器配置成功了!
如果还不能成功发送,接收,采取如下暴力配置:
①、查找替换所有的 localhost为域名
②、查找所有autodetect属性,修改为false。autodetectIP也设为false.
③、查找所有myMailServer,替换为域名。
附件大小配置
整合了mysql,james 对附件大小的限制是使用mysql对行记录的限制来实现的。mysql在默认配置配置情况下默认是1M
修改mysql所在安装目录的my.ini 增加max-allowed-packet=64M(附件大小)
收附件的时候,会遇到收不到超过10m附件的情况,一个是前面说的mysql字段大小限制,还有一个会有jvm虚拟内存的限制,因为默认16m的虚拟内存是不够的,要在james中修改。这里有两种修改方法:
1)在run.bat中加入set JAVA_OPTS=“-Xms32m -Xmx512m -Xss512m” 并启动
2)在conf/wrapper.conf修改并通过服务启动
wrapper.java.initmemory=64
wrapper.java.maxmemory=512
如果想正常收发邮件,请确保好helo或ehlo名,并对自己的mx地址做好dns反向解析,就可以基本保证全网收发.
James用户密码的加密方式
james 用户密码所用的加密方式是sha加密
[java]
view plain
copy
- /**
- * 可以用于 md5 或者 sha 加密
- *
- * @param pass
- * 要加密的明文
- * @param algorithm
- * 加密方式 (md5或 sha)
- * @return
- * @throws NoSuchAlgorithmException
- */
- public static String digestString(String pass, String algorithm)
- throws NoSuchAlgorithmException {
- MessageDigest md;
- ByteArrayOutputStream bos;
- try {
- md = MessageDigest.getInstance(algorithm);
- byte[] digest = md.digest(pass.getBytes(“iso-8859-1”));
- bos = new ByteArrayOutputStream();
- OutputStream encodedStream = MimeUtility.encode(bos, “base64”);
- encodedStream.write(digest);
- return bos.toString(“iso-8859-1”);
- } catch (IOException ioe) {
- throw new RuntimeException(“Fatal error: “ + ioe);
- } catch (MessagingException me) {
- throw new RuntimeException(“Fatal error: “ + me);
- }
- }
webmail配置
下来我们看看,如何搭建自己的邮件web端应用,经过调研筛选,这里我选择了Java开源的claros intouch2作为web端。
下载claros intouch2,地址:http://www.claros.org/web/showProduct.do-id=1.html
下载完成后我们把war包部署到tomcat6底下,启动tomcat,关于tomcat的安装和配置,这里我就不介绍了,大家自己去g.cn。
需要修改D:\Program Files\apache-tomcat-6.0.28\apache-tomcat-6.0.28\webapps\intouch2\WEB-INF\config目录下的config.xml文件
[html]
view plain
copy
- <?xml version=“1.0” encoding=“UTF-8”?>
- <claros-config>
- <!– COMMON PARAMETERS –>
- <common-params>
- <charset>utf-8</charset>
- <!– the timezone is not functional at 2.0 –>
- <server-timezone>Europe/Istanbul</server-timezone>
- <!– this directory must be writable (e.g. run a chmod 777 on it) –>
- <tmp-dir>/tmp</tmp-dir>
- <!– th e following two is in MB’s–>
- <max-attachment-size>5</max-attachment-size>
- <max-mail-size>10</max-mail-size>
- <title>Claros inTouch 2.1</title>
- <!– We recommend running spamassasin. –>
- <spam-check-enabled>false</spam-check-enabled>
- <!– valid values are: da, de, en, fr, it, pt_br, pl, sk, tr, vi, zh_cn_utf8 –>
- <default-lang>en</default-lang>
- <!– this is the default rss feed. users can set their own –>
- <rss-feed>http://rss.cnn.com/rss/cnn_topstories.rss</rss-feed>
- </common-params>
- <!– CHAT SERVER SETUP –>
- <!– if you have a jabber server with transports running such as
- the MSN, yahoo, icq, aol transports the following transport
- domains must be set. If you don’t have your own jabber server
- or not running transports omit the following settings.
- —>
- <chat>
- <default-domain>claros.org</default-domain>
- <msn-transport>msn.claros.org</msn-transport>
- <yahoo-transport>yahoo.claros.org</yahoo-transport>
- <icq-transport>icq.claros.org</icq-transport>
- <aol-transport>aol.claros.org</aol-transport>
- </chat>
- <!– MAIL SERVER SETUP –>
- <servers>
- <server>
- <!– give any name you desire –>
- <shortname>jwdstef.com</shortname>
- <!– your imap/pop3 server ip/dns –>
- <fetch-server>jwdstef.com</fetch-server>
- <fetch-server-port>1130</fetch-server-port>
- <fetch-protocol>pop3</fetch-protocol>
- <fetch-ssl>false</fetch-ssl>
- <smtp-server>jwdstef.com</smtp-server>
- <smtp-server-port>25</smtp-server-port>
- <smtp-authenticated>true</smtp-authenticated>
- <smtp-ssl>false</smtp-ssl>
- <folder-namespace></folder-namespace>
- </server>
- </servers>
- <!– THE DATABASE SETUP –>
- <!–
- Please note that DB setup is essential to work. There is a intouch-mysql file in the SQL directory
- of the zip file. Please create a database and dump the sql file to the db.
- mysqladmin -u root -p create intouch
- mysql -u root -p intouch < intouch-mysql.sql
- —>
- <db-config>
- <db>
- <!– do not change the term file!!! –>
- <id>file</id>
- <!– the connection url for the JDBC connection –>
- <database>jdbc:mysql://localhost:3306/intouch</database>
- <!– the connection class –>
- <driver>com.mysql.jdbc.Driver</driver>
- <!– the user with read/write/delete/update/select permission to the database –>
- <login>root</login>
- <!– the plain text password –>
- <password>123</password>
- </db>
- </db-config>
- </claros-config>
启动后我们访问Intouch。
访问成功!这样我们的web客户端也搭建完成。
本文来源 互联网收集,文章内容系作者个人观点,不代表 本站 对观点赞同或支持。如需转载,请注明文章来源,如您发现有涉嫌抄袭侵权的内容,请联系本站核实处理。