Rails5中使用Twilio将接收的短信转发至邮箱的配置及代码实现问题
问题1:Messaging Service下拉无可选选项解决方法
你无需强制选择Messaging Service即可配置webhook,操作如下:
- 进入目标Twilio虚拟号码的配置页,找到Messaging配置区块
- 定位「A message comes in」选项,直接选择「Webhook」,填写你的Rails服务公网回调地址,请求方法选择POST即可完成配置
- 如果你确实需要使用Messaging Service能力,先进入Twilio控制台侧边栏「Messaging > Services」页面,创建新的Messaging Service并绑定你的虚拟号码,完成创建后回到电话号码配置页即可在下拉列表中找到对应选项
问题2:Rails 5 + twilio-ruby 实现短信转发邮件代码方案
前置准备
确保你的Gemfile中已引入依赖:
gem 'twilio-ruby' # 开发环境可引入letter_opener做邮件本地测试 gem 'letter_opener', group: :development
执行bundle install完成安装。
1. 路由配置
在config/routes.rb中添加回调路由:
Rails.application.routes.draw do # 其他原有路由 post '/twilio/sms_forward', to: 'twilio#sms_forward' end
Twilio回调请求不会携带Rails默认的CSRF Token,需要跳过对应接口的CSRF校验。
2. 控制器实现
新建app/controllers/twilio_controller.rb:
class TwilioController < ApplicationController skip_before_action :verify_authenticity_token, only: [:sms_forward] def sms_forward # 提取Twilio回调携带的短信参数 sender_number = params[:From] receiver_twilio_number = params[:To] sms_content = params[:Body] sms_unique_id = params[:SmsSid] # 触发邮件发送 SmsForwardMailer.forward_sms( sender_number, receiver_twilio_number, sms_content, sms_unique_id ).deliver_now # 返回空TwiML响应给Twilio,避免平台回调重试 twiml_response = Twilio::TwiML::MessagingResponse.new render xml: twiml_response.to_s end end
3. 邮件发送类实现
执行生成命令rails g mailer SmsForwardMailer forward_sms,编辑生成的app/mailers/sms_forward_mailer.rb:
class SmsForwardMailer < ApplicationMailer # 替换为你配置好的发件邮箱 default from: 'system@your-domain.com' def forward_sms(sender, receiver, content, sms_id) @sender = sender @receiver = receiver @content = content @sms_id = sms_id # 替换为你要接收转发短信的目标邮箱 mail(to: 'your-target-email@example.com', subject: "收到来自#{sender}的Twilio短信") end end
4. 邮件内容模板
编辑app/views/sms_forward_mailer/forward_sms.html.erb:
<h2>新Twilio短信提醒</h2> <ul> <li>发送号码:<%= @sender %></li> <li>接收Twilio号码:<%= @receiver %></li> <li>短信内容:<%= @content %></li> <li>短信SID:<%= @sms_id %></li> </ul>
注意事项
- 生产环境需要提前配置好Rails的邮件发送服务(如SendGrid、SMTP服务等)
- 本地测试时可以用ngrok工具将本地3000端口暴露到公网,将生成的公网域名拼接回调路径填入Twilio后台即可完成测试
内容的提问来源于stack exchange,提问作者Chakreshwar Sharma
相关产品推荐
相关产品推荐

