讲师中心 微信公众号
AI工具推荐 视频效率加速

Twilio呼叫拒接与语音留言邮件通知:PHP与TwiML实现教程

千丽小哥_9765

千丽小哥_9765

发布时间:2025-12-04 13:12:25

|

1027人浏览过

|

来源于php中文网

原创

Twilio呼叫拒接与语音留言邮件通知:PHP与TwiML实现教程

本教程详细指导如何使用twilio、php和twiml实现一个智能呼叫处理系统。该系统能够筛选来电,在用户拒接时自动将来电转接到语音留言,并将录制的语音留言链接通过电子邮件发送给指定邮箱,确保重要留言不会遗漏,从而提升企业通信效率和客户服务体验。

一、系统架构与呼叫流程概述

本系统旨在为企业提供一个灵活的来电处理机制。当客户拨打Twilio号码时,系统将首先播放欢迎语,然后尝试将来电转接给内部人员进行筛选。如果内部人员选择拒接,或者未能在规定时间内接听,系统将自动将来电转接到语音留言服务,并在留言录制完成后,将录音文件的链接通过电子邮件发送给预设的邮箱。

整个呼叫流程通过一系列Twilio TwiML(Twilio Markup Language)文件和PHP脚本协同完成,其核心步骤如下:

  1. 来电触发: 客户拨打Twilio号码,Twilio向配置的Webhook URL发送请求。
  2. 主入口处理: Handle-Incoming-Call.XML 文件作为入口,将请求重定向到PHP脚本。
  3. 呼叫路由与筛选准备: Handle-Extension.PHP 脚本播放欢迎语,并尝试通过动词将来电转接给内部号码。在此阶段,我们配置了呼叫录音功能 (record="true"),并指定了当转接失败或被叫方挂断时,Twilio应调用的回调URL (action="voicemail.php")。同时,通过动词的url属性,我们实现了呼叫筛选功能,即在内部人员接听前播放筛选提示。
  4. 来电筛选: Screen-Caller.XML 文件在内部人员接听前播放提示,要求其输入数字来决定是否接听。
  5. 处理筛选结果: Handle-Screen-Input.PHP 脚本根据内部人员的输入,决定是连接呼叫还是挂断。
  6. 语音留言录制: 如果呼叫被拒接或未接通,Twilio将调用 voicemail.php。此脚本会播放留言提示,并使用动词录制客户留言。关键在于,的action属性被设置为 mail.php,这意味着录音完成后,Twilio将向 mail.php 发送包含录音链接的请求。
  7. 语音留言邮件通知: mail.php 脚本接收到Twilio的请求后,提取录音链接,并将其通过电子邮件发送到指定邮箱。

二、详细实现步骤与代码示例

2.1 主入口:Handle-Incoming-Call.XML

此XML文件是Twilio Webhook的第一个响应,它简单地将控制权重定向到 handle-extension.php。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Redirect>handle-extension.php</Redirect>
</Response>

2.2 呼叫路由与筛选准备:Handle-Extension.PHP

此PHP脚本负责播放欢迎语,并尝试将呼叫转接给内部号码。

立即学习“PHP免费学习笔记(深入)”;

<?php
    header('Content-type: text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<Response>';

    // 播放欢迎语
    echo '<Say voice="alice">感谢您的来电,我的业务</Say>';

    // 尝试拨号给内部号码,并开启录音。
    // timeout: 拨号等待时间
    // action: 如果拨号失败或被叫方挂断,Twilio将请求此URL
    echo '<Dial record="true" timeout="15" action="voicemail.php">';
    // 内部号码,url属性用于呼叫筛选
    echo '<Number url="screen-caller.xml">+10000000000</Number>'; // 替换为你的内部号码
    echo '</Dial>';

    echo '</Response>';
?>

关键点:

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载
  • :启用呼叫录音。
  • action="voicemail.php":当拨号失败(如无人接听、忙线)或被叫方(即内部人员)挂断时,Twilio会将控制权交给 voicemail.php。
  • :在内部人员接听电话之前,Twilio会向 screen-caller.xml 发送请求,播放提示语并等待输入。

2.3 来电筛选:Screen-Caller.XML

此XML文件在内部人员接听前播放提示,询问是否接听。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Gather action="handle-screen-input.php" numDigits="1">
        <Say voice="alice">您的业务有来电。</Say>
        <Say voice="alice">要接听请按1。</Say>
        <Say voice="alice">要拒接请按2。</Say>
    </Gather>
</Response>

关键点:

  • :收集一个数字输入,并将其发送到 handle-screen-input.php 进行处理。

2.4 处理筛选结果:Handle-Screen-Input.PHP

此PHP脚本根据内部人员的输入决定呼叫的去向。

<?php
    header('Content-type: text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?>';
    echo '<Response>';

    $user_pushed = (int) $_REQUEST['Digits']; // 获取用户按下的数字

    if ($user_pushed == 1) {
        // 如果按下1,连接呼叫
        echo '<Say voice="alice">正在连接,请说你好。</Say>';
    } else {
        // 如果按下2,挂断电话。此时,由于Handle-Extension.PHP中的Dial action,
        // 呼叫将转到 voicemail.php。
        echo '<Hangup />';
    }

    echo '</Response>';
?>

关键点:

  • 如果内部人员按下 2 选择拒接,Handle-Screen-Input.PHP 会发送 指令。此时,Handle-Extension.PHP 中 动词的 action="voicemail.php" 将被触发,呼叫流转到语音留言。

2.5 实现语音留言功能:voicemail.php

此脚本负责播放留言提示并录制客户的语音留言。

<?php
    header('content-type: text/xml');
    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";

    // 可选:记录请求日志
    // file_put_contents('incoming_voicemail.log', "\n" .json_encode($_REQUEST) . "\n", FILE_APPEND);
?>
<Response>
  <Say voice="alice">您拨打的电话暂时无人接听。请在滴声后留言。</Say>
  <!--
    关键改动:将 recordingStatusCallback 改为 action。
    action 属性在录音完成后立即触发,并将控制权交给 mail.php。
    Twilio 会向 mail.php 发送包含 RecordingUrl 等参数的请求。
  -->
  <Record action="mail.php"></Record>
</Response>

关键点:

  • :这是实现邮件通知的关键。当客户完成语音留言录制后,Twilio会立即向 mail.php 发送一个HTTP POST请求。这个请求中会包含录音的URL (RecordingUrl)、录音的SID (RecordingSid) 等重要信息。

2.6 实现语音留言邮件通知:mail.php

此脚本接收Twilio发送的录音信息,并将其通过电子邮件发送。

<?php
    // 确保Twilio请求是POST方法
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        // 获取Twilio发送的录音URL
        $recordingUrl = $_REQUEST['RecordingUrl'];
        $recordingSid = $_REQUEST['RecordingSid'];
        $callSid = $_REQUEST['CallSid'];

        // 配置邮件接收者和主题
        $to = 'your_email@example.com'; // 替换为你的接收邮箱
        $subject = '新的Twilio语音留言 - ' . date('Y-m-d H:i:s');

        // 构造邮件内容
        $message = "您收到一条新的Twilio语音留言。\n\n";
        $message .= "录音链接: " . $recordingUrl . ".mp3\n"; // Twilio录音URL默认不带扩展名,通常需要手动添加.mp3
        $message .= "录音SID: " . $recordingSid . "\n";
        $message .= "呼叫SID: " . $callSid . "\n";
        $message .= "请点击链接收听语音留言。\n";

        // 设置邮件头部
        $headers = 'From: noreply@yourdomain.com' . "\r\n" .
                   'Reply-To: noreply@yourdomain.com' . "\r\n" .
                   'X-Mailer: PHP/' . phpversion();

        // 发送邮件
        if (mail($to, $subject, $message, $headers)) {
            // 邮件发送成功,可以记录日志或不作处理
            error_log("语音留言邮件发送成功到: " . $to);
        } else {
            // 邮件发送失败
            error_log("语音留言邮件发送失败到: " . $to);
        }
    }

    // 响应Twilio,通常不需要返回TwiML,但可以返回一个空Response
    header('Content-type: text/xml');
    echo '<?xml version="1.0" encoding="UTF-8"?><Response/>';
?>

关键点:

  • $_REQUEST['RecordingUrl']:Twilio会通过POST请求将录音文件的URL传递给此脚本。
  • .mp3 扩展名:Twilio提供的 RecordingUrl 默认不带文件扩展名,为了方便某些邮件客户端或播放器识别,通常手动添加 .mp3。
  • mail() 函数:此处使用PHP内置的 mail() 函数发送邮件。在生产环境中,建议使用更健壮的邮件库(如PHPMailer)或专业的SMTP服务,以确保邮件的送达率和可靠性。

三、注意事项与最佳实践

  1. Webhook URL配置: 确保在Twilio控制台为你的号码正确配置了Webhook URL,指向 Handle-Incoming-Call.XML 或其所在的PHP脚本。所有PHP和XML文件都应部署在可公开访问的Web服务器上。
  2. 安全性: 在生产环境中,强烈建议验证Twilio请求的签名,以确保请求确实来自Twilio,防止恶意请求。
  3. 错误处理与日志记录: 在PHP脚本中加入错误处理机制和日志记录,以便在出现问题时能够追踪和调试。例如,file_put_contents('error.log', ...) 可以用于记录错误信息。
  4. 邮件发送可靠性: PHP的 mail() 函数依赖服务器的邮件配置,可能存在送达率问题。对于重要的通知,推荐使用第三方SMTP服务(如SendGrid, Mailgun等)或PHPMailer等库进行邮件发送。
  5. TwiML动词理解: 深入理解Twilio TwiML动词(如, , , , , ) 的作用及其属性,是构建复杂呼叫流程的基础。特别是 action 和 statusCallback 属性,它们控制着Twilio在事件发生后的下一步行为。
  6. 文件路径: 确保所有XML和PHP文件之间的相对路径是正确的,或者使用完整的URL路径。

四、总结

通过本教程,我们成功构建了一个Twilio呼叫处理系统,它不仅能够实现来电筛选和语音留言功能,还能够将录制的语音留言链接通过电子邮件自动发送给指定邮箱。这极大地提升了企业在处理未接来电时的效率和响应速度,确保了客户的重要留言能够及时被处理。您可以根据业务需求,在此基础上进一步扩展功能,例如将留言存储到数据库、集成CRM系统等。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4824

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

6277

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

2542

2024.11.28

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1029

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3200

2023.10.25

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

894

2023.11.24

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2945

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

4081

2023.08.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn