删除 More/t.php.bak
This commit is contained in:
211
Main/System/ExpiredProductsCleaner.php
Normal file
211
Main/System/ExpiredProductsCleaner.php
Normal 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';
|
||||
";
|
||||
@数据库运行($语句);
|
||||
|
||||
日志写入("已更新业务状态","提示");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
日志写入("任务结束","提示");
|
||||
日志写入(">>>==================================>>>","结束");
|
||||
|
||||
?>
|
||||
211
Main/System/ExpiredProductsCleaner.php.bak
Normal file
211
Main/System/ExpiredProductsCleaner.php.bak
Normal 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';
|
||||
";
|
||||
@数据库运行($语句);
|
||||
|
||||
日志写入("已更新业务状态","提示");
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
日志写入("任务结束","提示");
|
||||
日志写入(">>>==================================>>>","结束");
|
||||
|
||||
?>
|
||||
212
Main/System/ExpiryReminder.php
Normal file
212
Main/System/ExpiryReminder.php
Normal 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 {
|
||||
|
||||
日志写入("发送失败 " . $结果,"错误");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
日志写入("任务结束","提示");
|
||||
日志写入(">>>==================================>>>","结束");
|
||||
|
||||
?>
|
||||
202
Main/System/ExpiryReminder.php.bak
Normal file
202
Main/System/ExpiryReminder.php.bak
Normal 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 {
|
||||
|
||||
日志写入("发送失败 " . $结果,"错误");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
日志写入("任务结束","提示");
|
||||
日志写入(">>>==================================>>>","结束");
|
||||
|
||||
?>
|
||||
0
Main/System/Log/.last_clean
Normal file
0
Main/System/Log/.last_clean
Normal file
0
Main/System/Log/ExpiredProductsCleaner/.last_clean
Normal file
0
Main/System/Log/ExpiredProductsCleaner/.last_clean
Normal file
File diff suppressed because it is too large
Load Diff
0
Main/System/Log/ExpiryReminder/.last_clean
Normal file
0
Main/System/Log/ExpiryReminder/.last_clean
Normal file
1069
Main/System/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log
Normal file
1069
Main/System/Log/ExpiryReminder/ExpiryReminder_2025-03-01.log
Normal file
File diff suppressed because it is too large
Load Diff
74
Main/System/Res/ExpiredProductsCleaner.html
Normal file
74
Main/System/Res/ExpiredProductsCleaner.html
Normal 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>
|
||||
73
Main/System/Res/ExpiredProductsCleaner.html.bak
Normal file
73
Main/System/Res/ExpiredProductsCleaner.html.bak
Normal 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>
|
||||
86
Main/System/Res/ExpiryReminder.html
Normal file
86
Main/System/Res/ExpiryReminder.html
Normal 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>
|
||||
117
Main/System/Res/ExpiryReminder.html.bak
Normal file
117
Main/System/Res/ExpiryReminder.html.bak
Normal 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
74
Main/System/try.php
Normal 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
74
Main/System/try.php.bak
Normal 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($结果);
|
||||
}
|
||||
Reference in New Issue
Block a user