将电子邮件发送给包含来自单个记录的不同数据的多个收件人

时间:2014-08-15 14:38:50

标签: ruby-on-rails email ruby-on-rails-4

在我的应用程序中,我需要向供应商列表发送电子邮件。电子邮件只需包含与该供应商有关的信息。例如,橱柜详细信息和规格=橱柜供应商,地板详细信息和规格=地板供应商等。数据库中的所有信息都来自单个记录。这可能吗?到目前为止,RTFG(阅读谷歌)尚未成功。如果可能,我在哪里可以找到和/或开始寻找此文档。谢谢!

2 个答案:

答案 0 :(得分:0)

当然可能。两种方法:假设您没有为供应商定义模型,但只是从您正在谈论的记录中提取数据,您可以这样做:

class VendorMailer < ActionMailer::Base

  def self.send_mail(project)
    cabinet_vendor_mail.deliver(project)
    flooring_vendor_mail.deliver(project)
    # etc
  end

  def cabinet_vendor_mail(project)
    # set up your instance variables and send a mail using a view specific to this vendor type
  end

  # etc
end

这将是一个大锤子方法...更好的是开发供应商类,然后建立供应商和项目之间的关系。

然后,您可以拥有一个适当的供应商邮件程序,查看供应商类型并发送相应的邮件类型。

答案 1 :(得分:0)

发送电子邮件的最基本方式是使用Rails&#39; Action Mailer,http://guides.rubyonrails.org/action_mailer_basics.html。在您的情况下,您可能希望创建一个ActionMailer,它将处理要发送的各种模板,具体取决于您将它们发送给谁。所有这些都可以采用相同的变量,并在模板中使用它们,因为它们是不同的模板。

创建一个ActionMailer,它将容纳您的电子邮件发送方法。这些方法本身看起来一样,但这就是告诉Rails使用哪个模板。

class VendorMailer < ActionMailer::Base
  default from: 'notifications@example.com'

  def cabinet_email(vendor, specifications)
    @vendor = vendor
    @specifications = specifications
    mail(to: @vendor.email, subject: 'New Specifications')
  end

 def flooring_email(vendor, specifications)
    @vendor = vendor
    @specifications = specifications
    mail(to: @vendor.email, subject: 'New Specifications')
  end
end

现在为每个使用规范的方法创建一个模板。

应用/视图/ vendor_mailer / cabinet_email.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>New specifications for you, <%= @vendor.name %></h1>
    <ul>
        <li><%= @specification.floor.width %></li>
        <li>...</li>
  </body>
</html>

然后在你的控制器中循环播放并向所有需要通知的人发送各种电子邮件。

class SpecificationsController < ApplicationController
  def create
    @specifications = Specifications.new(params[:specifications])

    respond_to do |format|
      if @specifications.save
        # Tell the VendorMailer to send emails after save
        # Look up correct vendor before these calls!
        VendorMailer.cabinet_email(vendor_cabinet, @specifications).deliver
        VendorMailer.flooring_email(vendor_flooring, @specifications).deliver

        format.html { redirect_to(@specifications, notice: 'Specifications were successfully created.') }
        format.json { render json: @specifications, status: :created, location: @specifications }
      else
        format.html { render action: 'new' }
        format.json { render json: @specifications.errors, status: :unprocessable_entity }
      end
    end
  end
end

这些是一些基础,可以让你朝着正确的方向前进而不使用任何额外的宝石。