中小企业是否可以免费拥有自己的邮件系统,而不是去购买腾讯,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是收邮件的协议,smtp是发邮件的协议,nntp是新闻协议。
<pop3server enabled="true"> <!-- POP3协议端口 --> <port>1130</port> <handler> <helloName autodetect="false">jwdstef.com</helloName> <connectiontimeout>120000</connectiontimeout> </handler> </pop3server>我这里把原来的110端口修改成1130端口了,其他的两个端口修改也一样。
<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>
<nntpserver enabled="true"> <!-- NNTP协议端口 --> <port>119</port> <handler> <helloName autodetect="false">jwdstef.com</helloName> <connectiontimeout>120000</connectiontimeout> <authRequired>false</authRequired> </handler> </nntpserver>
<postmaster>Postmaster@localhost</postmaster> <servernames autodetect="true" autodetectIP="true"> <servername>localhost</servername> </servernames>修改localhost为你自己的域名,假如我们的域名是jwdstef.com,那么修改完成为:
<postmaster>[email protected]</postmaster> <servernames <span style="color:#cc0000;">autodetect="false" autodetectIP="false"</span>> <servername>jwdstef.com</servername> </servernames>
<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>
<mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"> <processor> relay-denied </processor> <notice>550 - Requested action not taken: relaying denied</notice> </mailet>
<span style="font-family:Microsoft YaHei;"><authRequired>true</authRequired></span>打开后邮箱访问需要帐号验证,这样保证邮箱的安全性。
<users-store> <repository name="LocalUsers" class="org.apache.james.userrepository.UsersFileRepository"> <destination URL="file://var/users/"/> </repository>
<users-store> <repository name="LocalUsers" class="org.apache.james.userrepository.JamesUsersJdbcRepository" destinationURL="db://intouch/users"> <sqlFile>file://conf/sqlResources.xml</sqlFile> </repository> </users-store>
通过修改用户的存储介质从file变成了db,db://intouch/users 中intouch是数据库的名字,users是邮件系统存储用户的表名
找到<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表里转存;
<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下
127.0.0.1 jwdstef.com
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
<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>
完成配置后,我们增加了用户,但是如何收发邮件呢,通过命令去收发邮件肯定不可能,所以我们需要一个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 用户密码所用的加密方式是sha加密
/** * 可以用于 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); } }
下来我们看看,如何搭建自己的邮件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文件
<?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客户端也搭建完成。