删除 More/t.php.bak

This commit is contained in:
2025-10-17 23:32:12 +08:00
committed by cssfw
parent 917d269c83
commit 1f5ac5e0ca
79 changed files with 13493 additions and 0 deletions

View File

@@ -0,0 +1,211 @@
<?php
include_once "../Hv4.Function.php";
/**
* 高频日志写入解决方案(线程安全+按天分割+自动清理)
* @param string $content 日志内容
* @param string $type 日志类型INFO/WARNING/ERROR等
*/
function 日志写入($content, $type = 'INFO') {
// 配置参数(可根据需求调整)
$config = [
'log_dir' => './Log/ExpiredProductsCleaner', // 日志目录
'retain_days' => 60, // 日志保留天数改为60天清理
'file_prefix' => 'ExpiredProductsCleaner' // 日志文件前缀
];
// 生成时间相关变量
$now = new DateTime();
$currentDate = $now->format('Y-m-d');
$logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate);
// 自动创建日志目录
if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) {
error_log("无法创建日志目录: {$config['log_dir']}");
return;
}
// 构建日志内容(含毫秒时间戳)
$timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000);
$logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content);
// 高性能写入(使用资源句柄+flock避免并发冲突
try {
$handle = fopen($logFile, 'a'); // 追加模式打开
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, $logLine);
flock($handle, LOCK_UN); // 释放锁
}
fclose($handle);
} catch (Exception $e) {
error_log("日志写入失败: " . $e->getMessage());
}
// 控制台输出(可选调试)
echo $logLine;
// 智能清理(每天只执行一次清理检查)
$cleanFlagFile = $config['log_dir'] . '/.last_clean';
if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) {
$expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp();
foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) {
if (filemtime($file) < $expireDate) {
@unlink($file);
}
}
touch($cleanFlagFile); // 更新清理标记时间
}
}
$语句 = "SELECT *
FROM purchases
WHERE
expiry_time < NOW() -- 过期时间早于当前时间
AND status = 'expiring'
ORDER BY expiry_time;
";
日志写入(">>>==================================>>>","执行中");
日志写入("ExpiryReminder 任务开始","提示");
日志写入("查询中","提示");
$结果 = @数据库运行($语句);
if (!$结果) {
日志写入("无结果","提示");
die();
}
日志写入("查询结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($结果),"数据");
日志写入(">>>==================================>>>","结果");
日志写入("开始循环","提示");
foreach ($结果 as $业务元数据) {
日志写入(">>>==================================>>>","任务");
$用户ID = $业务元数据["user_id"];
$业务ID = $业务元数据["purchase_id"];
$业务状态 = $业务元数据["status"];
$业务名称 = $业务元数据["name"];
$到期时间 = $业务元数据["expiry_time"];
$产品标识 = $业务元数据["product_id"];
日志写入("提取业务ID ".$业务ID,"提示");
日志写入("提取用户ID ".$用户ID,"提示");
日志写入("提取业务状态 ".$业务状态,"提示");
$dateString = $到期时间;
// 创建目标日期对象并设置时间为0点
$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
$targetDate->setTime(0, 0, 0);
// 创建当前日期对象并设置时间为0点
$today = new DateTime();
$today->setTime(0, 0, 0);
// 计算日期差异
$interval = $today->diff($targetDate);
// 获取天数差
$剩余天数 = $interval->days;
// 处理过去或未来的情况
if ($interval->invert) {
$剩余天数 = -$剩余天数;
}
$语句 = "SELECT * FROM users WHERE id = $用户ID;";
$用户数据 = @数据库运行($语句);
$用户数据 = @reset($用户数据);
$QQ = $用户数据["qq"];
日志写入("获取邮件模板","提示");
$邮件模板 = @file_get_contents("./Res/ExpiredProductsCleaner.html");
$search = ["[到期时间]", "[业务名称]", "[业务ID]"];
$replace = [$到期时间, $业务名称, $业务ID];
$邮件模板 = str_replace($search, $replace, $邮件模板);
日志写入("正在发送邮件","提示");
$结果 = 发送邮件接口(
$QQ.'@qq.com',
'关于业务的重要通知',
$邮件模板
);
if ($结果 === 200) {
日志写入("已发送","成功");
} else {
日志写入("发送失败 " . $结果,"错误");
}
$语句 = "SELECT * FROM products WHERE product_id = '$产品标识';";
日志写入("获取产品元数据中","提示");
$产品元数据 = @reset(@数据库运行($语句));
日志写入("获取结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($产品元数据),"数据");
日志写入(">>>==================================>>>","结果");
$产品模块 = $产品元数据["module"];
$产品周期 = $产品元数据["subscription_period"];
$模块路径 = "../ProductsModule/".$产品模块."/Main.php";
日志写入("载入模块 ".$产品模块,"提示");
require_once $模块路径;
日志写入("删除业务中","提示");
$结果 = @转JSON(@删除业务($业务元数据,$产品元数据));
日志写入("结果 ".$结果,"结果");
$语句 = "UPDATE purchases
SET status = 'expired'
WHERE purchase_id = '$业务ID';
";
@数据库运行($语句);
日志写入("已更新业务状态","提示");
}
日志写入("任务结束","提示");
日志写入(">>>==================================>>>","结束");
?>

View File

@@ -0,0 +1,211 @@
<?php
include_once "../Hv4.Function.php";
/**
* 高频日志写入解决方案(线程安全+按天分割+自动清理)
* @param string $content 日志内容
* @param string $type 日志类型INFO/WARNING/ERROR等
*/
function 日志写入($content, $type = 'INFO') {
// 配置参数(可根据需求调整)
$config = [
'log_dir' => './Log/ExpiredProductsCleaner', // 日志目录
'retain_days' => 60, // 日志保留天数改为60天清理
'file_prefix' => 'ExpiredProductsCleaner' // 日志文件前缀
];
// 生成时间相关变量
$now = new DateTime();
$currentDate = $now->format('Y-m-d');
$logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate);
// 自动创建日志目录
if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) {
error_log("无法创建日志目录: {$config['log_dir']}");
return;
}
// 构建日志内容(含毫秒时间戳)
$timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000);
$logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content);
// 高性能写入(使用资源句柄+flock避免并发冲突
try {
$handle = fopen($logFile, 'a'); // 追加模式打开
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, $logLine);
flock($handle, LOCK_UN); // 释放锁
}
fclose($handle);
} catch (Exception $e) {
error_log("日志写入失败: " . $e->getMessage());
}
// 控制台输出(可选调试)
echo $logLine;
// 智能清理(每天只执行一次清理检查)
$cleanFlagFile = $config['log_dir'] . '/.last_clean';
if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) {
$expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp();
foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) {
if (filemtime($file) < $expireDate) {
@unlink($file);
}
}
touch($cleanFlagFile); // 更新清理标记时间
}
}
$语句 = "SELECT *
FROM purchases
WHERE
expiry_time < NOW() -- 过期时间早于当前时间
AND status = 'expiring'
ORDER BY expiry_time;
";
日志写入(">>>==================================>>>","执行中");
日志写入("ExpiryReminder 任务开始","提示");
日志写入("查询中","提示");
$结果 = @数据库运行($语句);
if (!$结果) {
日志写入("无结果","提示");
die();
}
日志写入("查询结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($结果),"数据");
日志写入(">>>==================================>>>","结果");
日志写入("开始循环","提示");
foreach ($结果 as $业务元数据) {
日志写入(">>>==================================>>>","任务");
$用户ID = $业务元数据["user_id"];
$业务ID = $业务元数据["purchase_id"];
$业务状态 = $业务元数据["status"];
$业务名称 = $业务元数据["name"];
$到期时间 = $业务元数据["expiry_time"];
$产品标识 = $业务元数据["product_id"];
日志写入("提取业务ID ".$业务ID,"提示");
日志写入("提取用户ID ".$用户ID,"提示");
日志写入("提取业务状态 ".$业务状态,"提示");
$dateString = $到期时间;
// 创建目标日期对象并设置时间为0点
$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
$targetDate->setTime(0, 0, 0);
// 创建当前日期对象并设置时间为0点
$today = new DateTime();
$today->setTime(0, 0, 0);
// 计算日期差异
$interval = $today->diff($targetDate);
// 获取天数差
$剩余天数 = $interval->days;
// 处理过去或未来的情况
if ($interval->invert) {
$剩余天数 = -$剩余天数;
}
$语句 = "SELECT * FROM users WHERE id = $用户ID;";
$用户数据 = @数据库运行($语句);
$用户数据 = @reset($用户数据);
$QQ = $用户数据["qq"];
日志写入("获取邮件模板","提示");
$邮件模板 = @file_get_contents("./Res/ExpiredProductsCleaner.html");
$search = ["[到期时间]", "[业务名称]", "[业务ID]"];
$replace = [$到期时间, $业务名称, $业务ID];
$邮件模板 = str_replace($search, $replace, $邮件模板);
$结果 = 发送邮件接口(
$QQ.'@qq.com',
'关于业务的重要通知',
$邮件模板
);
日志写入("正在发送邮件","提示");
if ($结果 === 200) {
日志写入("已发送","成功");
} else {
日志写入("发送失败 " . $结果,"错误");
}
$语句 = "SELECT * FROM products WHERE product_id = '$产品标识';";
日志写入("获取产品元数据中","提示");
$产品元数据 = @reset(@数据库运行($语句));
日志写入("获取结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($产品元数据),"数据");
日志写入(">>>==================================>>>","结果");
$产品模块 = $产品元数据["module"];
$产品周期 = $产品元数据["subscription_period"];
$模块路径 = "../ProductsModule/".$产品模块."/Main.php";
日志写入("载入模块 ".$产品模块,"提示");
require_once $模块路径;
日志写入("删除业务中","提示");
$结果 = @转JSON(@删除业务($业务元数据,$产品元数据));
日志写入("结果 ".$结果,"结果");
$语句 = "UPDATE purchases
SET status = 'expired'
WHERE purchase_id = '$业务ID';
";
@数据库运行($语句);
日志写入("已更新业务状态","提示");
}
日志写入("任务结束","提示");
日志写入(">>>==================================>>>","结束");
?>

View File

@@ -0,0 +1,212 @@
<?php
include_once "../Hv4.Function.php";
/**
* 高频日志写入解决方案(线程安全+按天分割+自动清理)
* @param string $content 日志内容
* @param string $type 日志类型INFO/WARNING/ERROR等
*/
function 日志写入($content, $type = 'INFO') {
// 配置参数(可根据需求调整)
$config = [
'log_dir' => './Log/ExpiryReminder', // 日志目录
'retain_days' => 60, // 日志保留天数改为60天清理
'file_prefix' => 'ExpiryReminder' // 日志文件前缀
];
// 生成时间相关变量
$now = new DateTime();
$currentDate = $now->format('Y-m-d');
$logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate);
// 自动创建日志目录
if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) {
error_log("无法创建日志目录: {$config['log_dir']}");
return;
}
// 构建日志内容(含毫秒时间戳)
$timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000);
$logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content);
// 高性能写入(使用资源句柄+flock避免并发冲突
try {
$handle = fopen($logFile, 'a'); // 追加模式打开
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, $logLine);
flock($handle, LOCK_UN); // 释放锁
}
fclose($handle);
} catch (Exception $e) {
error_log("日志写入失败: " . $e->getMessage());
}
// 控制台输出(可选调试)
echo $logLine;
// 智能清理(每天只执行一次清理检查)
$cleanFlagFile = $config['log_dir'] . '/.last_clean';
if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) {
$expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp();
foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) {
if (filemtime($file) < $expireDate) {
@unlink($file);
}
}
touch($cleanFlagFile); // 更新清理标记时间
}
}
日志写入(">>>==================================>>>","提示");
日志写入("预修复数据中","提示");
$语句 = "UPDATE purchases
SET status = 'activated'
WHERE
status = 'expiring'
AND expiry_time > CURDATE() + INTERVAL 7 DAY
";
$Q = @数据库运行($语句);
日志写入("CODE ".$Q,"提示");
日志写入(">>>==================================>>>","提示");
日志写入("删除过时数据中","提示");
$语句 = "DELETE FROM purchases
WHERE
status = 'expired'
AND expiry_time < NOW() - INTERVAL 2 DAY;";
$Q = @数据库运行($语句);
日志写入("CODE ".$Q,"提示");
日志写入(">>>==================================>>>","提示");
$语句 = "SELECT *
FROM purchases
WHERE
(
(expiry_time >= CURDATE()
AND expiry_time < CURDATE() + INTERVAL 8 DAY)
OR
expiry_time < NOW()
)
AND status != 'expired' -- 现在这个条件会全局生效
ORDER BY expiry_time
";
日志写入(">>>==================================>>>","执行中");
日志写入("ExpiryReminder 任务开始","提示");
日志写入("查询中","提示");
$结果 = @数据库运行($语句);
if (!$结果) {
日志写入("无结果","提示");
die();
}
日志写入("查询结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($结果),"数据");
日志写入(">>>==================================>>>","结果");
日志写入("开始循环","提示");
foreach ($结果 as $数据) {
日志写入(">>>==================================>>>","任务");
$用户ID = $数据["user_id"];
$业务ID = $数据["purchase_id"];
$业务状态 = $数据["status"];
$业务名称 = $数据["name"];
$到期时间 = $数据["expiry_time"];
日志写入("提取业务ID ".$业务ID,"提示");
日志写入("提取用户ID ".$用户ID,"提示");
日志写入("提取业务状态 ".$业务状态,"提示");
$dateString = $到期时间;
// 创建目标日期对象并设置时间为0点
$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
$targetDate->setTime(0, 0, 0);
// 创建当前日期对象并设置时间为0点
$today = new DateTime();
$today->setTime(0, 0, 0);
// 计算日期差异
$interval = $today->diff($targetDate);
// 获取天数差
$剩余天数 = $interval->days;
// 处理过去或未来的情况
if ($interval->invert) {
$剩余天数 = -$剩余天数;
}
$语句 = "SELECT * FROM users WHERE id = $用户ID;";
$用户数据 = @数据库运行($语句);
$用户数据 = @reset($用户数据);
$QQ = $用户数据["qq"];
if ($业务状态 != "expiring") {
$语句 = "UPDATE purchases
SET status = 'expiring'
WHERE purchase_id = '$业务ID';
";
@数据库运行($语句);
日志写入("业务状态已更新","成功");
} else {
日志写入("业务状态无需更新","成功");
}
日志写入("获取邮件模板","提示");
$邮件模板 = @file_get_contents("./Res/ExpiryReminder.html");
$search = ["[到期时间]", "[业务名称]", "[剩余天数]", "[业务ID]"];
$replace = [$到期时间, $业务名称, $剩余天数, $业务ID];
$邮件模板 = str_replace($search, $replace, $邮件模板);
日志写入("正在发送邮件","提示");
$结果 = 发送邮件接口(
$QQ.'@qq.com',
'关于业务的重要通知',
$邮件模板
);
if ($结果 === 200) {
日志写入("已发送","成功");
} else {
日志写入("发送失败 " . $结果,"错误");
}
}
日志写入("任务结束","提示");
日志写入(">>>==================================>>>","结束");
?>

View File

@@ -0,0 +1,202 @@
<?php
include_once "../Hv4.Function.php";
/**
* 高频日志写入解决方案(线程安全+按天分割+自动清理)
* @param string $content 日志内容
* @param string $type 日志类型INFO/WARNING/ERROR等
*/
function 日志写入($content, $type = 'INFO') {
// 配置参数(可根据需求调整)
$config = [
'log_dir' => './Log/ExpiryReminder', // 日志目录
'retain_days' => 60, // 日志保留天数改为60天清理
'file_prefix' => 'ExpiryReminder' // 日志文件前缀
];
// 生成时间相关变量
$now = new DateTime();
$currentDate = $now->format('Y-m-d');
$logFile = sprintf("%s/%s_%s.log", $config['log_dir'], $config['file_prefix'], $currentDate);
// 自动创建日志目录
if (!is_dir($config['log_dir']) && !mkdir($config['log_dir'], 0777, true)) {
error_log("无法创建日志目录: {$config['log_dir']}");
return;
}
// 构建日志内容(含毫秒时间戳)
$timestamp = $now->format('[Y-m-d H:i:s]') . sprintf('.%03d', (float)$now->format('u')/1000);
$logLine = sprintf("%s <%s> - %s\n", $timestamp, strtoupper($type), $content);
// 高性能写入(使用资源句柄+flock避免并发冲突
try {
$handle = fopen($logFile, 'a'); // 追加模式打开
if (flock($handle, LOCK_EX)) { // 获取独占锁
fwrite($handle, $logLine);
flock($handle, LOCK_UN); // 释放锁
}
fclose($handle);
} catch (Exception $e) {
error_log("日志写入失败: " . $e->getMessage());
}
// 控制台输出(可选调试)
echo $logLine;
// 智能清理(每天只执行一次清理检查)
$cleanFlagFile = $config['log_dir'] . '/.last_clean';
if (!file_exists($cleanFlagFile) || (time() - filemtime($cleanFlagFile)) > 86400) {
$expireDate = $now->modify("-{$config['retain_days']} days")->getTimestamp();
foreach (glob($config['log_dir'] . "/{$config['file_prefix']}_*.log") as $file) {
if (filemtime($file) < $expireDate) {
@unlink($file);
}
}
touch($cleanFlagFile); // 更新清理标记时间
}
}
日志写入(">>>==================================>>>","提示");
日志写入("预修复数据中","提示");
$语句 = "UPDATE purchases
SET status = 'activated'
WHERE
status = 'expiring'
AND expiry_time > CURDATE() + INTERVAL 7 DAY
";
$Q = @数据库运行($语句);
日志写入("CODE ".$Q,"提示");
日志写入(">>>==================================>>>","提示");
$语句 = "SELECT *
FROM purchases
WHERE
(
(expiry_time >= CURDATE()
AND expiry_time < CURDATE() + INTERVAL 8 DAY)
OR
expiry_time < NOW()
)
AND status != 'expired' -- 现在这个条件会全局生效
ORDER BY expiry_time
";
日志写入(">>>==================================>>>","执行中");
日志写入("ExpiryReminder 任务开始","提示");
日志写入("查询中","提示");
$结果 = @数据库运行($语句);
if (!$结果) {
日志写入("无结果","提示");
die();
}
日志写入("查询结果","提示");
日志写入(">>>==================================>>>","结果");
日志写入(@转JSON($结果),"数据");
日志写入(">>>==================================>>>","结果");
日志写入("开始循环","提示");
foreach ($结果 as $数据) {
日志写入(">>>==================================>>>","任务");
$用户ID = $数据["user_id"];
$业务ID = $数据["purchase_id"];
$业务状态 = $数据["status"];
$业务名称 = $数据["name"];
$到期时间 = $数据["expiry_time"];
日志写入("提取业务ID ".$业务ID,"提示");
日志写入("提取用户ID ".$用户ID,"提示");
日志写入("提取业务状态 ".$业务状态,"提示");
$dateString = $到期时间;
// 创建目标日期对象并设置时间为0点
$targetDate = DateTime::createFromFormat('Y-m-d H:i:s', $dateString);
$targetDate->setTime(0, 0, 0);
// 创建当前日期对象并设置时间为0点
$today = new DateTime();
$today->setTime(0, 0, 0);
// 计算日期差异
$interval = $today->diff($targetDate);
// 获取天数差
$剩余天数 = $interval->days;
// 处理过去或未来的情况
if ($interval->invert) {
$剩余天数 = -$剩余天数;
}
$语句 = "SELECT * FROM users WHERE id = $用户ID;";
$用户数据 = @数据库运行($语句);
$用户数据 = @reset($用户数据);
$QQ = $用户数据["qq"];
if ($业务状态 != "expiring") {
$语句 = "UPDATE purchases
SET status = 'expiring'
WHERE purchase_id = '$业务ID';
";
@数据库运行($语句);
日志写入("业务状态已更新","成功");
} else {
日志写入("业务状态无需更新","成功");
}
日志写入("获取邮件模板","提示");
$邮件模板 = @file_get_contents("./Res/ExpiryReminder.html");
$search = ["[到期时间]", "[业务名称]", "[剩余天数]", "[业务ID]"];
$replace = [$到期时间, $业务名称, $剩余天数, $业务ID];
$邮件模板 = str_replace($search, $replace, $邮件模板);
日志写入("正在发送邮件","提示");
$结果 = 发送邮件接口(
$QQ.'@qq.com',
'关于业务的重要通知',
$邮件模板
);
if ($结果 === 200) {
日志写入("已发送","成功");
} else {
日志写入("发送失败 " . $结果,"错误");
}
}
日志写入("任务结束","提示");
日志写入(">>>==================================>>>","结束");
?>

View File

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.urgent-badge {
background: linear-gradient(135deg, #FF3D3D 0%, #FF6D41 100%);
color: white!important;
border-radius: 24px;
padding: 8px 24px;
display: inline-block;
font-weight: 700;
}
.data-highlight {
color: #FF3D3D;
font-weight: 700;
padding: 2px 4px;
background: rgba(255,61,61,0.08);
border-radius: 4px;
}
</style>
</head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0; background: #f8f9fa; padding: 40px 0;">
<div style="max-width: 600px; margin: 0 auto; padding: 0 20px;">
<!-- 紧急状态标识 -->
<div style="text-align: center; margin-bottom: 32px;">
<div class="urgent-badge">
⛔ 服务已过期
</div>
</div>
<!-- 主内容卡 -->
<div style="background: white; border-radius: 24px; padding: 40px; box-shadow: 0 8px 24px rgba(0,0,0,0.06);">
<!-- 标题 -->
<h1 style="font-size: 28px; color: #2D2D2D; margin: 0 0 24px;">
[业务名称] 已过期
</h1>
<!-- 关键数据 -->
<div style="border-left: 4px solid #FF3D3D; padding-left: 20px; margin-bottom: 32px;">
<p style="color: #666; margin: 0 0 12px;">
🆔 业务ID<span class="data-highlight">[业务ID]</span>
</p>
<p style="color: #666; margin: 0 0 12px;">
📅 过期时间:<span class="data-highlight">[到期时间]</span>
</p>
</div>
<!-- 影响提示 -->
<div style="background: #FFF5F5; border-radius: 12px; padding: 20px; margin-bottom: 32px;">
<h2 style="font-size: 18px; color: #FF3D3D; margin: 0 0 12px;">
❗ 警告:
</h2>
<ul style="color: #666; margin: 0; padding-left: 24px;">
<li style="margin-bottom: 8px;">产品数据已删除!</li>
</ul>
</div>
</div>
<!-- 页脚 -->
<div style="text-align: center; color: #888; padding: 48px 0 24px;">
<div style="height:1px; background:rgba(0,0,0,0.1); margin: 0 auto 32px; width: 60%;"></div>
<p style="margin: 0 0 8px;">需要帮助? 📧 admin@fuxsto.cn</p>
<p style="margin: 0; font-size: 14px;">© 2025 Fuxsto</p>
<p style="margin: 8px 0 0; font-size: 14px;">如果邮件显示异常请使用邮箱客户端
</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,73 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.urgent-badge {
background: linear-gradient(135deg, #FF3D3D 0%, #FF6D41 100%);
color: white!important;
border-radius: 24px;
padding: 8px 24px;
display: inline-block;
font-weight: 700;
}
.data-highlight {
color: #FF3D3D;
font-weight: 700;
padding: 2px 4px;
background: rgba(255,61,61,0.08);
border-radius: 4px;
}
</style>
</head>
<body style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; margin: 0; background: #f8f9fa; padding: 40px 0;">
<div style="max-width: 600px; margin: 0 auto; padding: 0 20px;">
<!-- 紧急状态标识 -->
<div style="text-align: center; margin-bottom: 32px;">
<div class="urgent-badge">
⛔ 服务已过期
</div>
</div>
<!-- 主内容卡 -->
<div style="background: white; border-radius: 24px; padding: 40px; box-shadow: 0 8px 24px rgba(0,0,0,0.06);">
<!-- 标题 -->
<h1 style="font-size: 28px; color: #2D2D2D; margin: 0 0 24px;">
[业务名称] 已过期
</h1>
<!-- 关键数据 -->
<div style="border-left: 4px solid #FF3D3D; padding-left: 20px; margin-bottom: 32px;">
<p style="color: #666; margin: 0 0 12px;">
🆔 业务ID<span class="data-highlight">[业务ID]</span>
</p>
<p style="color: #666; margin: 0 0 12px;">
📅 过期时间:<span class="data-highlight">[到期时间]</span>
</p>
</div>
<!-- 影响提示 -->
<div style="background: #FFF5F5; border-radius: 12px; padding: 20px; margin-bottom: 32px;">
<h2 style="font-size: 18px; color: #FF3D3D; margin: 0 0 12px;">
❗ 警告:
</h2>
<ul style="color: #666; margin: 0; padding-left: 24px;">
<li style="margin-bottom: 8px;">产品数据已删除!</li>
</ul>
</div>
</div>
<!-- 支持信息 -->
<div style="text-align: center; color: #999; padding: 32px 0 16px;">
<p style="margin: 0 0 8px;">需要帮助? 📞 [客服电话] | 📧 [支持邮箱]</p>
<p style="margin: 0; font-size: 14px;">🔗 访问帮助中心:[帮助中心链接]</p>
<div style="height:1px; background:#EEE; margin: 24px 0;"></div>
<p style="margin: 0; font-size: 14px;">© [年份] [公司名称] - [备案信息]</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
:root {
--primary: #FF6D41;
--surface: #FFF8F5;
--on-surface: #2D2D2D;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
margin: 0;
background: #f5f5f5;
}
.emoji-focus {
display: inline-block;
transform: scale(1.2);
margin: 0 4px;
}
</style>
</head>
<body style="padding: 8vh 0;">
<div style="max-width: 600px; margin: 0 auto; padding: 0 20px;">
<!-- 头部 -->
<div style="text-align: center; padding: 32px 0;">
<div style="display: inline-block; background: rgba(255,109,65,0.12);
padding: 12px 24px; border-radius: 24px; font-weight: 500;">
<span class="emoji-focus"></span> 服务到期提醒
</div>
</div>
<!-- 主卡片 -->
<div style="background: var(--surface); border-radius: 24px; padding: 48px;
box-shadow: 0 8px 24px rgba(0,0,0,0.06);">
<!-- 标题区 -->
<h1 style="font-size: 32px; color: var(--on-surface); margin: 0 0 32px;">
<span style="color: var(--primary);">Fuxsto Host</span><br>
<span style="font-weight: 300;">您的服务即将到期</span>
</h1>
<!-- 核心信息 -->
<div style="border-left: 4px solid var(--primary); padding-left: 24px; margin-bottom: 40px;">
<p style="color: #666; margin: 0 0 16px; line-height: 1.6;">
<span class="emoji-focus">🙌</span> 到期时间:<strong>[到期时间]</strong>
</p>
<p style="color: #666; margin: 0; line-height: 1.6;">
<span class="emoji-focus">🤐</span> 剩余天数:<strong style="color: var(--primary);">[剩余天数]</strong>
</p>
</div>
<!-- 功能列表 -->
<div style="margin-bottom: 40px;">
<div style="display: flex; align-items: baseline; gap: 8px; margin-bottom: 16px;">
<span class="emoji-focus">📄</span>
<h3 style="margin: 0; color: var(--on-surface);">业务信息</h3>
</div>
<ul style="color: #666; margin: 0; padding-left: 32px;">
<li style="margin-bottom: 8px;">[业务名称]</li>
<li style="margin-bottom: 8px;">[业务ID]</li>
</ul>
</div>
<!-- 操作按钮 -->
<div style="display: grid; gap: 16px;">
<a href="https://hv5.fuxsto.cn" style="display: block; padding: 18px; background: var(--primary);
color: white!important; text-decoration: none; border-radius: 12px;
font-weight: 700; text-align: center; transition: all 0.2s;">
🚀 立即续订
</a>
</div>
</div>
<!-- 页脚 -->
<div style="text-align: center; color: #888; padding: 48px 0 24px;">
<div style="height:1px; background:rgba(0,0,0,0.1); margin: 0 auto 32px; width: 60%;"></div>
<p style="margin: 0 0 8px;">需要帮助? 📧 admin@fuxsto.cn</p>
<p style="margin: 0; font-size: 14px;">© 2025 Fuxsto</p>
<p style="margin: 8px 0 0; font-size: 14px;">如果邮件显示异常请使用邮箱客户端
</p>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1,117 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
:root {
--primary: #FF6D41;
--surface: #FFF8F5;
--on-surface: #2D2D2D;
--radius-lg: 24px;
--radius-md: 12px;
--space-xl: 48px;
--space-lg: 32px;
--space-md: 24px;
--space-sm: 16px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
margin: 0;
background: #f5f5f5;
line-height: 1.6;
}
.container {
max-width: 600px;
margin: 0 auto;
padding: 0 20px;
}
.badge {
background: rgba(255,109,65,0.12);
padding: 12px 24px;
border-radius: var(--radius-lg);
display: inline-block;
font-weight: 500;
}
.card {
background: var(--surface);
border-radius: var(--radius-lg);
padding: var(--space-xl);
box-shadow: 0 8px 24px rgba(0,0,0,0.06);
}
.highlight {
border-left: 4px solid var(--primary);
padding-left: var(--space-md);
margin: var(--space-lg) 0;
}
.btn-primary {
display: block;
padding: 18px;
background: var(--primary);
color: white!important;
text-decoration: none;
border-radius: var(--radius-md);
font-weight: 700;
text-align: center;
}
.divider {
height: 1px;
background: rgba(0,0,0,0.1);
width: 60%;
margin: 0 auto;
}
</style>
</head>
<body style="padding: 8vh 0;">
<div class="container">
<!-- Header -->
<div style="text-align: center; padding: var(--space-lg) 0;">
<div class="badge">
⏰ 服务到期提醒
</div>
</div>
<!-- Main Card -->
<div class="card">
<h1 style="font-size: 2em; color: var(--on-surface); margin: 0 0 var(--space-lg);">
<span style="color: var(--primary);">Fuxsto Host</span><br>
<span style="font-weight: 300;">您的服务即将到期</span>
</h1>
<!-- Key Info -->
<div class="highlight">
<p style="color: #666; margin: 0 0 var(--space-sm);">
📅 到期时间:<strong>[到期时间]</strong>
</p>
<p style="color: #666; margin: 0;">
⏳ 剩余天数:<strong style="color: var(--primary);">[剩余天数]</strong>
</p>
</div>
<!-- Business Info -->
<div style="margin-bottom: var(--space-xl);">
<h3 style="font-size: 1.2em; color: var(--on-surface); margin: 0 0 var(--space-sm);">
📄 业务信息
</h3>
<ul style="color: #666; margin: 0; padding-left: var(--space-md);">
<li style="margin-bottom: 8px;">[业务名称]</li>
<li style="margin-bottom: 8px;">[业务ID]</li>
</ul>
</div>
<!-- Action Button -->
<a href="https://hv5.fuxsto.cn" class="btn-primary">
🚀 立即续订
</a>
</div>
<!-- Footer -->
<div style="text-align: center; color: #888; padding: var(--space-xl) 0 var(--space-md);">
<div class="divider" style="margin-bottom: var(--space-lg);"></div>
<p style="margin: 0 0 8px;">需要帮助? 📧 admin@fuxsto.cn</p>
<p style="margin: 0; font-size: 0.875em;">© 2025 Fuxsto</p>
<p style="margin: 8px 0 0; font-size: 0.875em;">如果邮件显示异常请使用邮箱客户端</p>
</div>
</div>
</body>
</html>

74
Main/System/try.php Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
* 邮件接口调用函数
* @param string $收件人 收件人邮箱地址
* @param string $主题 邮件主题
* @param string $内容 邮件正文内容
* @param string $接口地址 默认接口地址
* @return int|string 成功返回200失败返回错误信息
*/
function 发送邮件接口($收件人, $主题, $内容, $接口地址 = 'https://hv3.fuxsto.cn/user/OpenEmailApi.php')
{
// 参数有效性验证
if (!filter_var($收件人, FILTER_VALIDATE_EMAIL)) {
return "收件人邮箱格式无效";
}
// 准备请求参数(自动编码处理)
$请求数据 = http_build_query([
'to' => $收件人,
'subject' => $主题,
'msg' => $内容
]);
// 初始化cURL
$ch = curl_init();
// 配置cURL选项
curl_setopt_array($ch, [
CURLOPT_URL => $接口地址,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true, // 验证SSL证书
CURLOPT_TIMEOUT => 15, // 15秒超时
CURLOPT_CONNECTTIMEOUT => 5, // 5秒连接超时
CURLOPT_POSTFIELDS => $请求数据,
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
]
]);
// 执行请求
$响应 = curl_exec($ch);
// 错误处理
if (curl_errno($ch)) {
$错误信息 = '网络请求失败: ' . curl_error($ch);
curl_close($ch);
return $错误信息;
}
// 获取HTTP状态码
$状态码 = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 处理响应
if ($状态码 !== 200) {
return "接口响应异常 (HTTP {$状态码})";
}
// 验证响应内容
return ($响应 === '200') ? 200 : trim($响应);
}
$结果 = 发送邮件接口(
'3220257676@qq.com',
'测试邮件主题',
file_get_contents("./Res/ExpiredProductsCleaner.html")
);
if ($结果 === 200) {
echo '邮件发送成功';
} else {
echo '发送失败: ' . htmlspecialchars($结果);
}

74
Main/System/try.php.bak Normal file
View File

@@ -0,0 +1,74 @@
<?php
/**
* 邮件接口调用函数
* @param string $收件人 收件人邮箱地址
* @param string $主题 邮件主题
* @param string $内容 邮件正文内容
* @param string $接口地址 默认接口地址
* @return int|string 成功返回200失败返回错误信息
*/
function 发送邮件接口($收件人, $主题, $内容, $接口地址 = 'https://hv3.fuxsto.cn/user/OpenEmailApi.php')
{
// 参数有效性验证
if (!filter_var($收件人, FILTER_VALIDATE_EMAIL)) {
return "收件人邮箱格式无效";
}
// 准备请求参数(自动编码处理)
$请求数据 = http_build_query([
'to' => $收件人,
'subject' => $主题,
'msg' => $内容
]);
// 初始化cURL
$ch = curl_init();
// 配置cURL选项
curl_setopt_array($ch, [
CURLOPT_URL => $接口地址,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true, // 验证SSL证书
CURLOPT_TIMEOUT => 15, // 15秒超时
CURLOPT_CONNECTTIMEOUT => 5, // 5秒连接超时
CURLOPT_POSTFIELDS => $请求数据,
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
]
]);
// 执行请求
$响应 = curl_exec($ch);
// 错误处理
if (curl_errno($ch)) {
$错误信息 = '网络请求失败: ' . curl_error($ch);
curl_close($ch);
return $错误信息;
}
// 获取HTTP状态码
$状态码 = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 处理响应
if ($状态码 !== 200) {
return "接口响应异常 (HTTP {$状态码})";
}
// 验证响应内容
return ($响应 === '200') ? 200 : trim($响应);
}
$结果 = 发送邮件接口(
'3220257676@qq.com',
'测试邮件主题',
file_get_contents("./Res/ExpiryReminder.html")
);
if ($结果 === 200) {
echo '邮件发送成功';
} else {
echo '发送失败: ' . htmlspecialchars($结果);
}