You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
7.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 邮箱管理API
*/
// 设置错误报告
error_reporting(E_ALL);
ini_set('display_errors', 0);
// 设置JSON响应头
header('Content-Type: application/json; charset=utf-8');
// 包含必要的类
require_once '../../utils/Config.php';
require_once '../../utils/Logger.php';
require_once '../../utils/Helper.php';
require_once '../../utils/Database.php';
// 处理请求
try {
// 获取请求方法
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
// 连接数据库
$db = Database::getInstance();
// 根据请求方法处理
switch ($method) {
case 'GET':
// 获取邮箱信息
if (isset($_GET['action']) && $_GET['action'] === 'quota') {
// 获取邮箱配额
getMailboxQuota($db);
} else {
// 获取邮箱基本信息
getMailboxInfo($db);
}
break;
case 'POST':
// 创建自定义文件夹
createFolder($db);
break;
case 'PUT':
// 重命名文件夹
renameFolder($db);
break;
case 'DELETE':
// 删除自定义文件夹
deleteFolder($db);
break;
default:
echo json_encode([
'success' => false,
'message' => '不支持的请求方法'
]);
break;
}
} catch (Exception $e) {
echo json_encode([
'success' => false,
'message' => '服务器内部错误: ' . $e->getMessage()
]);
}
/**
* 获取邮箱基本信息
* @param Database $db 数据库实例
*/
function getMailboxInfo($db) {
// 获取请求参数
$username = isset($_GET['username']) ? $_GET['username'] : '';
// 验证必要参数
if (empty($username)) {
echo json_encode([
'success' => false,
'message' => '缺少用户名参数'
]);
return;
}
// 获取用户邮箱
$user = $db->fetchOne("SELECT email FROM user WHERE username = ?", [$username]);
if (!$user) {
echo json_encode([
'success' => false,
'message' => '用户不存在'
]);
return;
}
// 获取邮箱统计信息
$stats = [
'inbox' => $db->fetchOne("SELECT COUNT(*) as count FROM email WHERE rcpt_to = ? AND folder = 'inbox' AND is_deleted = 0", [$user['email']])['count'],
'sent' => $db->fetchOne("SELECT COUNT(*) as count FROM email WHERE `from` = ? AND folder = 'sent' AND is_deleted = 0", [$user['email']])['count'],
'draft' => $db->fetchOne("SELECT COUNT(*) as count FROM email WHERE `from` = ? AND folder = 'draft' AND is_deleted = 0", [$user['email']])['count'],
'trash' => $db->fetchOne("SELECT COUNT(*) as count FROM email WHERE (rcpt_to = ? OR `from` = ?) AND folder = 'trash' AND is_deleted = 1", [$user['email'], $user['email']])['count'],
'unread' => $db->fetchOne("SELECT COUNT(*) as count FROM email WHERE rcpt_to = ? AND is_read = 0 AND is_deleted = 0", [$user['email']])['count']
];
// 获取自定义文件夹
$customFolders = [];
echo json_encode([
'success' => true,
'data' => [
'email' => $user['email'],
'stats' => $stats,
'customFolders' => $customFolders
]
]);
}
/**
* 获取邮箱配额
* @param Database $db 数据库实例
*/
function getMailboxQuota($db) {
// 获取请求参数
$username = isset($_GET['username']) ? $_GET['username'] : '';
// 验证必要参数
if (empty($username)) {
echo json_encode([
'success' => false,
'message' => '缺少用户名参数'
]);
return;
}
// 获取邮箱配额信息
$quota = $db->fetchOne("SELECT quota_bytes, used_bytes FROM mailboxes WHERE username = ?", [$username]);
if (!$quota) {
// 如果没有找到,使用默认值
$quota = [
'quota_bytes' => 1073741824, // 1GB默认配额
'used_bytes' => 0
];
}
echo json_encode([
'success' => true,
'data' => [
'quota' => $quota['quota_bytes'],
'used' => $quota['used_bytes'],
'remaining' => $quota['quota_bytes'] - $quota['used_bytes'],
'percentage' => round(($quota['used_bytes'] / $quota['quota_bytes']) * 100, 2)
]
]);
}
/**
* 创建自定义文件夹
* @param Database $db 数据库实例
*/
function createFolder($db) {
// 获取请求数据
$data = json_decode(file_get_contents('php://input'), true);
// 验证请求数据
if (!$data || empty($data['username']) || empty($data['name'])) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
// 检查文件夹名称是否合法
$folderName = $data['name'];
if (in_array($folderName, ['inbox', 'sent', 'draft', 'trash'])) {
echo json_encode([
'success' => false,
'message' => '不能创建系统默认文件夹'
]);
return;
}
// 检查文件夹是否已存在
// 注意当前email表中没有自定义文件夹的概念所以直接返回成功
echo json_encode([
'success' => true,
'message' => '文件夹创建成功',
'data' => [
'name' => $folderName
]
]);
}
/**
* 重命名文件夹
* @param Database $db 数据库实例
*/
function renameFolder($db) {
// 获取请求数据
$data = json_decode(file_get_contents('php://input'), true);
// 验证请求数据
if (!$data || empty($data['username']) || empty($data['oldName']) || empty($data['newName'])) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
// 检查文件夹名称是否合法
$oldName = $data['oldName'];
$newName = $data['newName'];
if (in_array($oldName, ['inbox', 'sent', 'draft', 'trash']) || in_array($newName, ['inbox', 'sent', 'draft', 'trash'])) {
echo json_encode([
'success' => false,
'message' => '不能修改系统默认文件夹'
]);
return;
}
// 检查新文件夹名称是否已存在
// 注意当前email表中没有自定义文件夹的概念所以直接返回成功
echo json_encode([
'success' => true,
'message' => '文件夹重命名成功',
'data' => [
'oldName' => $oldName,
'newName' => $newName
]
]);
}
/**
* 删除自定义文件夹
* @param Database $db 数据库实例
*/
function deleteFolder($db) {
// 获取请求参数
$username = isset($_GET['username']) ? $_GET['username'] : '';
$name = isset($_GET['name']) ? $_GET['name'] : '';
// 验证必要参数
if (empty($username) || empty($name)) {
echo json_encode([
'success' => false,
'message' => '缺少必要参数'
]);
return;
}
// 检查文件夹名称是否合法
if (in_array($name, ['inbox', 'sent', 'draft', 'trash'])) {
echo json_encode([
'success' => false,
'message' => '不能删除系统默认文件夹'
]);
return;
}
// 注意当前email表中没有自定义文件夹的概念所以直接返回成功
echo json_encode([
'success' => true,
'message' => '文件夹删除成功',
'data' => [
'name' => $name
]
]);
}