Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 使用ActionMailer发送到Rails中的多个收件人_Ruby On Rails 3_Actionmailer - Fatal编程技术网

Ruby on rails 3 使用ActionMailer发送到Rails中的多个收件人

Ruby on rails 3 使用ActionMailer发送到Rails中的多个收件人,ruby-on-rails-3,actionmailer,Ruby On Rails 3,Actionmailer,我正试图根据数据库中的布尔值发送多封电子邮件。该应用程序是一个简单的日程安排应用程序,用户可以将其轮班标记为“需要更换”,这将向所有请求接收这些电子邮件的用户发送电子邮件。问题是,它似乎只发送到一封电子邮件。以下是我当前的代码: def request_replacement(shift) @shift = shift @user = shift.user @recipients = User.where(:replacement_emails =>

我正试图根据数据库中的布尔值发送多封电子邮件。该应用程序是一个简单的日程安排应用程序,用户可以将其轮班标记为“需要更换”,这将向所有请求接收这些电子邮件的用户发送电子邮件。问题是,它似乎只发送到一封电子邮件。以下是我当前的代码:

 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

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

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
这将获取所有
@收件人的
电子邮件地址,并与他们一起加入
。我想您也可以将数组传递给
:to
键,但不确定


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

我也有同样的问题。我不知道交易是什么。我回避了:

而不是打电话

Mailer.request_replacement(shift).deliver 
从我的控制器

我会在邮件器上定义一个类方法,并调用它。然后,该方法将遍历列表并调用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)

要防止每个收件人看到其他电子邮件地址,请执行以下操作:

@recipients.each{ |recipient| Mailer.request_replacement(recipient, shift).deliver }
在Rails指南(Action Mailer Basics)中,它对多封电子邮件做了如下说明:

电子邮件列表可以是电子邮件地址数组,也可以是地址用逗号分隔的单个字符串

所以两者都
”test1@gmail.com, test1@gmail.com“
[”test1@gmail.com", "test1@gmail.com“]
应该可以

更多信息请参见:

我使用的是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 %>
类手册Emailer
调用邮件程序的控制器:

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 %>
class Admin::DashboardController
在视图中,类似这样的内容:

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 %>


它就像一个符咒! 我不确定这是不是正确的方式,还是最理想的方法,只是把它当作第二种可能性。


我希望它能对其他人有用。

是的,但我真的不想公开每个用户的电子邮件地址……我想我找到了一个解决方案,将.each块移动到模型中,然后从那里调用deliver。如果是这样的话,是真的。你可以使用
bcc
field.FWIW,这在Amazon SES上似乎不起作用,因为它们是我们希望逗号作为分隔符(尽管在使用逗号而不是分号时可以使用逗号).Comma是正确的分隔符,而不是分号。只有AFAIK的Outlook使用Semico,并在生成最终电子邮件时将其转换为逗号。
bcc
是一种访问
的方法。我不想公开每个用户的电子邮件地址
,但由于这会隐藏收件人的地址,许多邮件服务会将邮件检测为垃圾邮件e call to#mail实际上并不发送电子邮件,它只是创建了邮件对象。在该邮件对象上调用#deliver会发送邮件对象。因此,在调用#deliver时只发送最后创建的邮件(可能是另一段代码)。我想我永远也想不到。谢谢!如果您不在controller中调用deliver方法,它甚至不会进入mailer方法。您也可以将它们添加为
bcc
,如下所示:
mail(:to=>”您的_email@domain.com“,:subject=>”已请求替换职员“,:bcc=>@recipients.map(&:email.join(“,”)
我只想指出,不需要您评论中的
加入
。action mailer可以接收电子邮件数组。这是最好的解决方案,它链接到官方文档。如果您想隐藏收件人,请使用密件抄送。