Ruby on rails Rails 3-放弃在ActionMailer操作中发送邮件

Ruby on rails Rails 3-放弃在ActionMailer操作中发送邮件,ruby-on-rails,actionmailer,ruby-on-rails-3,Ruby On Rails,Actionmailer,Ruby On Rails 3,我想知道如何有条件地放弃在ActionMailer操作中发送邮件 class SomeMailer < ActionMailer::Base ... def some_emails some_models = Model.where(:a => 1) if !some_models.blank? mail(...) else # What to add here? # render :nothing => true d

我想知道如何有条件地放弃在ActionMailer操作中发送邮件


class SomeMailer < ActionMailer::Base
  ...

  def some_emails
    some_models = Model.where(:a => 1)
    if !some_models.blank?
      mail(...)
    else
      # What to add here?
      # render :nothing => true doesn't work
    end
  end

end

类SomeMailer1)
如果!有些是空白的吗?
邮件(…)
其他的
#这里要补充什么?
#render:nothing=>true不起作用
结束
结束
结束
现在通过
SomeMailer.somee\u emails.deliver调用它返回一个

ArgumentError:发送邮件所需的发件人(返回路径、发件人或发件人)

将您的条件放在您呼叫某个邮件发件人的位置。某些电子邮件。发送

我也有同样的问题。在ActionMailer操作中没有真正的方法,因此我在cron任务中执行了以下操作:

 users.each do |user|
  begin
    UserMailer.event_second_reminder_group_user_email(user).deliver
    puts "  - sending reminder email to user #{user.email}"
  rescue
  end
end
puts "Complete!"

现在,如果抛出错误,它不会破坏应用程序

奇怪的是,使用Rails 3.1.rc4和WEBrick,它在我本地的WEBrick服务器上运行良好。但我一推到Heroku cedar stack,他们的WEBrick就抛出了

ArgumentError:发件人(返回路径、发件人或发件人)


您必须删除上述答案中所述的条件语句。这将修复它,使它也能在Heroku上工作,而不仅仅是在您的本地机器上

将perform\u deliveries设置为false,如下所示:

emails = get_email_list_somehow
if emails.present?
  mail options.merge(:bcc => emails)
else
  self.message.perform_deliveries = false
end

这将不会悄悄地尝试发送,并应阻止错误的发生

在Rails 3.2.9中,您最终可以有条件地调用
mail()
。这是相关的。现在,OP的代码可以按如下方式重新编写:

class SomeMailer < ActionMailer::Base
  ...

  def some_emails
    some_models = Model.where(:a => 1)
    unless some_models.blank?
      mail(...)
    end
  end

end
class SomeMailer1)
除非有些型号是空的?
邮件(…)
结束
结束
结束

好的-这是在计划程序中调用的,不是添加条件的最佳位置。请致电计划程序中的其他地方,在那里您可以提供这些条件,并从那里进行邮件呼叫。您会为每个型号发送一封电子邮件,还是发送一封包含所有型号列表的电子邮件?感谢优秀的Heroku支持人员的快速回复,我发现我之前的评论是错误的。如果在本地以生产模式运行WEBrick,则会出现相同的错误。因此,这不是Heroku的问题,而是本地开发和生产环境的不一致。当您发现错误所在时,请删除或更新您的帖子+1为了记住其他阅读+1如果您的项目无法进行重构以决定在Mailer类之外发送电子邮件(例如,对于延迟作业、cron作业等),则此解决方案有效。我同意-这是一个更好的解决方案。保持干燥,在一个地方检查。这应该是公认的答案。邮件中指定的原始问题,这是邮件中的最佳解决方案。我同意。起初,我对这种做法感到不安。然而,在Rails指南中有一个例子:通常不建议放置空白的rescue。我只想挽救可能提出的具体错误。