Send an Email On a Date Specified in a Database Column
I have what I think is a working setup to send emails via Delayed_Job
. However, I haven't received my test email and it isn't practical to wait for more to happen with a delay of days. I need to figure out:
- What's wrong that's causing the email not to send.
- How to test it without waiting days at a time.
I'm new to Delayed_Job
, so pardon the newbie mistakes.
Here's the model that includes the send_reminder_emails
method. They were fully functional without the delay bit, so at least I know that much works:
class Reminder < ActiveRecord::Base
belongs_to :user
before_save :create_mail_date
after_save :send_reminder_emails
extend FriendlyId
friendly_id :name, use: [:slugged, :finders]
def create_mail_date
@schedule = IceCube::Schedule.new(self.date)
case self.repeating
when "Weekly"
@schedule.add_recurrence_rule(
IceCube::Rule.weekly
)
when "Monthly"
@schedule.add_recurrence_rule(
IceCube::Rule.monthly.day_of_month(self.date.mon)
)
when "Yearly"
@schedule.add_recurrence_rule(
IceCube::Rule.yearly.day_of_year(self.date.yday)
)
end
if self.repeating
self.date = @schedule.next_occurrence(Time.now)
end
self.mail_date = self.date - 7.days
end
private
def send_reminder_emails
if self.reminder
RemainderMailerJob.set(wait_until: self.mail_date).perform_later(user, remainder) ##this line is the issue
#ReminderMailer.delay(run_at: self.mail_date).reminder_send(self.user, self)ow
self.create_mail_date ##this is another solution I've tried
end
end
handle_asynchronously :send_reminder_emails
end
The references to schedule
are via the Ice_Cube
gem and all of the date stuff has been tested via my console and is working. Here is my reminder_mailer.rb
:
class ReminderMailer < ApplicationMailer
default from: "man@manlyartofbbq.com"
def reminder_send(user, reminder)
@user = user
@reminder = reminder
mail(to: user.email, subject: "Reminder! #{reminder.name} is fast approaching!")
end
end
I installed Delayed_Job
step by step from their readme for Rails 4. Any help getting the delayed part of this mailer ironed out is appreciated!
Hi Liz,
Scheduling can be kind of difficult to get a handle on.
Are you running the daemon on your development environment? (The script that manages/runs delayed_jobs in the background.) This will essentially create a worker process to queue up your jobs and process them, if I'm not mistaken. I haven't worked directly with delayed_job, but it's similar to Resque and Sidekiq.
You should also be able to queue a job for a few seconds in the future from the command line for testing purposes. :)