# yc-email-server **Repository Path**: anchorbin/yc-email-server ## Basic Information - **Project Name**: yc-email-server - **Description**: 基于Apache James改写的企业级邮件服务器 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-04-10 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 延长邮件系统开发文档 | 版本 | 填写人 | 说明 | | :----: | :----: | :--------: | | 190311 | 曹可乐 | 文档初始化 | ## 一、开发 ### 运行项目 1. 找到程序入口: ~\yc-email-server\server\app\src\main\java\org\apache\james\app\spring\JamesAppSpringMain.java 2. 为了 防止OpenJPA会报Bean未增强的错误,在VM Options运行时添加参数: -javaagent:~\yc-email-server\server\app\src\main\resources\lib\openjpa-3.0.0.jar ### 根据功能修改/添加源码 1. 存储、删除邮件 - org.apache.james.mailbox.jpa.mail.JPAMessageMapper 2. 收到邮件的过滤器 - org.apache.james.transport.mailets.LocalDelivery 3. 发送邮件的过滤器 - org.apache.james.transport.mailets.ToSenderFolder 4. 域名列表和用户列表的存储 - server/data/data-custom ### 修改配置 配置文件存在于:~\yc-email-server\server\app\src\main\resources目录下 目录与文件说明: + lib 用于存放系统依赖的jar包 + james-database.properties 用于配置邮件数据的存储方式 ## 二、打包 在"~/yc-email-server/server"目录下进行打包,使用命令: ``` mvn package -DskipTests=true ``` 打包成功后,会在 **~\yc-email-server\server\app\target**下生成压缩包 ## 三、部署 ### 环境 | 名称 | 版本 | | :------------: | :---------------: | | Apache Jmaes | yc版本(基于3.2.0) | | Docker | 18.06.1-ce + | | Docker Compose | 1.21.2 | | Java镜像 | alpine | | MySQL | 5.6 | ### 过程 #### 创建数据库 | 数据库名称 | 字符集 | 排序规则 | 说明 | | ---------- | --------------------- | --------------- | ------------------------------------------------------------ | | email | utf8 -- UTF-8 Unicode | utf8_general_ci | 用于邮件服务器存放邮件等信息,系统默认使用JPA,启动程序会自动建表,无需额外进行建表操作 | | ycyl | utf8 -- UTF-8 Unicode | utf8_general_ci | 用于存放域名、用户信息 | #### 在ycyl数据库中建表 ```mysql CREATE TABLE `company` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email_domain` varchar(64) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '企业邮箱域名', `email_capacity` float DEFAULT NULL COMMENT 'email磁盘容量', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; ``` ```mysql CREATE TABLE `sys_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '表id', `username` varchar(45) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '用户名,不区分大小写', `password` varchar(256) CHARACTER SET utf8mb4 NOT NULL COMMENT '用户密码', `company_id` int(11) DEFAULT NULL COMMENT '用户所属公司编号', `update_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `token` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '邮箱授权码', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; ``` #### 构建James镜像 1. 将打包好的镜像**james-server-app-3.2.0-app.tar.gz**上传到服务器 ```shell scp james-server-app-3.2.0-app.tar.gz root@x.x.x.x:~/james # 解压 tar -zxvf james-server-app-3.2.0-app.tar.gz # 拷贝一份配置文件,便于对容器进行配置 cp -rf james-server-app-3.2.0/conf/ ~/james/ ``` 2. 编写Dockerfile ```dockerfile FROM java:alpine MAINTAINER ccoke WORKDIR /usr/bin/james-server ADD james-server-app-3.2.0 /usr/bin/james-server # 申明端口号 EXPOSE 25 EXPOSE 143 EXPOSE 110 EXPOSE 993 EXPOSE 465 ## 启动时执行命令 CMD ["sh", "/usr/bin/james-server/bin/run.sh"] ``` #### 编写docker-compose.yml文件 ```dockerfile version: '3' services: mysql: image: "mysql:5.6" container_name: mysql volumes: - ./mysql/data:/var/lib/mysql - ./mysql/config:/etc/mysql - ./mysql/logs:/var/log/mysql - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime ports: - "3306:3306" james: build: ./james/ container_name: james volumes: - ./james/conf:/usr/bin/james-server/conf - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime ports: - "25:25" - "143:143" - "110:110" - "993:993" - "465:465" depends_on: - mysql ``` #### 配置 所有的配置文件在 ~james/conf目录下,只要在容器外部修改配置即可,配置文件将会被映射到Docker容器中。常见的配置文件如下所示。 + james-database.properties - 数据库配置 ```properties # 邮件存储数据库 database.driverClassName=com.mysql.jdbc.Driver database.url=jdbc:mysql://x.x.x.x:3306/email?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&useSSL=false&serverTimezone=Asia/Shanghai database.username=root database.password=****** # 域名与用户数据库 custom.database.driverClassName=com.mysql.jdbc.Driver custom.database.url=jdbc:mysql://x.x.x.x:3306/ycyl?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&useSSL=false&serverTimezone=Asia/Shanghai custom.database.username=root custom.database.password=****** ``` + log4j.properties - 日志配置 #### 启动 在docekr-compose文件所在目录下,执行: ```shell docker-compose up -d ``` 查看日志: ```bash docker logs --tail=2000 james #--tail 为显示的行数,一定要加,否则会造成一次打印过多数据 ``` 容器管理: ```bash docker exec -it james /bin/sh # 进入容器 ctrl + c # 退出容器 ``` ## 四、使用 无论是Webmail或第三方邮件客户端,都只需要配置好服务器和用户即可。 | 参数名 | 值 | 端口号 | | ----------------------- | :------: | :-----: | | 用户名 | a@a.test | - | | 密码 | 123456 | - | | 收件服务器(IMAP/POP3) | x.x.x.x | 143/110 | | 发件服务器(SMTP) | x.x.x.x | 25 |