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
mvn clean install -DskipTests -T 6

-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
keytool -genkey -alias james -keyalg RSA -keystore conf/keystore

证书密钥固定为 james72laBalle ,或者更换相关配置文件中的值为你想要的内容

启动项目,注意由于 SMTP、POP3、IMAP默认启动端口都在1024以下,所以linux需要要么以root权限启动,要么修改smtpserver.xmlimapserver.xmlpop3server.xml里的端口

配置邮箱

启动项目之后需要添加两个账号用于测试,账号格式为 account@localhost ,后面域名部分固定,除非手动添加一个domain到domainlist中

这里我是用jconsole通过jmx添加的,也可以通过相关命令行执行


邮箱客户端我使用的是win10自带的邮件软件

注意设置服务器地址,而且最好不要使用ssl

一通操作下来,向外部邮箱发送邮件和本地邮箱收发邮件应该没什么问题了。


james源码解析(一)
http://blog.inkroom.cn/2022/11/12/3588MKS.html
作者
inkbox
发布于
2022年11月12日
许可协议