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.
325 lines
8.8 KiB
325 lines
8.8 KiB
<?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['id'])) {
|
|
// 获取邮件详情
|
|
getEmailDetails($db, $_GET['id']);
|
|
} else {
|
|
// 获取邮件列表
|
|
getEmailList($db);
|
|
}
|
|
break;
|
|
case 'POST':
|
|
// 发送邮件或保存草稿
|
|
saveEmail($db);
|
|
break;
|
|
case 'PUT':
|
|
// 更新邮件(标记为已读/未读、移动文件夹等)
|
|
updateEmail($db);
|
|
break;
|
|
case 'DELETE':
|
|
// 删除邮件
|
|
deleteEmail($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 getEmailList($db) {
|
|
// 获取请求参数
|
|
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
|
|
$perPage = isset($_GET['perPage']) ? (int)$_GET['perPage'] : 10;
|
|
$folder = isset($_GET['folder']) ? $_GET['folder'] : 'inbox';
|
|
$search = isset($_GET['search']) ? $_GET['search'] : '';
|
|
$isRead = isset($_GET['isRead']) ? $_GET['isRead'] : null;
|
|
$username = isset($_GET['username']) ? $_GET['username'] : '';
|
|
|
|
// 验证必要参数
|
|
if (empty($username)) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '缺少用户名参数'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 构建查询条件
|
|
$where = "WHERE rcpt_to = (SELECT email FROM user WHERE username = ?) AND folder = ? AND is_deleted = 0";
|
|
$params = [$username, $folder];
|
|
|
|
if (!empty($search)) {
|
|
$where .= " AND (subject LIKE ? OR `from` LIKE ? OR `to` LIKE ?)";
|
|
$searchParam = "%$search%";
|
|
$params[] = $searchParam;
|
|
$params[] = $searchParam;
|
|
$params[] = $searchParam;
|
|
}
|
|
|
|
if ($isRead !== null) {
|
|
$where .= " AND is_read = ?";
|
|
$params[] = (int)$isRead;
|
|
}
|
|
|
|
// 计算偏移量
|
|
$offset = ($page - 1) * $perPage;
|
|
|
|
// 查询总数
|
|
$totalSql = "SELECT COUNT(*) as total FROM email $where";
|
|
$totalResult = $db->fetchOne($totalSql, $params);
|
|
$total = $totalResult['total'];
|
|
|
|
// 查询邮件列表
|
|
$sql = "SELECT id, `from`, `to`, subject, date, folder, is_read, is_deleted FROM email $where ORDER BY date DESC LIMIT ? OFFSET ?";
|
|
$params[] = $perPage;
|
|
$params[] = $offset;
|
|
|
|
$emails = $db->fetchAll($sql, $params);
|
|
|
|
// 返回响应
|
|
echo json_encode([
|
|
'success' => true,
|
|
'data' => [
|
|
'emails' => $emails,
|
|
'total' => $total,
|
|
'page' => $page,
|
|
'perPage' => $perPage,
|
|
'totalPages' => ceil($total / $perPage)
|
|
]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 获取邮件详情
|
|
* @param Database $db 数据库实例
|
|
* @param string $id 邮件ID
|
|
*/
|
|
function getEmailDetails($db, $id) {
|
|
// 获取请求参数
|
|
$username = isset($_GET['username']) ? $_GET['username'] : '';
|
|
|
|
// 验证必要参数
|
|
if (empty($username)) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '缺少用户名参数'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 查询邮件详情
|
|
$sql = "SELECT * FROM email WHERE id = ? AND rcpt_to = (SELECT email FROM user WHERE username = ?)";
|
|
$email = $db->fetchOne($sql, [$id, $username]);
|
|
|
|
if ($email) {
|
|
// 标记为已读
|
|
if (!$email['is_read']) {
|
|
$db->execute("UPDATE email SET is_read = 1 WHERE id = ?", [$id]);
|
|
$email['is_read'] = 1;
|
|
}
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'data' => [
|
|
'email' => $email
|
|
]
|
|
]);
|
|
} else {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '邮件不存在或无权访问'
|
|
]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 发送邮件或保存草稿
|
|
* @param Database $db 数据库实例
|
|
*/
|
|
function saveEmail($db) {
|
|
// 获取请求数据
|
|
$data = json_decode(file_get_contents('php://input'), true);
|
|
|
|
// 验证请求数据
|
|
if (!$data || empty($data['username']) || empty($data['to']) || empty($data['subject'])) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '缺少必要参数'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 获取用户邮箱
|
|
$user = $db->fetchOne("SELECT email FROM user WHERE username = ?", [$data['username']]);
|
|
if (!$user) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '用户不存在'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 构建邮件数据
|
|
$emailData = [
|
|
'id' => uniqid(),
|
|
'from' => $user['email'],
|
|
'to' => $data['to'],
|
|
'subject' => $data['subject'],
|
|
'date' => date('Y-m-d H:i:s'),
|
|
'content' => isset($data['content']) ? $data['content'] : '',
|
|
'folder' => isset($data['isDraft']) && $data['isDraft'] ? 'draft' : 'sent',
|
|
'is_read' => 1, // 已发送的邮件自动标记为已读
|
|
'is_deleted' => 0,
|
|
'created_at' => date('Y-m-d H:i:s')
|
|
];
|
|
|
|
// 保存邮件到email表
|
|
$sql = "INSERT INTO email (id, `from`, `to`, subject, date, data, folder, is_read, is_deleted, created_at, mail_from, rcpt_to) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
|
|
|
$db->insert($sql, [
|
|
$emailData['id'],
|
|
$emailData['from'],
|
|
$emailData['to'],
|
|
$emailData['subject'],
|
|
$emailData['date'],
|
|
$emailData['content'],
|
|
$emailData['folder'],
|
|
$emailData['is_read'],
|
|
$emailData['is_deleted'],
|
|
$emailData['created_at'],
|
|
$emailData['from'],
|
|
$emailData['to']
|
|
]);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => isset($data['isDraft']) && $data['isDraft'] ? '草稿保存成功' : '邮件发送成功',
|
|
'data' => [
|
|
'emailId' => $emailData['id']
|
|
]
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 更新邮件(标记为已读/未读、移动文件夹等)
|
|
* @param Database $db 数据库实例
|
|
*/
|
|
function updateEmail($db) {
|
|
// 获取请求数据
|
|
$data = json_decode(file_get_contents('php://input'), true);
|
|
|
|
// 验证请求数据
|
|
if (!$data || empty($data['id']) || empty($data['username'])) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '缺少必要参数'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 构建更新字段
|
|
$updateFields = [];
|
|
$params = [];
|
|
|
|
if (isset($data['isRead'])) {
|
|
$updateFields[] = "is_read = ?";
|
|
$params[] = (int)$data['isRead'];
|
|
}
|
|
|
|
if (isset($data['folder'])) {
|
|
$updateFields[] = "folder = ?";
|
|
$params[] = $data['folder'];
|
|
}
|
|
|
|
if (empty($updateFields)) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '没有需要更新的字段'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 添加邮件ID和用户名参数
|
|
$params[] = $data['id'];
|
|
$params[] = $data['username'];
|
|
|
|
// 更新邮件
|
|
$sql = "UPDATE email SET " . implode(', ', $updateFields) . " WHERE id = ? AND rcpt_to = (SELECT email FROM user WHERE username = ?)";
|
|
|
|
$db->execute($sql, $params);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => '邮件更新成功'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 删除邮件
|
|
* @param Database $db 数据库实例
|
|
*/
|
|
function deleteEmail($db) {
|
|
// 获取请求参数
|
|
$id = isset($_GET['id']) ? $_GET['id'] : '';
|
|
$username = isset($_GET['username']) ? $_GET['username'] : '';
|
|
|
|
// 验证必要参数
|
|
if (empty($id) || empty($username)) {
|
|
echo json_encode([
|
|
'success' => false,
|
|
'message' => '缺少必要参数'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
// 软删除邮件
|
|
$sql = "UPDATE email SET is_deleted = 1, folder = 'trash' WHERE id = ? AND rcpt_to = (SELECT email FROM user WHERE username = ?)";
|
|
|
|
$db->execute($sql, [$id, $username]);
|
|
|
|
echo json_encode([
|
|
'success' => true,
|
|
'message' => '邮件删除成功'
|
|
]);
|
|
}
|