如何使用Twilio Voice实现未接听外呼电话转语音信箱?
解决未接听外呼转语音信箱的问题
你的问题核心是无人接听(响铃超时)的场景没有触发语音信箱逻辑——Twilio的AMD(自动机器检测)仅针对机器/答录机应答的情况,而无人接听属于呼叫超时完成,不会触发AMD相关判定。以下是具体修复方案:
1. 调整呼叫基础参数
首先缩短timeout值,避免过长时间响铃(比如设置为20秒,符合常规无人接听超时逻辑),同时确保statusCallback能正确接收所有状态:
Twilio.TwilioClient.Init(username, password); CallResource call = CallResource.Create( to: new PhoneNumber("+1xxxxxxxxx"), from: new PhoneNumber("+1xxxxxxxxx"), twiml: new Twilio.Types.Twiml("<Response><Say>Enjoy!</Say></Response>"), timeout: 20, // 缩短响铃时长,更快触发无人接听状态 statusCallback: new Uri("https://test.com/api/Callback"), statusCallbackMethod: Twilio.Http.HttpMethod.Post, statusCallbackEvent: new List<string> { "initiated", "ringing", "answered", "completed" }, machineDetection: "DetectMessageEnd" );
2. 在状态回调中处理无人接听场景
当呼叫状态变为completed时,检查回调请求中的AnsweredBy和CallStatus参数:
- 如果
CallStatus是completed且AnsweredBy为空(说明无人接听,既没有被人接,也没有被答录机接),此时需要主动触发语音信箱逻辑。 - 如果
AnsweredBy是machine,Twilio会自动处理到答录机的留言(对应你当前能成功的场景)。
以下是回调接口的处理示例(C#):
[HttpPost("api/Callback")] public IActionResult CallBack([FromForm] string CallStatus, [FromForm] string AnsweredBy, [FromForm] string To) { if (CallStatus == "completed" && string.IsNullOrEmpty(AnsweredBy)) { // 无人接听,直接发送语音到对方语音信箱 var twiml = new Twilio.TwiML.VoiceResponse(); twiml.Say("This is your message for voicemail."); twiml.Leave(); // 让Twilio留在语音信箱中,确保留言被录制 // 发起新呼叫,直接转语音信箱流程 CallResource.Create( to: new PhoneNumber(To), from: new PhoneNumber("+1xxxxxxxxx"), twiml: new Twilio.Types.Twiml(twiml.ToString()), machineDetection: "Enable" // 快速检测语音信箱,直接进入留言模式 ); } return Ok(); }
3. 关键逻辑说明
machineDetection: "Enable"会让Twilio快速识别语音信箱,跳过响铃直接进入留言流程。<Leave>是Twilio专门用于留在语音信箱录制留言的指令,确保对方能正常接收你的语音。- 无人接听场景必须通过
statusCallback主动处理,Twilio不会自动将超时呼叫转至语音信箱。
内容的提问来源于stack exchange,提问作者user2135156
相关产品推荐
相关产品推荐

