网站状态检测并免费发送邮件通知

网站状态检测并免费发送邮件通知

检测网站域名访问是否正常,如果网站URL无法访问或者访问异常,则调用AokSend的免费邮件API接口发送通知邮件。


🛡️ 网站状态检测 & 免费邮件通知

目录


关于本项目

本项目是一个轻量级 PHP 脚本,用于定期检测指定网站的 HTTP 和 SSL/TLS 状态。一旦检测到访问异常(如无法解析域名、连接失败或 SSL 即将过期),即可通过 AokSend 免费邮件 API 自动发送告警通知至指定邮箱。


功能特性

  • ✅ 支持多 URL 同时检测
  • ✅ 检查域名解析问题、HTTP 请求失败、SSL 过期 / 剩余天数不足
  • ✅ 自动发送邮件通知,并反馈发送成功状态
  • ✅ 输出 JSON 结构,包含时间戳、阈值设置、各站点检测及通知状态

使用场景

  • 监控网站是否在线,及时发现 DNS、连接、SSL 等问题
  • 中小型站点无需复杂监控系统,用此脚本即可满足基础告警需求
  • 教育、个人项目可用作演示如何自动发送邮件通知的实例

安装与使用

准备工作

  1. 注册并获取 AokSend 邮件 API 的 app_keytemplate_id
  2. 确保服务器已安装 PHP(支持 curlopenssl 扩展)
  3. 申请一台 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);

部署到宝塔

  1. 在宝塔面板的 网站→添加站点 中,创建一个新站点,指向该脚本所在目录
  2. 上传 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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值