|
|
# 邮件服务器项目
|
|
|
|
|
|
基于POP3和SMTP协议的邮件服务端实现
|
|
|
|
|
|
## 环境要求
|
|
|
|
|
|
- Docker & Docker Compose
|
|
|
- PHP 7.4+ (需要扩展: php-mysql, php-sockets)
|
|
|
- WSL2 (Windows环境)
|
|
|
- netstat
|
|
|
|
|
|
## 快速开始
|
|
|
|
|
|
### 1. 安装PHP扩展(如果未安装)
|
|
|
|
|
|
```bash
|
|
|
sudo apt update
|
|
|
sudo apt install php php-cli php-mysql php-sockets -y
|
|
|
```
|
|
|
|
|
|
### 2. 启动数据库
|
|
|
|
|
|
```bash
|
|
|
cd /mnt/d/mailserver/mailserver
|
|
|
|
|
|
# 首次启动或重置数据库
|
|
|
docker-compose down -v
|
|
|
docker-compose up -d
|
|
|
|
|
|
# 等待10-15秒让数据库初始化完成
|
|
|
sleep 15
|
|
|
```
|
|
|
|
|
|
### 3. 初始化管理功能数据库表(首次使用)
|
|
|
|
|
|
```bash
|
|
|
# 执行管理功能相关的数据库表创建
|
|
|
docker-compose exec mysql mysql -umail_user -puser123 mail_server < scripts/create_admin_tables.sql
|
|
|
```
|
|
|
|
|
|
### 4. 查看数据库(phpMyAdmin)
|
|
|
|
|
|
- 访问:http://localhost:8088
|
|
|
- 登录信息:
|
|
|
- 服务器:`mysql`(或留空)
|
|
|
- 用户名:`root`
|
|
|
- 密码:`root123`
|
|
|
|
|
|
### 5. 测试账号
|
|
|
|
|
|
- 管理员:`admin@test.com` / `123456`
|
|
|
- 普通用户:`user1@test.com` / `123456`
|
|
|
|
|
|
## 端口说明
|
|
|
|
|
|
- **25** - SMTP服务器(发送邮件)
|
|
|
- **110** - POP3服务器(接收邮件)
|
|
|
- **3308** - MySQL数据库
|
|
|
- **8080** - Web管理后台
|
|
|
- **8088** - phpMyAdmin管理界面
|
|
|
|
|
|
|
|
|
|
|
|
## Web管理后台
|
|
|
|
|
|
### 启动Web服务器
|
|
|
|
|
|
**方式1(推荐):从public目录启动**
|
|
|
```bash
|
|
|
cd /mnt/d/mailserver/mailserver/public
|
|
|
php -S localhost:8080
|
|
|
#如果打不开可以尝试换端口为8888或者别的
|
|
|
```
|
|
|
|
|
|
**方式2:从项目根目录启动**
|
|
|
```bash
|
|
|
cd /mnt/d/mailserver/mailserver
|
|
|
php -S localhost:8080 -t public
|
|
|
```
|
|
|
|
|
|
### 访问管理后台
|
|
|
|
|
|
- 访问:http://localhost:8080
|
|
|
- 登录账号:
|
|
|
- 管理员:`admin@test.com` / `123456`
|
|
|
- 普通用户:`user1@test.com` / `123456`
|
|
|
|
|
|
|
|
|
|
|
|
## 测试服务器方法
|
|
|
|
|
|
### 测试SMTP(发送邮件)
|
|
|
|
|
|
**终端1:启动SMTP服务器**
|
|
|
```bash
|
|
|
sudo php scripts/start_smtp.php
|
|
|
```
|
|
|
|
|
|
**终端2:连接测试**
|
|
|
```bash
|
|
|
telnet localhost 25
|
|
|
```
|
|
|
|
|
|
**输入命令:**
|
|
|
```
|
|
|
HELO test
|
|
|
MAIL FROM: <user1@test.com>
|
|
|
RCPT TO: <admin@test.com>
|
|
|
DATA
|
|
|
Subject: 测试邮件
|
|
|
From: user1@test.com
|
|
|
To: admin@test.com
|
|
|
|
|
|
这是一封测试邮件!
|
|
|
.
|
|
|
QUIT
|
|
|
```
|
|
|
|
|
|
### 测试POP3(接收邮件)
|
|
|
|
|
|
**终端1:启动POP3服务器**
|
|
|
```bash
|
|
|
sudo php scripts/start_pop3.php
|
|
|
```
|
|
|
|
|
|
**终端2:连接测试**
|
|
|
```bash
|
|
|
telnet localhost 110
|
|
|
```
|
|
|
|
|
|
**输入命令:**
|
|
|
```
|
|
|
USER admin@test.com
|
|
|
PASS 123456
|
|
|
STAT
|
|
|
LIST
|
|
|
RETR 1
|
|
|
QUIT
|
|
|
```
|
|
|
|
|
|
## 查看数据
|
|
|
|
|
|
### 方法1:phpMyAdmin(推荐)
|
|
|
访问 http://localhost:8088,选择 `mail_server` 数据库
|
|
|
|
|
|
### 方法2:命令行
|
|
|
```bash
|
|
|
# 查看用户
|
|
|
docker-compose exec mysql mysql -umail_user -puser123 mailserver -e "SELECT * FROM users;"
|
|
|
|
|
|
# 查看邮件
|
|
|
docker-compose exec mysql mysql -umail_user -puser123 mailserver -e "SELECT id, sender, recipient, subject, created_at FROM emails ORDER BY id DESC;"
|
|
|
```
|
|
|
|
|
|
## 重置数据库
|
|
|
|
|
|
```bash
|
|
|
docker-compose down -v
|
|
|
docker-compose up -d
|
|
|
sleep 15
|
|
|
# 重新执行初始化脚本
|
|
|
docker-compose exec mysql mysql -umail_user -puser123 mail_server < scripts/create_admin_tables.sql
|
|
|
```
|
|
|
|
|
|
## 常见问题
|
|
|
### web页面启停服务器显示端口未成功监听
|
|
|
- 确保web用户有进入目录执行开始脚本的能力,可用下面命令测试,观察输出。
|
|
|
|
|
|
```bash
|
|
|
#模拟www-data用户执行start_smtp.php脚本
|
|
|
sudo -u www-data php /home/clumxc/projects/mailserver/scripts/start_smtp.php
|
|
|
```
|
|
|
- 需要sudo权限的低端口(25、110)无法通过Web页面开启,需要先改为25252、1100等其它端口;
|
|
|
或给 /usr/bin/php 这个可执行文件贴一张“特许证”,以后不管谁运行 php,都能绑低端口,不需要 root。
|
|
|
一步一步做:
|
|
|
```bash
|
|
|
#给 PHP 贴特许证,打开终端,执行:
|
|
|
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/php
|
|
|
```
|
|
|
```bash
|
|
|
#确认贴上了
|
|
|
getcap /usr/bin/php
|
|
|
#看到输出
|
|
|
/usr/bin/php = cap_net_bind_service+ep
|
|
|
```
|
|
|
```bash
|
|
|
#重启你的 Web 服务(让新能力生效)
|
|
|
#如果你用 Apache:
|
|
|
sudo systemctl restart apache2
|
|
|
#如果你用 Nginx + PHP-FPM:
|
|
|
sudo systemctl restart php-fpm
|
|
|
```
|
|
|
### 端口被占用
|
|
|
|
|
|
**SMTP服务器启动失败(25端口)**
|
|
|
```bash
|
|
|
# 检查端口占用
|
|
|
sudo netstat -tlnp | grep 25
|
|
|
|
|
|
# 或使用
|
|
|
sudo lsof -i :25
|
|
|
```
|
|
|
|
|
|
**POP3服务器启动失败(110端口)**
|
|
|
```bash
|
|
|
sudo netstat -tlnp | grep 110
|
|
|
```
|
|
|
|
|
|
### 数据库连接失败
|
|
|
|
|
|
```bash
|
|
|
# 检查Docker容器状态
|
|
|
docker-compose ps
|
|
|
|
|
|
# 查看数据库日志
|
|
|
docker-compose logs mysql
|
|
|
|
|
|
# 重启数据库
|
|
|
docker-compose restart mysql
|
|
|
```
|
|
|
|
|
|
### telnet连接失败
|
|
|
|
|
|
```bash
|
|
|
# 安装telnet(如果未安装)
|
|
|
sudo apt install telnet
|
|
|
|
|
|
# 或使用nc替代
|
|
|
nc localhost 25
|
|
|
```
|
|
|
|
|
|
### 密码验证失败
|
|
|
|
|
|
- 确认使用正确的测试账号:`admin@test.com` / `123456`
|
|
|
- 如果重置了数据库,密码会恢复为 `123456`
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
```
|
|
|
mailserver/
|
|
|
├── scripts/ # 启动脚本和SQL
|
|
|
│ ├── start_smtp.php # 启动SMTP服务器
|
|
|
│ ├── start_pop3.php # 启动POP3服务器
|
|
|
│ ├── create_tables.sql # 数据库初始化脚本
|
|
|
│ └── create_admin_tables.sql # 管理功能数据库表
|
|
|
├── src/ # 源代码
|
|
|
│ ├── protocol/ # SMTP/POP3协议实现
|
|
|
│ │ ├── SmtpServer.php
|
|
|
│ │ └── Pop3Server.php
|
|
|
│ ├── storage/ # 数据存储层
|
|
|
│ │ ├── Database.php
|
|
|
│ │ ├── UserRepository.php
|
|
|
│ │ ├── EmailRepository.php
|
|
|
│ │ ├── SystemSettingsRepository.php
|
|
|
│ │ ├── FilterRepository.php
|
|
|
│ │ ├── ServiceRepository.php
|
|
|
│ │ └── MailboxRepository.php
|
|
|
│ ├── admin/ # 管理后台逻辑
|
|
|
│ │ └── BroadcastService.php
|
|
|
│ └── utils/ # 工具类
|
|
|
│ ├── Security.php
|
|
|
│ └── Validator.php
|
|
|
├── public/ # Web管理界面
|
|
|
│ ├── index.php # 主页面(登录+仪表盘)
|
|
|
│ ├── register.php # 用户注册
|
|
|
│ ├── logout.php # 退出登录
|
|
|
│ ├── users.php # 用户管理
|
|
|
│ ├── emails.php # 邮件管理
|
|
|
│ ├── broadcast.php # 群发邮件
|
|
|
│ ├── filters.php # 过滤规则
|
|
|
│ ├── settings.php # 系统设置
|
|
|
│ ├── services.php # 服务管理
|
|
|
│ ├── logs.php # 日志管理
|
|
|
│ └── help.php # 帮助
|
|
|
├── config/ # 配置文件
|
|
|
│ ├── database.php # 数据库配置
|
|
|
│ └── constants.php # 常量定义
|
|
|
└── docker-compose.yml # Docker配置
|
|
|
```
|
|
|
|
|
|
## 功能完成情况
|
|
|
|
|
|
### ✅ 服务器端功能(已完成)
|
|
|
|
|
|
根据课程设计说明书要求,服务器端功能已全部实现:
|
|
|
|
|
|
1. **✅ 邮箱管理**
|
|
|
- 设置用户邮箱大小限制
|
|
|
- 查看用户邮箱使用情况
|
|
|
|
|
|
2. **✅ 客户管理**
|
|
|
- 创建新客户账号和密码
|
|
|
- 设置用户权限(管理员/普通用户)
|
|
|
- 启用/禁用用户
|
|
|
- 删除客户账号
|
|
|
- 编辑用户信息
|
|
|
|
|
|
3. **✅ 服务起停**
|
|
|
- SMTP服务状态管理
|
|
|
- POP3服务状态管理
|
|
|
- 服务启动/停止控制
|
|
|
|
|
|
4. **✅ 系统设置**
|
|
|
- SMTP端口设置(默认25)
|
|
|
- POP3端口设置(默认110)
|
|
|
- 服务器域名设置(默认test.com)
|
|
|
- 管理员密码修改
|
|
|
- 邮件过滤(账号过滤)
|
|
|
- IP地址过滤
|
|
|
|
|
|
5. **✅ 日志管理**
|
|
|
- SMTP日志查看
|
|
|
- POP3日志查看
|
|
|
- 日志清除功能
|
|
|
- 日志存储位置设置
|
|
|
- 日志文件大小管理
|
|
|
|
|
|
6. **✅ 日常管理**
|
|
|
- 群发邮件功能(发送给所有用户或指定用户)
|
|
|
|
|
|
7. **✅ 帮助**
|
|
|
- 系统使用帮助文档
|