Twilio非手机号码语音信箱设置异常:20秒后收到空回拨
Twilio语音信箱无内容回拨问题排查及后续自愈情况
我最近在给一个非Twilio手机号的Twilio号码配置语音信箱,整体功能都能正常运行——可以拨打、留语音留言,之后也能收到带转录内容和录音链接的短信/邮件通知,但有个奇怪的问题:每次留完言挂断后大约20秒,我会收到一个无内容的空回拨,这个回拨没有任何语音提示,过10-15秒后才会收到正常的通知。
我按照以下流程做了测试:
- 用我的手机拨打这个Twilio号码
- 手机拒接来电(虽然TWIML里设置了
timeout=1,但呼叫并没有停止) - 留语音留言
- 挂断或按按键结束留言
- 约20秒后收到空回拨
- 10-15秒后正常收到短信/邮件通知
我怀疑问题出在TWIML 1或TWIML 2的配置里,但一直没定位到具体原因。
相关配置代码
TWIML 1(呼叫转接逻辑)
<?xml version="1.0" encoding="UTF-8"?> <Response> <Dial action="https://-->TWIML 2" timeout="1" callerId="{{To}}" > <Number>##CELL##</Number> </Dial> </Response>
TWIML 2(语音留言逻辑)
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say> Please leave a message </Say> <Record action="https://TWIML 3" method="POST" maxLength="120" playBeep="false" trim="do-not-trim" transcribe="true" transcribeCallback="https://FUNCTION 1" /> <Say>I did not receive a recording.</Say> </Response>
TWIML 3(留言结束提示)
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say>Bi</Say> </Response>
FUNCTION 1(通知发送逻辑)
exports.handler = function(context, event, callback) { var client = context.getTwilioClient(); const mailgun = require('mailgun-js')({apiKey: context.MG_KEY, domain:context.MG_DOMAIN}); var async = require('async'); var sendSMS = function(callback){ let dataSMS = { to: '##CELL##', from: event.To, body: 'Voicemail from:\n ' + event.From + '\n\nText:\n' + event.TranscriptionText + '\n\n---MSG Recording---\n' + event.RecordingUrl }; client.messages.create(dataSMS).then(function(response){ console.log('N [T1]: ' + response.status); return callback(null, response); }).catch(function(err){ console.log('T2: ' + err); }); }; var sendEmail = function(callback){ let dataMG = { to: '@@TO@@', from: '@@FROM@@', subject: 'Voicemail: ' + event.From, text: event.TranscriptionText + '\n\n--- MSG Recording --->\n' + event.RecordingUrl }; console.log('-------- Sending Mail (Mailgun API)---->' + dataMG.to); mailgun.messages().send(dataMG, function (error, body) { console.log('N [MB] Mailgun Body :' + body); return callback(null, body); }); }; var waitTime = function(callback){ setTimeout(function() { return callback(200); }, 1000); }; var asyncTasks = [sendSMS, sendEmail, waitTime]; async.parallel(asyncTasks, function(err, result){ console.log('--------------------------DONE--------------------------' + result[0] + result[1]); callback(null, 200); }); };
问题解决情况
让人意外的是,没有修改任何配置的情况下,几天后这个空回拨的问题自行消失了,语音信箱的所有功能都正常运行,不再出现异常回拨。
配置细节说明
这个语音信箱系统的功能和注意点整理如下:
- 核心功能:将语音留言转录为文本,同时发送包含录音链接的短信(MMS),并通过Mailgun发送邮件副本
- 付费提示:Twilio的语音转录服务需要额外付费,使用前请确认计费规则
- 运维注意:录音文件需要定期清理,避免占用过多存储空间或产生额外费用
- 参数说明:TWIML 1中的
timeout参数控制的是呼叫转接时的响铃时长,这里设置为1秒 - 依赖说明:FUNCTION 1依赖
async库来并行执行短信、邮件发送和等待任务,可根据需求调整任务逻辑或依赖库
内容的提问来源于stack exchange,提问作者Who's there... Me




