使用Action Mailer创建帖子后发送用户电子邮件

时间:2012-12-07 00:45:40

标签: ruby-on-rails actionmailer

我有一个User模型(带有Devise)和一个属于用户的Post模型。我使用this railscast (pro)在创建帐户后向用户发送电子邮件

我创建了一个“NewPostMailer”

这是我的邮件:

class NewPostMailer < ActionMailer::Base
  default :from => "email@gmail.com"

  def new_post_email(user)
    @user = user
    @url = "http://localhost.com:3000/users/login"
    mail(:to => user.email, :subject => "New Post")
   end
end

我的posts_controller:

  def create
    @post= Post.new(params[:post])

    respond_to do |format|
      if @deal.save
        NewPostMailer.new_post_confirmation(@user).deliver
        format.html { redirect_to @post, notice: 'Post was successfully created.' }

post.rb

  after_create :send_new_post_email

  private
  def send_new_post_email
    NewPostMailer.new_post_email(self).deliver
  end

创建帖子后,我需要更改以向用户发送电子邮件。感谢。

2 个答案:

答案 0 :(得分:11)

创建另一个邮件程序(http://railscasts.com/episodes/206-action-mailer-in-rails-3

 class YourMailerName < ActionMailer::Base
     default :from => "you@example.com"

   def post_email(user)
    mail(:to => "#{user.name} <#{user.email}>", :subject => "Registered")
   end
 end

在你的帖子模型中

 after_create :send_email

 def send_email
   YourMailerName.post_email(self.user).deliver
 end

发送电子邮件非常慢,所以考虑将其放在后台工作中。

答案 1 :(得分:3)

您应该能够使用一种非常类似的方法来执行此操作。首先,在after_create模型中创建一个Post callback,其中包含:

after_create :send_user_notification

def send_user_notification
  UserMailer.post_creation_notification(user).deliver
end

您需要确保用户与帖子之间存在关联,并在post_creation_notification中创建UserMailer方法,就像您创建旧方法一样。也许值得指出的是,盲目地发射这样的电子邮件并不一定是最好的方法。它不仅会为请求添加额外的不必要时间,而且也不会以优雅可恢复的方式失败。您可能希望探索将要发送的电子邮件添加到要处理的队列(like this, for example),使用cron作业或其他内容,如果您正在创建的网站将看到除了非常轻的用途之外的其他任何内容。