Rails Actionmailer 发送多个收件人

5

我在Rails中遇到了一个问题,无法同时向多个用户发送电子邮件。当管理员批准与他们匹配的询问时,我正在尝试向注册了我的网站的多个场馆发送通知。

待处理的询问必须由管理员批准。当触发电子邮件时,邮件程序会传递@enquiry。在这里,我们可以看到我的Enquiries控制器

def approve
    @enquiry.approve
    redirect_to [:admin, @enquiry], notice: 'Enquiry is approved.'
    SupplierMailer.new_enquiry(@enquiry).deliver
 end

在我的Supplier_mailer.rb中,我有这个方法:
    def new_enquiry(enquiry)
      @enquiry = enquiry
      @enquiry.venues.each do |venue|
        mail(to: venue.supplier.user.email, subject: 'You have a new enquiry')
      end
    end

目前它只发送到一个电子邮件地址,所以循环不正常。

模型:

Enquiry 
  has_and_belongs_to_many :venues

Supplier
  has_many :venues
  has_one :user

我做错了什么?

谢谢

1个回答

13

new_enquiry方法应该构建一封电子邮件,然后使用deliver方法发送。循环运行正确,但每次调用邮件时都会覆盖其先前的调用,并且该方法返回最后一次调用。

相反,首先获取收件人列表,并将其用作to属性。

emails = @enquiry.venues.map {|venue| venue.supplier.user.email}
mail(to: emails, subject: 'You have a new enquiry')
如果你不想通过发送其他电子邮件来相互联系的话,你需要将 Mailer 动作放置在循环内部:

如果您对相互发送其他电子邮件不满意,则需要在循环内部放置 Mailer 动作:

def approve
  @enquiry.approve
  redirect_to [:admin, @enquiry], notice: 'Enquiry is approved.' 
  @enquiry.venues.each do |venue|
    SupplierMailer.new_enquiry(@enquiry, venue).deliver
  end
end

def new_enquiry(enquiry, venue)
  @enquiry = enquiry
  mail(to: venue.supplier.user.email, subject: 'You have a new enquiry')
end

最后一种选项相当巧妙,但提供了最佳的接口:

class SupplierMailer << ActionMailer::Base

  def self.new_enquiry(enquiry)
    @enquiry = enquiry
    mails = @enquiry.venues.map do |venue|
      mail(to: venue.supplier.user.email, subject: 'You have a new enquiry')
    end
    class << mails
      def deliver
        each(&:deliver)
      end
    end
    mails
  end

非常好,谢谢。我使用了你给的第二个选项,完美地运行。 - Ralph King
大家好,我有一个类似的问题,并想要在这个解决方案上提出一个跟进问题。使用类供应商邮件器的代码,您如何获取@enquiry.venues.map do |venue|等值以在模板上呈现。我的设置类似,但我的text.erb文件无法正确呈现,因为数组内的变量不是实例变量,因此它们不会传递过去。您是否遇到过这个问题? - Dan Rubio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接