发送电邮的功能,如何实现?
以购物网站为例,当消费者下单后,系统会自动发封订单通知的电邮给消费者,说已经收到消费者的订单。这种发送电邮的功能,要如何实现呢?
我们需要7步。
Step1: 我们需要一个mailer,这里我们取名为OrderMailer
rails g mailer OrderMailer
运行结果如下,会产生mailers下的档案、views下的档案,以及test的文件
Step2: 定义好系统邮件的发送地址
app/mailers/application_mailer.rb档案中,将默认的发送地址,改成系统邮箱地址
default from: "service@jdstore.com"
Step3: 定义好一个method,用来执行“发订单通知”的行为
在第一步中产生的档案app/mailers/order_mailer.rb中,定义这个method,这里取名为 notify_order_placed(order)
def notify_order_placed(order)
@order = order
@order.user = order.user
mail(to: @order.user.email, from: "[JDStore] 感谢您完成本次下单,以下是您购物明细#{@order}")
end
Step4: 在消费者“下单”这个行为之后,执行上面的“发订单通知”这个行为
消费者“下单”这个行为,通常是已经在controller里定义的,此处的档案是app/controllers/orders_controller.rb。在这里,我们加上一行:OrderMailer.notify_order_placed(@order).deliver!
def create
@order = Order.new(order_params)
@order.save
OrderMailer.notify_order_placed(@order).deliver!
redirect_to order_path(@order)
end
Step5: 新增一个view文件,并写好寄送邮件里面的具体内容
touch app/views/order_mailer/notify_order_placed.html.erb
<h2>
订单明细<br>
<small><%= link_to("订单连结", order_url(@order))%></small>
</h2>
#略
Step6: 上面我们已经定义好了action, view。现在,我们需要有东西,复制传递、打开邮件。需要安装一个gem
gem "letter_opener", group: :development
Step7: 在config/environments/development.rb中,配置好设置,加入两行
config.action_mailer.default_url_options = { host: "localhost:3000: }
config.action_mailer.delivery_method = :letter_opener
bundle install
rails s
总结
完成以上7步,就创建了消费者下单后、系统自动发送通知邮件的功能,通知邮件部分截图如下: