毎朝9時にサイト情報を管理者へメール自動配信 [ActionMailer]

ActionMailerとwheneverとrakeタスクで、毎朝9時に管理者に公開済記事数と昨日公開された記事数/各記事のタイトルを自動配信。

①サーバーを設定

config/environments/development.rb

config.action_mailer.delivery_method = :letter_opener_web
config.action_mailer.default_url_options = { host: 'localhost:3000' }

今回は開発環境でletter_opnerを使用。

②メイラーをジェネレート。
$ bundle exec rails g mailer ArticleMailer report_summary


以下のファイルが生成される。

  • app/mailers/article_mailer.rb
  • app/mailers/application_mailer.rb
  • app/views/article_mailer
  • app/views/layouts/mailer.text.slim
  • app/views/layouts/mailer.html.slim
  • spec/mailers/article_mailer_spec.rb
  • spec/mailers/previews/article_mailer_preview.rb

③article_mailer.rbに送信処理を記載。
class ArticleMailer < ApplicationMailer
  def report_summary
    @published_article_count = Article.published.count
    @articles_published_at_yesterday = Article.published_at_yesterday
    mail(to: 'admin@example.com', subject: '公開済記事の集計結果')
  end
end


④mailer.text.slim, mailer.html.slimでメール本文のviewを作成。
# text

公開済の記事数: <%= @published_article_count %>件
<% if @articles_published_at_yesterday.present? %>
  昨日公開された記事数: <%= @articles_published_at_yesterday.count %>件
  <% @articles_published_at_yesterday.each do |article| %>
    タイトル: <%= article.title  %>
  <% end %>
<% else %>
  昨日公開された記事はありません
<% end %>
# html

<p>公開済の記事数: <%= @published_article_count %>件</p>
<% if @articles_published_at_yesterday.present? %>
  <p>昨日公開された記事数: <%= @articles_published_at_yesterday.count %>件</p>
  <% @articles_published_at_yesterday.each do |article| %>
    <p>タイトル: <%= article.title  %></p>
  <% end %>
<% else %>
  <p>昨日公開された記事はありません</p>
<% end %>


spec/mailers/previews/article_mailer_preview.rbに記載されているURLでプレビューできる。

# Preview this email at http://localhost:3000/rails/mailers/article_mailer/report_summary
def report_summary
  ArticleMailer.report_summary
end


【プレビュー】
Image from Gyazo

⑤rakeタスクファイルを作成、記載。
$ bundle exec rails g task article_summary
namespace :article_summary do
  desc '管理者に対して総記事数、昨日公開された記事数とタイトルをメールで送信'
  task mail_article_summary: :environment do
    ArticleMailer.report_summary.deliver_now
  end
end


⑥config/schedule.rbでクロンを設定。(wheneverインストール済)
every 1.day, at: '9am' do
  rake 'article_summary:mail_article_summary'
end


⑦クロンをアップデート
$ bundle exec whenever --update-crontab



参考記事:
Rails メール自動配信機能をActionMailerとwheneverを使用して実装する - Qiita
【Rails】wheneverでバッチ処理を行う(未読通知が3件以上溜まったらAction Mailerでメール送信) - Qiita
ActionMailer Preview のススメ - Qiita