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可以接收电子邮件数组。这是最好的解决方案,它链接到官方文档。如果您想隐藏收件人,请使用密件抄送。