@ -14,7 +14,7 @@ class SimplePop3Server
public function __construct($host = '0.0.0.0', $port = 110)
{
echo "📬 POP3服务器启动在 {$host}:{$port}\n";
echo "POP3服务器启动在 {$host}:{$port}\n";
echo "按 Ctrl+C 停止\n\n";
$this->connectDB();
@ -29,9 +29,9 @@ class SimplePop3Server
'user123'
);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "✅ 数据库连接成功\n";
echo "数据库连接成功\n";
} catch (PDOException $e) {
echo "❌ 数据库连接失败: " . $e->getMessage() . "\n";
echo "数据库连接失败: " . $e->getMessage() . "\n";
exit(1);
}
}
@ -67,13 +67,14 @@ class SimplePop3Server
break;
}
$command = strtoupper(trim($input));
echo "客户端: {$input}\n";
$input_trimmed = trim($input);
$command = strtoupper($input_trimmed);
echo "客户端: {$input_trimmed}\n";
if ($state === 'AUTH') {
// 认证阶段
if (strpos($command, 'USER ') === 0) {
$username = substr($command, 5);
$username = trim(substr($input_trimmed, 5)); // 使用原始输入,保持大小写
if ($this->userExists($username)) {
$this->currentUser = $username;
$this->send($client, "+OK User found");
@ -82,10 +83,19 @@ class SimplePop3Server
}
} elseif (strpos($command, 'PASS ') === 0) {
if ($this->currentUser) {
// 简化:这里不验证密码,直接登录成功
$this->loadUserEmails();
$this->send($client, "+OK Logged in, {$this->userEmails['count']} messages");
$state = 'TRANSACTION';
// 提取密码
$password = substr($input, 5); // 保留原始大小写
$password = trim($password);
// 验证密码
if ($this->verifyPassword($this->currentUser, $password)) {
$this->loadUserEmails();
$this->send($client, "+OK Logged in, {$this->userEmails['count']} messages");
$state = 'TRANSACTION';
} else {
$this->send($client, "-ERR Invalid password");
$this->currentUser = null; // 重置用户状态
}
} else {
$this->send($client, "-ERR USER first");
}
@ -137,11 +147,29 @@ class SimplePop3Server
private function userExists($username)
{
$stmt = $this->db->prepare("SELECT id FROM users WHERE username = ?");
$stmt = $this->db->prepare("SELECT id FROM users WHERE username = ? AND is_active = 1 ");
$stmt->execute([$username]);
return $stmt->rowCount() > 0;
}
private function verifyPassword($username, $password)
{
try {
$stmt = $this->db->prepare("SELECT password_hash FROM users WHERE username = ? AND is_active = 1");
$stmt->execute([$username]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user & & isset($user['password_hash'])) {
return password_verify($password, $user['password_hash']);
}
return false;
} catch (Exception $e) {
echo "密码验证错误: " . $e->getMessage() . "\n";
return false;
}
}
private function loadUserEmails()
{
$stmt = $this->db->prepare(