网站状态检测并免费发送邮件通知
检测网站域名访问是否正常,如果网站URL无法访问或者访问异常,则调用AokSend的免费邮件API接口发送通知邮件。
🛡️ 网站状态检测 & 免费邮件通知
目录
关于本项目
本项目是一个轻量级 PHP 脚本,用于定期检测指定网站的 HTTP 和 SSL/TLS 状态。一旦检测到访问异常(如无法解析域名、连接失败或 SSL 即将过期),即可通过 AokSend 免费邮件 API 自动发送告警通知至指定邮箱。
功能特性
- ✅ 支持多 URL 同时检测
- ✅ 检查域名解析问题、HTTP 请求失败、SSL 过期 / 剩余天数不足
- ✅ 自动发送邮件通知,并反馈发送成功状态
- ✅ 输出 JSON 结构,包含时间戳、阈值设置、各站点检测及通知状态
使用场景
- 监控网站是否在线,及时发现 DNS、连接、SSL 等问题
- 中小型站点无需复杂监控系统,用此脚本即可满足基础告警需求
- 教育、个人项目可用作演示如何自动发送邮件通知的实例
安装与使用
准备工作
- 注册并获取 AokSend 邮件 API 的
app_key
、template_id
- 确保服务器已安装 PHP(支持
curl
与openssl
扩展) - 申请一台 VPS,并安装宝塔面板(BT)
下载 & 配置
# 克隆仓库
git clone https://github.com/Meettom/checkwebsite.git
cd checkwebsite
编辑根目录下的 checkwebsite.php
,更新以下配置:
$sites = [
'https://yourdomain.com',
'https://another-site.cn',
];
$expireThresholdDays = 7; // SSL 剩余天数阈值
$aokApiKey = '你的 AokSend APP_KEY';
$templateId = '你的 TEMPLATE_ID';
$toEmail = '通知接收邮箱@domain.com';
或者 直接复制下面的代码内容:
PHP代码如下
<?php
// 配置
$sites = [
'https://www.aoksend.com',
'https://mailapisss.ltd',
];
$expireThresholdDays = 7;
$aokApiKey = '67f45f100000000000000000e9fb0c';
$templateId = 'E_1000000000800';
$toEmail = 'sakihiewb@aoksend.com';
function check_site($url) {
global $expireThresholdDays;
$r = ['url'=>$url, 'ok'=>false, 'ssl_days_left'=>null, 'error'=>null];
// HTTP 检测
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_NOBODY => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_FAILONERROR => true,
]);
if (curl_exec($ch) === false) {
$r['error'] = 'HTTP error: ' . curl_error($ch);
curl_close($ch);
return $r;
}
curl_close($ch);
// SSL 检测
$host = parse_url($url, PHP_URL_HOST);
$ctx = stream_context_create(['ssl'=>['capture_peer_cert'=>true, 'verify_peer'=>true]]);
$fp = @stream_socket_client("ssl://{$host}:443", $errno, $errstr, 10, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
$r['error'] = 'SSL socket error: ' . $errstr;
return $r;
}
$pars = stream_context_get_params($fp);
$cert = openssl_x509_parse($pars['options']['ssl']['peer_certificate']);
$expire = $cert['validTo_time_t'] ?? 0;
$days = ceil(($expire - time()) / 86400);
fclose($fp);
$r['ssl_days_left'] = $days;
if ($days < 0) {
$r['error'] = "SSL 已过期";
} elseif ($days < $expireThresholdDays) {
$r['error'] = "SSL 剩余 {$days} 天,低于阈值 {$expireThresholdDays} 天";
} else {
$r['ok'] = true;
}
return $r;
}
function send_alert_email($subject, $body) {
global $aokApiKey, $templateId, $toEmail;
$form = [
'app_key' => $aokApiKey,
'template_id'=> $templateId,
'to' => $toEmail,
'alias' => '监控系统',
'is_random' => 1,
// 正确格式 —— JSON 字符串
'data' => json_encode(['subject'=>$subject, 'body'=>$body])
];
$ch = curl_init('https://www.aoksend.com/index/api/send_email');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $form,
CURLOPT_TIMEOUT => 10,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
]);
$out = curl_exec($ch);
if ($out === false) {
$err = curl_error($ch);
curl_close($ch);
return ['success'=>false, 'error'=>"CURL 调用失败: $err"];
}
curl_close($ch);
$res = json_decode($out, true);
if (!is_array($res) || !isset($res['code'])) {
return ['success'=>false, 'error'=>"接口未返回合法 JSON: $out"];
}
if ($res['code'] === 200) {
return ['success'=>true];
} else {
return ['success'=>false, 'error'=>"API 返回失败,code={$res['code']},message={$res['message']}"];
}
}
// 主逻辑
$results = [];
foreach ($sites as $url) {
$res = check_site($url);
if (!$res['ok']) {
$subject = "【监控异常】{$url}";
$message = "{$url} 异常原因:{$res['error']}";
$sent = send_alert_email($subject, $message);
$res['error'] .= $sent['success'] ? ' (Sent email)' : ' (Email failed: ' . ($sent['error'] ?? 'unknown') . ')';
}
$results[] = $res;
}
// 输出 JSON
header('Content-Type: application/json; charset=UTF-8');
header('Access-Control-Allow-Origin: *');
echo json_encode([
'time'=> date(DATE_ISO8601),
'threshold_days'=> $expireThresholdDays,
'results'=> $results,
], JSON_PRETTY_PRINT);
部署到宝塔
- 在宝塔面板的 网站→添加站点 中,创建一个新站点,指向该脚本所在目录
- 上传
checkwebsite.php
至站点目录,并将其设为可访问(用于手动或计划执行)
设置定时任务
在宝塔面板进入 计划任务,添加如下任务:
- 执行周期:如 每天 0 点、6 点、12 点、18 点 或 每 30 分钟
- 执行命令:
/usr/bin/php /www/wwwroot/your-site-dir/checkwebsite.php >/dev/null 2>&1
运行验证
手动运行一次:
php checkwebsite.php
返回类似以下 JSON 表明脚本正确执行:
{
"time": "2025-06-19T11:22:18+0800",
"threshold_days": 7,
"results": [
{ "url": "https://site1.com", "ok": true, "ssl_days_left": 89, "error": null },
{ "url": "https://badsite.ltd", "ok": false, "ssl_days_left": null, "error": "HTTP error... (Sent email)" }
]
}
若有检测异常,并且邮件发送成功,将在 error
字段中附加 (Sent email)
。
扩展场景
- 🔧 支持配置多个通知渠道:短信(SMS)、Slack、Telegram Bot 等
- 📈 整合监控平台:Prometheus + Alertmanager + Grafana,实现可视化大屏监控
- 📦 构建 Docker 镜像,部署于容器环境或无服务器(Serverless)架构中
- 🔒 增加高级检测:带 HTTP 内容校验、传输延迟测速、API 接口响应监控等
致谢
- README 格式借鉴自优秀模板
- 感谢 AokSend 提供免费邮件 API
许可证
MIT License — 欢迎自由使用、修改和分享!如有建议或贡献,欢迎提交 Issue 或 Pull Request。