You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP校准管理系统:解决到期工具按负责人批量发提醒邮件问题

解决批量发送校准提醒邮件的问题

问题根源

你的邮件触发逻辑不在数据循环内部,且存在以下问题:

  • 收件人是固定值receiver@example.com,没有使用工具负责人$owner的邮箱
  • 变量$toolnr未正确引用循环中的$user_data['toolnr']
  • 每次循环重复设置SMTP配置,冗余且可能引发问题

解决方案

1. 优化SQL查询(可选,提前过滤符合条件的记录)

原SQL可以加上days <= 30的条件,减少循环处理的数据量:

SELECT *, DATEDIFF(nextcalibration, CURDATE()) AS days 
FROM tools AS dp 
WHERE isdeleted <> 'Deleted' 
AND DATEDIFF(nextcalibration, CURDATE()) <= 30

2. 重构代码,将邮件逻辑嵌入循环

把邮件发送逻辑放到while循环内部,确保每条符合条件的记录都触发邮件:

<center> <table id="table_id" class="table table-striped">
    <tr>
        <th>Номер</th> <th>Статус</th> <th>Найменование</th> <th>Сериен номер</th> <th>Локация</th> <th>Отговорник</th> <th>Калибриран на</th> <th>Следваща калибрация</th> <th>Калибрира се при</th> <th>Интервал</th> <th>Оставащи дни</th> <th>Действия</th>
    </tr>
    <?php
    // 提前设置SMTP配置,避免循环内重复执行
    ini_set('SMTP', "smtp.server.int");
    ini_set('smtp_port', "25");
    ini_set('sendmail_from', "XXX@XXX.com");
    
    while($user_data = mysqli_fetch_array($result)) 
    {
        echo "<tr>";
        echo "<td>".$user_data['toolnr']."</td>";
        echo "<td>".$user_data['status']."</td>";
        echo "<td>".$user_data['toolname']."</td>";
        echo "<td>".$user_data['serial']."</td>";
        echo "<td>".$user_data['usedat']."</td>";
        echo "<td>".$user_data['owner']."</td>";
        echo "<td>".$user_data['calibrated']."</td>";
        echo "<td>".$user_data['nextcalibration']."</td>";
        echo "<td>".$user_data['vendors']."</td>";
        echo "<td>".$user_data['lifetime']."</td>";
        echo "<td>";
        $toolnr = $user_data['toolnr'];
        $days = $user_data['days'];
        $owner_email = $user_data['owner']; // 获取负责人邮箱
        
        if($days <= 30){
            echo "<span style='color:red;'>$days</span>";
            
            // 发送提醒邮件
            $subject = "校准期限即将到期提醒";
            $body = "工具编号: $toolnr\n距离下次校准仅剩 $days 天,请及时安排校准。";
            $headers = "From: MyTools <XXX@XXX.com>";
            
            if (mail($owner_email, $subject, $body, $headers)) {
                echo "<br>已发送提醒邮件至 $owner_email";
            } else {
                echo "<br>邮件发送失败至 $owner_email";
            }
        }
        else{
            echo "<span style='color:green;'>$days</span>";
        }
        echo "</td>";
        echo "<td><a href='edit.php?id=$user_data[id]'><img src='img/edit.png' ></a> | <a href='delete.php?id=$user_data[id]' onclick='return checkDelete()'><img src='img/delete.png'></a></td></tr>";
    }
    ?>
</table> </center>

3. 可选优化:按负责人合并邮件

如果一个负责人有多个即将到期的工具,可以合并成一封邮件发送,避免频繁收件:

<?php
// 先收集所有需要提醒的记录,按负责人分组
$reminders = [];
while($user_data = mysqli_fetch_array($result)) {
    $days = $user_data['days'];
    if($days <= 30) {
        $owner = $user_data['owner'];
        if(!isset($reminders[$owner])) {
            $reminders[$owner] = [];
        }
        $reminders[$owner][] = [
            'toolnr' => $user_data['toolnr'],
            'days' => $days,
            'nextcalibration' => $user_data['nextcalibration']
        ];
    }
    
    // 继续渲染表格代码...
}

// 统一发送合并后的邮件
ini_set('SMTP', "smtp.server.int");
ini_set('smtp_port', "25");
ini_set('sendmail_from', "XXX@XXX.com");

foreach($reminders as $owner_email => $tools) {
    $subject = "多台工具校准期限即将到期提醒";
    $body = "以下工具距离下次校准已不足30天,请及时安排:\n\n";
    foreach($tools as $tool) {
        $body .= "- 工具编号: {$tool['toolnr']} | 剩余天数: {$tool['days']} | 校准日期: {$tool['nextcalibration']}\n";
    }
    $headers = "From: MyTools <XXX@XXX.com>";
    
    mail($owner_email, $subject, $body, $headers);
}
?>

关键注意事项

  • 确保owner字段存储的是有效的邮箱地址
  • 避免在网页请求中频繁发送大量邮件,建议改用**定时任务(Cron)**执行邮件发送逻辑,避免页面超时
  • 可以添加日志记录,跟踪邮件发送状态,方便排查问题

内容的提问来源于stack exchange,提问作者user15969669

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:15:37