求用于列出并可选择性删除Twilio消息及关联媒体的PHP示例脚本
嘿,我整理了一个PHP实现方案,既能列出系统里的SMS和MMS消息,还能选择性删除它们以及关联的媒体附件,分享给你参考👇
核心功能说明
- 列出所有SMS/MMS消息,包含发件人、收件人、内容、类型、创建时间等关键信息
- 支持根据消息ID选择性删除,同时自动清理MMS关联的媒体附件(比如图片、音频等)
实现代码详解
1. 数据库连接与基础配置
首先得连接存储短信的数据库(通常Android系统是mmssms.db,其他平台需根据实际情况调整),这里用PDO来保证操作的安全性:
<?php // 数据库配置 - 根据你的实际环境修改 $dbPath = '/path/to/mmssms.db'; // 短信数据库的实际路径 $dsn = "sqlite:$dbPath"; $pdo = new PDO($dsn); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 定义消息类型常量,方便后续识别 define('MESSAGE_TYPE_SMS', 1); define('MESSAGE_TYPE_MMS', 2); ?>
小贴士:Android系统中
mmssms.db一般在/data/data/com.android.providers.telephony/databases/目录下,需要root权限才能访问哦。
2. 列出所有SMS/MMS消息
这个函数会查询所有消息并返回结构化数组,方便前端展示或后续处理:
/** * 获取所有SMS/MMS消息列表 * @param PDO $pdo 数据库连接对象 * @return array 消息数组,每个元素包含完整消息详情 */ function getAllMessages($pdo) { // 联合查询sms和mms表,按时间倒序排列 $stmt = $pdo->query(" SELECT _id AS message_id, address AS phone_number, body AS content, type AS message_type, date AS create_time, read AS is_read FROM sms UNION ALL SELECT _id AS message_id, address AS phone_number, text AS content, 2 AS message_type, date AS create_time, read AS is_read FROM mms ORDER BY create_time DESC "); $messages = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 将时间戳转换为可读格式(Android时间戳是毫秒级,需除以1000) $row['create_time'] = date('Y-m-d H:i:s', $row['create_time'] / 1000); // 把数字类型转换为易读的文字描述 $row['message_type'] = $row['message_type'] == MESSAGE_TYPE_SMS ? 'SMS' : 'MMS'; $messages[] = $row; } return $messages; } // 调用示例:输出消息列表 $messages = getAllMessages($pdo); echo "<h3>消息列表</h3>"; echo "<ul>"; foreach ($messages as $msg) { echo "<li> ID: {$msg['message_id']} | 类型: {$msg['message_type']} | 号码: {$msg['phone_number']} <br> 内容: {$msg['content']} <br> 时间: {$msg['create_time']} | 已读: {$msg['is_read'] ? '是' : '否'} </li>"; } echo "</ul>";
3. 选择性删除消息及关联附件
这个函数会根据消息ID删除对应内容,同时自动清理MMS关联的媒体文件,避免残留垃圾:
/** * 删除指定ID的消息及关联媒体附件 * @param PDO $pdo 数据库连接对象 * @param int $messageId 要删除的消息ID * @param int $messageType 消息类型(1=SMS,2=MMS) * @return bool 删除操作是否成功 */ function deleteMessage($pdo, $messageId, $messageType) { try { $pdo->beginTransaction(); if ($messageType == MESSAGE_TYPE_MMS) { // 先获取MMS关联的媒体附件路径 $stmt = $pdo->prepare("SELECT _data FROM part WHERE mid = ?"); $stmt->execute([$messageId]); $mediaPaths = $stmt->fetchAll(PDO::FETCH_COLUMN); // 物理删除媒体文件(如果文件存在) foreach ($mediaPaths as $path) { if (file_exists($path)) { unlink($path); } } // 清理MMS关联的表数据(part、addr、mms主表) $pdo->prepare("DELETE FROM part WHERE mid = ?")->execute([$messageId]); $pdo->prepare("DELETE FROM addr WHERE mid = ?")->execute([$messageId]); $pdo->prepare("DELETE FROM mms WHERE _id = ?")->execute([$messageId]); } else { // 直接删除SMS消息 $pdo->prepare("DELETE FROM sms WHERE _id = ?")->execute([$messageId]); } $pdo->commit(); return true; } catch (Exception $e) { $pdo->rollBack(); error_log("删除消息失败: " . $e->getMessage()); return false; } } // 调用示例:删除ID为123的SMS消息 $deleteResult = deleteMessage($pdo, 123, MESSAGE_TYPE_SMS); echo $deleteResult ? "删除成功!" : "删除失败,请查看错误日志。";
重要注意事项
- 务必备份数据库:操作前一定要先备份
mmssms.db,避免误删数据无法恢复 - 权限要求:访问系统短信数据库和媒体文件需要足够的权限(比如Android的root权限)
- 适配不同ROM:部分手机厂商会修改短信数据库的表结构,需要根据实际情况调整SQL语句
内容的提问来源于stack exchange,提问作者Alan M.




