Hướng dẫn dùng gem send sms cho rails + gem donenv để load các biến môi trường

Hiện nay với sự phát triển của thiết bị điện tử thì điện thoại gần như vật mà ai ai cũng có và nó không còn chỉ dùng để nghe gọi truyền thống mà còn được áp dụng trong rất nhiều mảng trong đó có 1 mảng khá được quan tâm đó là dùng để tương tác giữa người dùng với các nhà cung cấp dịch vụ một cách nhanh chóng và an toàn. Dễ thấy nhất là các dịch vụ thông qua tin nhắn như tin nhắn xác thực, tin nhắn thông báo trạng dịch vụ sử dụng mà người dùng nhận đc từ các nhà cung cấp(Gmail, yahoo, dịch vụ mobie banking ...). Do đó ta có thể thấy việc sử dụng sms cho các dịch vụ hiện tại và tương lai đang rất phát triển và tiềm năng áp dụng cao.

Với các công ty lớn thì hệ thống của họ thường xây dụng kết nối trực tiếp tới nhà cung cấp dịch vụ điện thoại để gửi tin nhắn dịch vụ.Tuy nhiên với các công ty vừa và nhỏ thì điều này khá là khó vì thời gian cũng như là kinh phí, may sao đã có rất nhiều các công ty bên thứ 3 xây dựng hệ thống hỗ trợ giải quyết việc này với chi phí rẻ thời gian áp dụng nhanh và tương thích với nhiều hệ thống web. Trong đó rails cũng không ngoại lệ và bài viết sau sẽ giúp bạn biết được phần nào về áp dụng gem có sẵn để send sms từ hệ thống rails.

1. Gem twilio-ruby

1.1 Giới thiệu:

đây là 1 gem sử dụng khá dễ dàng, hỗ trợ nhiều nước trên thế giới, tuy nhiên để sử dụng bạn phải tạo tài khoản ở trên trang web www.twilio.com và chỉ có thể gửi sms cho số điện thoại ở mĩ và canada với tài khoản free, nếu muốn gửi sms cho các quốc gia khác bạn phải trả phí để nâng cấp tài khoản

1.2 cài đặt và sử dụng

Đầu tiên để sử dụng gem này ta phải vào trang web www.twilio.com để tạo tài khoản và lấy account id và authen tokken để sử dụng.

mhuman1.png

Sau đó giống như cài đặt các gem khác vào app rails của mình. Bạn vào file Gem thêm dòng

gem 'twilio-ruby'

Sau đó chạy lên bundle để install gem mới này

bundle

để sử gem twilio gửi sms rất đơn giản, trong controller cần xử lý việc gửi sms bạn chỉ việc khai báo giống ví dụ sau

class SendTextController < ApplicationController
  def index
  end

  def send_text_message
    number_to_send_to = params[:number_to_send_to]

    twilio_sid = "abc123"
    twilio_token = "foobar"
    twilio_phone_number = "6165555555"

    @twilio_client = Twilio::REST::Client.new twilio_sid, twilio_token

    @twilio_client.account.sms.messages.create(
      :from => "+1#{twilio_phone_number}",
      :to => number_to_send_to,
      :body => "This is an message. It gets sent to #{number_to_send_to}"
    )
  end
end

ở đây number_to_send_to là số điện thoại nhận được tin nhắn twilio_sid và twilio_sid là thông tin twilio tạo ra cho tài khoản của bạn (ảnh tài khoản trên), twilio_phone_number là số điện thoại bạn chọn dùng để gửi tin nhắn (twilio hỗ trợ cho bạn dùng nhiều số để gửi và bạn có thể chọn - các số bạn có thể dùng được lưu ở setting của tài khoản tiwilo của bạn)

Chú ý: khi sử dụng tài khoản với mật khẩu bạn không nên ghi trực tiếp trong code, nên để trong biến môi trường rồi gọi (tham khảo gem dotenv - https://github.com/bkeepers/dotenv sẽ được nói ở cuối bài) như sau:

development:
  secret_key_base: 'your secret key base'
  twilio_account_sid: <%= ENV["TWILIO_ACCOUNT_SID"] %>
  twilio_auth_token: <%= ENV["TWILIO_AUTH_TOKEN"] %>

test:

production:
  secret_key_base: 'your secret key base'
  twilio_account_sid: <%= ENV["TWILIO_ACCOUNT_SID"] %>
  twilio_auth_token: <%= ENV["TWILIO_AUTH_TOKEN"] %>

rồi gọi trong controller

Ngoài việc send sms, twilio còn hỗ trợ việc gửi mms bằng cách khai báo theo kiểu:

@client.messages.create(
  from: '+14159341234',
  to: '+16105557069',
  body: 'Hey there!',
  media_url: 'http://example.com/smileyface.jpg'
)

2. Gem SMS Fu

2.1 Giới thiệu

Đây là gem hỗ trợ việc gửi free sms thông qua việc gửi email tới 1 số nhà mạng Một số nhà mạng hỗ trợ (không hỗ trợ mạng Việt Nam 😦) :Alltel, Ameritech, AT&T, Bell Atlantic, BellSouth Mobility, Beeline(UA), BlueSkyFrog, Boost Mobile, BPL Mobile, Cellular South, Claro (Brazil, Nicaragua), Comcast, Du, E-Plus, Etisalat, Fido, kajeet, Mobinil, Mobitel, Movistar, Metro PCS, O2, Orange, Powertel, PSC Wireless, Qwest, Rogers, Southern Link, Sprint, Suncom, T-Mobile (US/UK/Germany), Telefonica, Tracfone, Virgin Mobile, Verizon Wireless, Vodafone (UK, Egypt, Italy, Japan, Spain) ... (xem thêm tại file config yml).

Một số nahf mạng yêu cầu người dùng phải xác thực và đồng ý với tính năng email to sms thì mới có thể nhận được sms mà từ app bạn gửi tới. 2.2 Cài đặt trước hết khai báo trong Gemfile:

gem sms-fu
gem pony

copy file này (github.com/brendanlim/sms-fu/blob/master/templates/sms_fu.yml) vào thư nục config của app.

Sau đó sửa lại cấu hình email của mình trong file đó

2.3 Cấu hình và sử dụng

Giống như đã nói ở phần giới thiệu, gem sms-fu sử dụng email để send sms, do đó bạn có thể dùng action mailer của rails với cấu hình theo hướng dẫn http://guides.rubyonrails.org/action_mailer_basics.html. Hặc sử dụng gem pony

File config trong địa chỉ config/environments thêm dòng cấu hình

# ActionMailer delivery
sms_fu = SMSFu::Client.configure(:delivery => :action_mailer)

# Pony delivery via Sendmail
sms_fu = SMSFu::Client.configure(:delivery => :pony, :pony_config => { :via => :sendmail })

# Pony delivery via SMTP
PONY_CONFIG = {
  :via => :smtp,
  :via_options => {
    :address              => 'smtp.gmail.com',
    :port                 => '587',
    :user_name            => 'username',
    :password             => 'password',
    :authentication       => :plain,
    :enable_starttls_auto => true,
    :domain               => "localhost.localdomain"
}}
sms_fu = SMSFu::Client.configure(:delivery => :pony, :pony_config => PONY_CONFIG)

tiếp theo đó là gọi việc gửi sms tại controller thông qua khai báo sau

sms_fu.deliver("5558675309","at&t","message")

bạn có thể thay đổi tên email gửi bằng cách thêm lựa chọn

sms_fu.deliver("5558675309","at&t","message", :from => "[email protected]")

Hay thiết lập độ dài tối đa cho tin nhắn

sms_fu.deliver("5558675309","at&t","message", :limit => 128)

Ở view người dùng có thể chọn nhà mạng trong danh sách hỗ trợ ở trên dựa theo code:

<%= carrier_select('user[carrier_name]', "Please choose a carrier") %>

3.Gem dotenv

3.1 Giới thiệu

Gem dotenv được dùng để lấy các giá trị được lưu ở file .env đặt tại folder gốc của app rails. Các giá trị này sẽ được load và gọi thông qua biến ENV.

3.2 Cài đặt

để cài đặt gem này, bạn thêm đoạn sau vào file Gemfile

gem 'dotenv-rails'

sau đó chạy bundle để cài gem

$ bundle

3.3 cấu hình và sử dụng

Sau khi cài đặt như trên là bạn có thể khai báo các giá trị trong file .env và load trong app để sử dụng.

lưu ý: là gem này được load trong lúc file config/application.rb được load, do đó nếu bạn muốn dùng gem này sớm để gọi giá trị dùng trong file config/application.rb thì phải dùng lệnh "Dotenv::Railtie.load" để load gem trước theo ví dụ sau

# config/application.rb
Bundler.require(*Rails.groups)

Dotenv::Railtie.load #load gem

HOSTNAME = ENV['HOSTNAME'] # bây giờ mới gọi được biến env

Và nếu bạn có sử dụng gem có yêu cầu các biến env thì bạn có thể dùng bằng cách khai báo gem dotenv trước gem đó và dùng thêm option "require dotenv/rails-now"

gem 'dotenv-rails', require: 'dotenv/rails-now'
gem 'gem-that-requires-env-variables' # gem cần load biến env

Lưu ý nhỏ nếu bạn khai báo thêm biến ENV mà trong rails c/ server không load được biến đó thì bạn close hết các cửa sổ teminal chạy rails đó rồi chạy lại từ đầu là ok