Я решаю эту проблему, используя модель электронной почты с полями «to» и «guid».
def self.deliver(which, to, guid, *args)
transaction do
if self.where(:email => to, :guid => guid).first.nil?
if record = Email.create(:email => to, :guid => guid, :template => which) and !record.new_record?
Mailer.send("deliver_#{which}", to, *args)
end
end
end
end
Это для почтовой программы Rails 2.3, поэтому вызов будет немного отличаться для Rails 3, но основная концепция верна. Вместо того, чтобы вызывать почтовую программу напрямую, вы будете вызывать:
Email.deliver(email_name, receipient, some_guid_you_generate_for_this_email, *args_to_be_sent_to_mailer)
Это проверит базу данных, чтобы убедиться, что вы не отправляете одно и то же электронное письмо по указанному адресу, и сохранит запись всех отправленных электронных писем, которые вы можете проверить в будущем.