技術

Railsにて非同期処理とスケジュール機能を使い定期的にメール送信する(後編)

本記事はRailsにてメールを定期送信する仕組みを解説したものです。

今回は後編で、定期的にアプリを実行し、さらにメール送信を実装します。

前編はこちら。

プログラミング
Railsにて非同期処理とスケジュール機能を使い定期的にメール送信する(前編)

Railsにてメールを定期送信する仕組みを作ってみました。 実現方法ですが、sidekiqとsidekiq-scheduleを組み合わせるのが良さげだったので、これを採用。 おそらくこれが最も手っ取り ...

続きを見る

動作確認は以下で行っています。

OS  :  macOS Sierra 10.12.6
ruby  :  2.4.0
rails  :  5.1.4

定期的にアプリを実行するsidekiq-scheduler

sidekiqにて構築したキューイング処理を定期的に実行します。

これには相性の良いsidekiq-schedulerを利用します。

Gemfileにgem 'sidekiq-scheduler'を追加し、sidekiq-schedulerをインストールします。

$ bundle install

sidekiq.ymlにsidekiq-schedulerの設定を加えます。

comfig/ sidekiq.yml
:schedule:
 event_worker: cron: '0 * * * * *' # Runs once per minute
 class: EventWorker

bundle exec sidekiqでsidekiqを実行するとEventWorkerが1分おきに実行されます。

定期的にメール送信

メール送信といっても特別なことはなく、EventWorker内でメールを飛ばすだけです。

ざっくり書いておくと、RailsにデフォルトでついてくるApplicationMailerを利用してメールを飛ばします。

gmailのアカウントからメールを飛ばすように設定。

config/environments/development.rb
  config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
     :address => 'smtp.gmail.com',
     :port => '587',
     :domain => 'smtp.gmail.com',
     :authentication => 'plain',
     :user_name => '***',
     :password => '***',
     :enable_starttls_auto => true, }

*になっているuser_nameやpasswordは適当に設定してください(以下同じ)。

メーラーを作成します。

app/mailers/application_mailer.rb
classApplicationMailer
   ActionMailer::Base default from: "***@gmail.com" 
   def sendmail_notice() 
  mail(to: '***@gmail.com', subject: 'メールタイトル')  
       end
end
EventWorker内にてこのsendmail_noticeを呼び出します。
class EventWorker
 include Sidekiq::Worker
 def perform()
  ContactMailer.sendmail_notice().deliver_now
  puts 'Hello!'
 end
end

メール本文を定義します。

/app/views/application_mailer/sendmail_notice.erb
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <p> このメールは定期的に送信されています。 </p>
    </body>
</html>

これで1分おきにメールが飛ばせるようになります。

カスタマイズすればいろいろ利用範囲が広がりそうです。

-技術

© 2022 FIRE達成のフリーランスエンジニアブログ