SlackMailer gem helps separate business logic from logic of message delivery. It structures code just like ActionMailer.
Add this line to your application's Gemfile:
gem 'slack_mailer'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install slack_mailer
Before using gem you need install sidekiq in to your project.
Add queue for sidekiq to config/sidekiq.yml
- [slack_messages, 1]
Create configuration file config/initializers/slack_mailer.rb
Slack::Mailer::Configuration.configure do |config|
config.templates_path = "#{Rails.root}/app/views/slack_templates/"
config.templates_type = 'text'
config.erb_in_templates = true
config.slack_hook_urls = ['https://hooks.slack.com/services/...........',
'https://hooks.slack.com/services/...........']
end
Gem balances messages by hooks. It helps not to reach a message limit through 1 hook per 1 second.
app/slack_mailers/user_mailer.rb
class UserMailer < Slack::Mailer
def created(user)
@user = user
mail(to: 'channel_name', template: 'created')
end
end
If you want to send a message via Mailer without sidekiq
class UserMailer < Slack::Mailer
def created(user)
@user = user
mail(to: 'channel_name', template: 'created', use_sidekiq: false)
end
end
Mailer will be using template app/views/slack_templates/user_mailer/created.text.erb
Name: <%= @user.name %>
Full name: <%= @user.full_name %>
Phone: <%= @user.phone %>
UserMailer.created(user)
Sending small messages(one line message)
Slack::Mailer.send_message('#channel', 'name', 'message')
Sending message by passing sidekiq
Slack::Mailer.send_direct_message('#channel', 'name', 'message')
Also you can do this by using slack-notifier