You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求用于列出并可选择性删除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.

火山引擎 最新活动