使用ActionMailer发送给Rails中的多个收件人

时间:2011-09-15 20:49:18

标签: ruby-on-rails-3 actionmailer

我正在尝试根据数据库中的布尔值发送多封电子邮件。该应用程序是一个简单的计划应用程序,用户可以将他们的班次标记为“replacement_needed”,这应该向所有请求接收这些电子邮件的用户发送电子邮件。麻烦的是,它似乎只发送到一封电子邮件。这是我目前的代码:

 def request_replacement(shift)
      @shift = shift
      @user = shift.user
      @recipients = User.where(:replacement_emails => true).all
      @url  = root_url
      @recipients.each do |r|
        @name = r.fname
        mail(:to => r.email,
           :subject => "A replacement clerk has been requested")
      end
  end

5 个答案:

答案 0 :(得分:70)

您可以像这样为多个收件人发送一封电子邮件。

def request_replacement(shift)
  @shift = shift
  @user = shift.user
  @recipients = User.where(:replacement_emails => true)
  @url  = root_url
  emails = @recipients.collect(&:email).join(",")
  mail(:to => emails, :subject => "A replacement clerk has been requested")
end

这会占用您的所有@recipients个电子邮件地址,并通过,加入。我想你也可以将一个数组传递给:to键,但不确定。

唯一的问题是您无法在模板中使用@name。 :(

答案 1 :(得分:58)

我遇到了同样的问题..不知道这笔交易是什么......我回避它:

而不是打电话

Mailer.request_replacement(shift).deliver 

来自我的控制器,

我在邮件程序中定义了一个类方法,然后调用它。然后,该方法将遍历列表并调用“n”次......这似乎有效

class Mailer

   def self.send_replacement_request(shift)
     @recipients = ...
     @recipients.each do |recipient|
       request_replacement(recipient, shift).deliver
     end
   end

   def request_replacement(recipient, shift)
     ...
     mail(...)
   end
end

并从控制器调用

Mailer.send_replacement_request(shift)

答案 2 :(得分:49)

在Rails指南(Action Mailer Basics)中,它针对多封电子邮件说明了以下内容:

  

电子邮件列表可以是一组电子邮件地址,也可以是一个字符串,地址以逗号分隔。

因此,"test1@gmail.com, test1@gmail.com"["test1@gmail.com", "test1@gmail.com"]都应该有效。

详情请见:http://guides.rubyonrails.org/action_mailer_basics.html

答案 3 :(得分:7)

阻止每位收件人查看其他电子邮件地址:

@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }

答案 4 :(得分:1)

我正在使用 Rails 5 并且我有相同的情况,电子邮件只发送给最后一个收件人,但它也是以纯文本形式发送的,而不是HTML电子邮件。

在尝试了一些建议之后,我最终以这种方式修复它:

邮件:

class BrochureMailer < ApplicationMailer
    default from: "info@site.com"

    def newsletter(sponsor, brochures_list)
        @sponsor = sponsor
        @brochures = brochures_list

        mail(
            to: @sponsor.email,
            subject: "Interesting subject!"
        )
    end
end

调用邮件程序的控制器:

class Admin::DashboardController < Admin::BaseController
    def send_newsletter
        sponsors = params[:sponsor_ids]
        brochures = params[:brochure_ids]

        sponsors = Sponsor.where(id: sponsors)
        brochures = Brochure.where(id: brochures).to_a

        # Send Newsletter email to the given Sponsors
        sponsors.each do |sponsor|
            BrochureMailer.newsletter(sponsor, brochures).deliver_later
        end

        redirect_back(fallback_location: admin_root_path, success: 'Newsletter sent!')
    end
end

在视图中,类似这样的内容:

<% @brochures.each do |brochure| %>
    <table width="280" border="0" cellpadding="0" cellspacing="0" align="left" valign="top" class="floater">
        <tr>
            <td align="center" valign="top">
                <a target="_blank" href="<%= brochure_url(brochure) %>">
                    <img border="0" vspace="0" hspace="0" src="<%= brochure.image.blank? ? 'default.png' : brochure.image.url(public: true) %>" width="250" height="142">
                    <b><%= brochure.title %></b>
                </a>
                <br>
                <%= brochure.description.truncate(60) %>
            </td>
        </tr>
    </table>
<% end %>

它就像一个魅力! 我不确定这是正确的方式还是最佳方式,但只是将其视为第二种可能性。

我希望它对其他人有用。