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
相关产品推荐
相关产品推荐

