Why?
- James-3.1.0 较于 2.3 功能更加完善,详情参见官网:
- https://github.com/apache/james-project/#apache-james-project
- 拥抱Docker,可以将数据卷挂载到Host上,还可集成ElasticSearch或Lucene(基于Guice):
- https://github.com/apache/james-project/#how-to-run-james-in-docker
What?
参见官方文档,此处不赘述:https://github.com/apache/James-project
How?
接下来将和大家一起逐步搭建一套私人James邮件服务 ^_^
Pre:
安装完: JDK,vim,wget、unzip
一、基础配置部署:
#1、下载并解压:
wget https://www.apache.org/dyn/closer.lua/james/server/james-server-app-3.1.0-app.zip
unzip james-server-app-3.1.0-app.zip
#2、进入bin目录并启动服务
cd james-server-app-3.1.0/bin/
sh run.sh
#3、添加邮箱后缀[注意:如果是在本地模拟则需在hosts中做域名映射,否则会出现意想不到的问题]
vim ../conf/domainlist.xml
3.1 autodetect、autodetectIP 值为false,不自动获取domain与IP,而使用下面设置的指定邮箱后缀
3.2 defaultDomain 值为你的邮箱后缀。如需处理多个邮箱后缀的邮件,则需加一个 <domainnames>节点,并将其他邮箱后缀添加到子节点domainname中即可:
<defaultDomain>develop.com</defaultDomain>
<domainnames>
<domainname>develop1.com</domainname>
<domainname>develop2.com</domainname>
</domainnames>
#4、项目启动一会后,出现下面内容即为启动成功:
INFO xx:xx:xx,xxx | org.apache.james.app.spring.JamesAppSpringMain | Apache James Server is successfully started in xxxxxx milliseconds.
[可能遇到的报错]:
nested exception is java.net.UnknownHostException: xxx:xxx:将xxx添加映射到/etc/hosts后重启即可.
二、使用mysql存储数据:
James默认使用JPA以文件存储相关数据,本节将介绍如何将相关数据存储到数据库中
- 将 驱动jar包添加到 conf/lib 下。(如:mysql-connector-java-5.1.7-bin.jar)
wget http://www.stonelu.com/public/mysql-connector-java-5.1.7-bin.jar -P james-server-app-3.1.0/conf/lib
- 修改 conf/james-database.properties 注释掉 默认的DERBY存储,使用mysql:
# Use derby as default
#database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver
#database.url=jdbc:derby:../var/store/derby;create=true
#database.username=app
#database.password=app
database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://www.test.com:3306/james?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf8
database.username=james#账密自行修改即可
database.password=james
# Supported adapters are:
# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE
#vendorAdapter.database=DERBY
vendorAdapter.database=MYSQL
- 修改 conf/mailetcontainer.xml:
- postmaster 修改为管理员邮箱,可以为 [email protected]
- repositoryPath 同时存在文件存储(file://)、数据库存储(db://) 的,将默认的文件存储注释掉,并释放数据库存储;对于只存在文件存储的,不进行释放。分别如下图所示:
3. RemoteAddrNotInNetwork所在节点注释掉
- 最后启动项目即可
[可能遇到的报错]:
建表报错:Index column size too large. The maximum column size is 767 bytes.
SET GLOBAL innodb_file_format = BARRACUDA;
SET GLOBAL innodb_large_prefix = ON;
执行后重启项目即可
三、启用SMTP认证:
- 修改 conf/smtpserver.xml:
第一个 helloname 节点修改为邮箱后缀[域名] ->降低发送的邮件被(收件方邮件服务器)扔到垃圾箱的几率
authRequired、verifyIdentity 设置为true能够防止此邮件服务被当做邮件中继服务,防止跨账号邮件行为,避免被域名信誉机构拉入黑名单,影响或无法正常发送邮件。
- 最后重启服务即可
四、使用SSL/TLS协议:
- 将 sunjce_provider.jar(在jre/lib/ext下有)到 lib下(注意:不是conf/lib下)
wget http://www.stonelu.com/public/sunjce_provider.jar -P james-server-app-3.1.0/lib
- 生成keystore:
keytool -genkey -alias james -keyalg RSA -keystore keystore
- 接下来演示 SMTP 使用SSL/TLS协议(POP和IMAP类比即可):
Tips:
1)配置文件:
SMTP - smtpserver.xml
POP - popserver.xml
IMAP - imapserver.xml
2)端口:
POP3 - port 110, Secure POP3 - port 995
IMAP - port 143, Secure IMAP4 - port 993
SMTP - port 25, Secure SMTP - port 465
- 最后 重启服务即可
五、验证:
- 添加两个用户:[email protected]、[email protected],密码分别为:sec123、sec456
# 添加用户的指令: AddUser <username> <password>
# windows:
james-cli.bat -h localhost -p 9999 AddUser [email protected] sec123
james-cli.bat -h localhost -p 9999 AddUser [email protected] sec456
# linux:
sh james-cli.sh -h localhost -p 9999 AddUser [email protected] sec123
sh james-cli.sh -h localhost -p 9999 AddUser [email protected] sec456
- 安装 Foxmail客户端,并添加账号
- 给外网的其他邮件服务器发送邮件
这块不太好验证,因为主流的公共邮箱(如腾讯、Gmail)均具有强大的反垃圾邮件拦截能力,给前者发送的邮件绝大部分会被退回。
可以在购买域名后,做好域名解析(包括A、MX记录),然后在服务器上搭一套James邮件服务,在服务器上验证或者在服务器与本地之间进行验证都是可以的。
这里也暴露了一个非常大的问题:邮件服务可能会收到垃圾邮件的攻击,这也是邮件服务提供商面临的一个大问题,国内外大部分服务器提供商均对25端口进行了限制,防止垃圾邮件服务泛滥。在邮件服务层面还是需要进行很多反垃圾邮件工作的,此课题已超出本文范围,在此便不进行讨论了。
Tips:
1)获取所有可用的指令及用法:
# windows:
james-cli.bat
# linux:
sh james-cli.sh2)James数据操作途径:
整体来说,有三种: xml配置文件、james-cli客户端操作、数据库操作(立即生效)
例如:
> 添加Domain有三个途径:
配置文件:
domainlist.xml
james-cli客户端:
# windows:
james-cli.bat -h localhost -p 9999 AddDomain develop3.com
# linux:
sh james-cli.sh -h localhost -p 9999 AddDomain develop3.com
数据库操作:
insert into james_domain values('develop3.com');
> 添加用户有两个途径:
james-cli客户端:
# windows:
james-cli.bat -h localhost -p 9999 AddUser [email protected] sec789
# linux:
sh james-cli.sh -h localhost -p 9999 AddUser [email protected] sec789
数据库操作:
INSERT INTO james_user VALUES('[email protected]', 'MD5', MD5('sec789'));