本記事は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をインストールします。
sidekiq.ymlにsidekiq-schedulerの設定を加えます。
event_worker: cron: '0 * * * * *' # Runs once per minute
class: EventWorker
bundle exec sidekiqでsidekiqを実行するとEventWorkerが1分おきに実行されます。
定期的にメール送信
メール送信といっても特別なことはなく、EventWorker内でメールを飛ばすだけです。
ざっくり書いておくと、RailsにデフォルトでついてくるApplicationMailerを利用してメールを飛ばします。
gmailのアカウントからメールを飛ばすように設定。
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は適当に設定してください(以下同じ)。
メーラーを作成します。
ActionMailer::Base default from: "***@gmail.com"
def sendmail_notice()
mail(to: '***@gmail.com', subject: 'メールタイトル')
end
end
include Sidekiq::Worker
def perform()
ContactMailer.sendmail_notice().deliver_now
puts 'Hello!'
end
end
メール本文を定義します。
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<p> このメールは定期的に送信されています。 </p>
</body>
</html>
これで1分おきにメールが飛ばせるようになります。
カスタマイズすればいろいろ利用範囲が広がりそうです。