Have a look at BackgrounDrb. Essentially you’d do something like
send_me_later = DeferredMail.new(:send_after=>2.hours.from_now), then
a BackgrounDrb worker would scan the table every minute and send mail
as needed. The controller could always destroy the DeferredMail object
before it was sent, if you needed to cancel the operation.