No release in over a year
SMS/Text Message gem, allow your Rails send short message to phone
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Runtime

>= 5.0.0
~> 0.0.4
 Project Readme

ActionMessageTexter

以 Rails ActionMailer 為參考打造的簡訊寄送模組,提供與 ActionMailer 一致的開發體驗

Installation

Add this line to your application's Gemfile:

gem 'action_message_texter'

And then execute:

$ bundle

Or install it yourself as:

$ gem install action_message_texter

Usage

請先執行generator

rails g action_message_texter:texter ModuleName action_name action_name ....

這將會產生以下文件

root
├─ app
│  └─ texters
│     ├─ application_texter.rb
│     └─ module_name_texter.rb
│
└─ config
   └─ locales
      └─ module_name.yml

使用上大致上跟Mailer差不多

# app/texter/my_texter.rb
class MyTexter
  def my_ubereats(phone)
    @order = "林東芳的半筋半肉牛肉麵"
    @notes = "不要牛肉不要麵"
    text(to: phone)
  end
end

與Mailer不同的是 簡訊內容不從View Render出來,請使用I18n,或是直接給 content

# config/locales/texter/my_texter.yaml
zh-TW:
  my_texter:
    my_action: 今晚我想來點%{order},%{note}
# app/texter/my_texter.rb
def my_ubereats(phone)  
  ...
  # 也可以直接給文字,不走I18n
  text(to: phone, content: "今晚我想來點#{order}#{note}")
end

跟 ActionMailer 一樣,提供 deliver_nowdeliver_later 兩種寄送方式,deliver_now 會直接寄出,deliver_later會調用Job做寄出。

# 直接寄出,後續的動作需等待這個動作完成
MyTexter.my_ubereats("0987654321").deliver_now
# 調用Job,後續的動作繼續執行
MyTexter.my_ubereats("0987654321").deliver_latter

於是 0987654321 就會收到這樣的簡訊

今晚我想來點林東芳的半筋半肉牛肉麵,不要牛肉不要麵

Configuration

設定簡訊傳送方式: 三竹簡訊 API

設定方式基本跟 ActionMailer 一模一樣

預設內建三竹簡訊,首先請設定網域帳號密碼,如果有需要Callback的話,請準備一下Callback Url

有計劃提供一個介面讓大家可以自己包自己的簡訊Api模組 到時候只需使用 add_delivery_method 就可以加入自己的 Api 模組

  • Require
    麻煩請先到config/application.rb 新增 require action_message_texter/engine

  • 設定三竹API

    # config/application.rb
    config.action_message_texter.mitake_settings= { 
      url: "三竹發給你的網域名稱 ex: https://smsapi.mitake.com.tw", 
      username: "三竹的使用者名稱", 
      password: "三竹的密碼", 
      callback_url: "https://foo.bar.com/api/v1/callback" # 這行非必填
    }  
  • 設定預設寄送方式
    目前只有 mitake 一種寄送方式,因此預設就是這個,但若有需要的話

    app/application.rb裡,可以預設所有簡訊要使用哪一個寄送方式

     # app/application.rb
    
     #預設值為 :mitake
     config.action_message_texter.delivery_method = :mitake

    基本上的設定方式都與ActionMailer相同,如果有不知道如何設定的,可以依照設定Mailer的經驗試試看喔

Message Object

Message 物件相當於 ActionMailer 中的 Message 物件,是簡訊的本體,Message 物件包含了這些東西

  • uuid: 簡訊的ID
  • to: 收件者
  • content: 簡訊內容
  • response: 簡訊 Api 的回覆 (此部分可以參考三竹簡訊API文件)

Callbacks

可以在Tester中加入 before_actionafter_action,在這兩個方法中可以取得 message 物件。

class MyTexter
  before_action :do_before
  after_action :do_after

  def do_before
    ...do_something
  end

  def do_after
    ...do_something
  end
  ....

Observer

若需要再寄送後,查看寄送是否完成?儲存寄送方式結果...等 可以註冊一個 Observer 或多個 Observer

class TexterObserver
  def self.delivered_message(message)
    # 請實作此方法
    
    # 如傳送後儲存傳送結果
    message_history = MessageHistory.find_by(uuid: message.uuid)
    message_history.update(response_message: message.response.response_message)
  end
end


class MyTexter
  self.register_observer(TexterObserver)
  
  # 您也可以註冊多組Observer
  self.register_observer(OtherObserver)
end

Inspection

如了Observer 您也可以註冊攔截器 Inspection

class TexterInterceptor
  def self.delivering_message(message)
    # 請實作此方法

    # 如測試站時加入測試站專屬訊息
    message.content = "[test]#{message.content}" unless Rails.env.production
  end
end


class MyTexter
  self.register_interceptor(TexterInterceptor)
  
  # 您也可以註冊多組攔截器
  self.register_interceptor(OtherInterceptor)
end

Test

小弟初次寫Gem 還不會寫測試 還請各位神人協助交流 感謝

License

The gem is available as open source under the terms of the MIT License.