james源码解析(一)
因个人需要,在个人服务器上搭建了邮箱服务器,使用的是mailu,整体基于docker多容器搭建。
本来用起来没什么大问题,但是因为其自带nginx容器,和我原本部署的nginx容器会有一定的冲突,不是很满意
一番查找后,让我找到了james——apache开发的基于java的邮箱服务器。
james是什么
james是apache开发的基于java的邮箱服务器,支持的协议包括常见的SMTP、IMAP、POP3,还有我都没听说过的JAMP。
在本文编写时,最新版本为3.7.2
编译
首先获取项目源码,有两种途径,一是在apache官网上下载版本源码,二是在github上clone代码
我使用第二种方式。
从后续的过程来看,如果想要编译运行,似乎需要git log记录,如果不是git项目的话,不知道会不会编译失败。
下载下来之后首先切到 3.7.2 的tag上,把代码固定住,后续贴代码的时候更方便
下载下来之后可以看到项目模块非常多,而且还有scala相关代码,因此ide最好下载一个scala插件。
里面还有部分文档是以.adoc结尾,是一种类似markdown的标记型语法,建议也装一个相关插件
在根目录执行
1 | |
-T 6代表开6个线程加速编译
注意跳过测试不能使用 -Dmaven.test.skip=true,这样会导致test目录不会被编译,部分模块依赖会出错
另外maven仓库最好换成官方仓库,我用的阿里云仓库会有部分依赖没有
如果网络没有什么问题的话,编译应该很顺利。编译完成后项目5G,依赖2G,很夸张啊。
运行
如何启动项目官网也有明确的描述
james为了适应不同的环境需求,有着多种构建版本,具体可以参见https://james.apache.org/server/packaging.html
总的分成五个版本:
- distributed 依赖最多、最为复杂的分布式版本,支持多节点部署
- jpa 使用openjpa存储数据的单节点版本
- demo 没看出和jpa有什么区别
- memory 使用内存存储数据,主要用于测试
- cassandra 换了存储方式和搜索引擎
为了测试环境是否正常,建议先运行memory版本
启动类位于 server/apps/memory-app/src/main/java/org/apache/james/MemoryJamesServerMain.java
同时需要指定一个工作目录用于存储数据,可以通过启动参数 -Dworking.directory=/home/james 指定
在工作目录下创建目录 conf,将 server/apps/memory-app/sample-configuration里的文件全放进去
默认情况下,还需要生成证书。
在工作目录下执行以下命令
1 | |
证书密钥固定为 james72laBalle ,或者更换相关配置文件中的值为你想要的内容
启动项目,注意由于 SMTP、POP3、IMAP默认启动端口都在1024以下,所以linux需要要么以root权限启动,要么修改smtpserver.xml、imapserver.xml、pop3server.xml里的端口
配置邮箱
启动项目之后需要添加两个账号用于测试,账号格式为 account@localhost ,后面域名部分固定,除非手动添加一个domain到domainlist中
这里我是用jconsole通过jmx添加的,也可以通过相关命令行执行
邮箱客户端我使用的是win10自带的邮件软件
注意设置服务器地址,而且最好不要使用ssl
一通操作下来,向外部邮箱发送邮件和本地邮箱收发邮件应该没什么问题了。