Rails 应用程序在下订单和更改交付状态后不发送电子邮件,它只是崩溃了
Rails app not sending emails after placing order and changing delivery status, it just breaks down
在我正在建设的 E 商店中。客户可以购买商品,交易通过 braintree 顺利进行。
但是当客户下订单时......事情变糟了......应用程序崩溃了。
rails 显示错误页面“很抱歉,出了点问题。”
这是来自服务器的.log
I, [2017-05-19T22:23:10.127481 #22752] INFO -- : Completed 500 Internal Server Error in 2695ms (ActiveRecord: 7.7ms)
F, [2017-05-19T22:23:10.129139 #22752] FATAL -- :
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587):
app/controllers/orders_controller.rb:35:in `create'
这里是 order_controller.rb
第 35 行是 OrderNotifier.received(@order).deliver
class OrdersController < ApplicationController
include CurrentCart
before_action :set_cart, only: [:new, :create]
before_action :set_order, only: [:show, :edit, :destroy]
def index
@orders = Order.all?
end
def new
@images = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]
@random_no = rand(5)
@random_image = @images[@random_no]
if @cart.product_items.empty?
redirect_to root_url, notice: 'Your Cart is Empty'
return
end
@order = Order.new
@client_token = Braintree::ClientToken.generate
@del_cost_euro = 20
end
def create
@order = Order.new(order_params)
if @order.save
charge
if @result.success?
@order.add_product_items_from_cart(@cart)
Cart.destroy(session[:cart_id])
session[:cart_id] = nil
OrderNotifier.received(@order).deliver #this is line 35
redirect_to root_url, notice: 'Thank You for Your Order'
else
flash[:error] = 'Please Check Your Cart'
redirect_to root_url, alert: @result.message
@order.destroy
end
else
@client_token = Braintree::ClientToken.generate
render :new
end
end
def show
end
def destroy
@order.destroy
redirect_to root_url, notice: 'Order deleted'
end
private
def set_order
@order = Order.find(params[:id])
end
def order_params
params.require(:order).permit(:name, :email, :address, :city, :country, :pick_up, :delivery)
end
def charge
@result = Braintree::Transaction.sale(
amount: @cart.total_price_usd,
payment_method_nonce: params[:payment_method_nonce] )
end
end
后台我用的是activeadmin
...下订单后,我可以在后台的订单面板看到订单,但是当我想改变shipped
从 false
到 true
应用程序再次中断...
客户应该会收到一封关于正在发货的订单的邮件.. 但它从未发送过
error log
说
I, [2017-05-20T13:50:26.645335 #19043] INFO -- : Completed 500 Internal Server Error in 23ms (ActiveRecord: 2.6ms)
F, [2017-05-20T13:50:26.646495 #19043] FATAL -- :
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587):
app/admin/order.rb:6:in `block (2 levels) in <top (required)>'
再次中断与邮件发送有关。
这里是 app/admin/order.rb
ActiveAdmin.register Order do
permit_params :shipped
after_update do |order|
OrderNotifier.shipped(@order).deliver if order.shipped # Again the error is happening in the OrderNotifier
end
show do |order|
panel 'Customer Details' do
attributes_table_for order, :name, :email, :address, :city, :country, :created_at
end
panel 'Created ' do
"#{time_ago_in_words order.created_at} ago"
end
panel 'Shipped ' do
order.shipped
end
panel 'Order Details' do
table_for(order.product_items) do
column 'Product' do |item|
item.product.title
end
column 'Quantity' do |item|
item.quantity
end
column 'Price Isl' do |item|
number_to_currency item.total_price_isl
end
column 'Price USD' do |item|
number_to_currency item.total_price_usd
end
end
end
panel 'Order Total USD' do
number_to_currency order.total_price_usd
end
panel 'Order Total Iskr' do
number_to_currency order.total_price_isl
end
end
end
所以这里是 app/mailers/order_notifier
class OrderNotifier < ApplicationMailer
default from: 'Hlín Reykdal Concept Store <store@hlinreykdal.com>'
def received(order)
@order = order
mail to: order.email, subject: 'Hlín Reykdal Concept Store'
end
def shipped(order)
@order = order
mail to: order.email, subject: 'Order Shipped'
end
end
这里是 app/config/environment/production.rb
Rails.application.configure do
config/application.rb.
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.assets.js_compressor = :uglifier
config.assets.compile = true
config.assets.digest = true
config.assets.initialize_on_precompile = false
config.log_level = :debug
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.active_record.dump_schema_after_migration = false
config.action_mailer.default_url_options = { host: 'hlinreykdal.com'}
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: ENV["SMTP_ADDRESS"],
user_name: ENV["SMTP_USER"],
password: ENV["SMTP_PASSWORD"],
domain: "hlinreykdal.com",
port: 587,
authentication: :login,
enable_starttls_auto: true
}
Braintree::Configuration.environment = :production
Braintree::Configuration.merchant_id = ENV['merchant_id']
Braintree::Configuration.public_key = ENV['public_key']
Braintree::Configuration.private_key = ENV['private_key']
end
端口 587 通常为 SMTP 保留,所以您是对的:这是与电子邮件相关的:听起来配置的 SMTP 服务器未启动并接受连接。解决这个问题,这个错误就会消失。
在我正在建设的 E 商店中。客户可以购买商品,交易通过 braintree 顺利进行。
但是当客户下订单时......事情变糟了......应用程序崩溃了。
rails 显示错误页面“很抱歉,出了点问题。”
这是来自服务器的.log
I, [2017-05-19T22:23:10.127481 #22752] INFO -- : Completed 500 Internal Server Error in 2695ms (ActiveRecord: 7.7ms)
F, [2017-05-19T22:23:10.129139 #22752] FATAL -- :
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587):
app/controllers/orders_controller.rb:35:in `create'
这里是 order_controller.rb
第 35 行是 OrderNotifier.received(@order).deliver
class OrdersController < ApplicationController
include CurrentCart
before_action :set_cart, only: [:new, :create]
before_action :set_order, only: [:show, :edit, :destroy]
def index
@orders = Order.all?
end
def new
@images = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]
@random_no = rand(5)
@random_image = @images[@random_no]
if @cart.product_items.empty?
redirect_to root_url, notice: 'Your Cart is Empty'
return
end
@order = Order.new
@client_token = Braintree::ClientToken.generate
@del_cost_euro = 20
end
def create
@order = Order.new(order_params)
if @order.save
charge
if @result.success?
@order.add_product_items_from_cart(@cart)
Cart.destroy(session[:cart_id])
session[:cart_id] = nil
OrderNotifier.received(@order).deliver #this is line 35
redirect_to root_url, notice: 'Thank You for Your Order'
else
flash[:error] = 'Please Check Your Cart'
redirect_to root_url, alert: @result.message
@order.destroy
end
else
@client_token = Braintree::ClientToken.generate
render :new
end
end
def show
end
def destroy
@order.destroy
redirect_to root_url, notice: 'Order deleted'
end
private
def set_order
@order = Order.find(params[:id])
end
def order_params
params.require(:order).permit(:name, :email, :address, :city, :country, :pick_up, :delivery)
end
def charge
@result = Braintree::Transaction.sale(
amount: @cart.total_price_usd,
payment_method_nonce: params[:payment_method_nonce] )
end
end
后台我用的是activeadmin
...下订单后,我可以在后台的订单面板看到订单,但是当我想改变shipped
从 false
到 true
应用程序再次中断...
客户应该会收到一封关于正在发货的订单的邮件.. 但它从未发送过
error log
说
I, [2017-05-20T13:50:26.645335 #19043] INFO -- : Completed 500 Internal Server Error in 23ms (ActiveRecord: 2.6ms)
F, [2017-05-20T13:50:26.646495 #19043] FATAL -- :
Errno::ECONNREFUSED (Connection refused - connect(2) for nil port 587):
app/admin/order.rb:6:in `block (2 levels) in <top (required)>'
再次中断与邮件发送有关。
这里是 app/admin/order.rb
ActiveAdmin.register Order do
permit_params :shipped
after_update do |order|
OrderNotifier.shipped(@order).deliver if order.shipped # Again the error is happening in the OrderNotifier
end
show do |order|
panel 'Customer Details' do
attributes_table_for order, :name, :email, :address, :city, :country, :created_at
end
panel 'Created ' do
"#{time_ago_in_words order.created_at} ago"
end
panel 'Shipped ' do
order.shipped
end
panel 'Order Details' do
table_for(order.product_items) do
column 'Product' do |item|
item.product.title
end
column 'Quantity' do |item|
item.quantity
end
column 'Price Isl' do |item|
number_to_currency item.total_price_isl
end
column 'Price USD' do |item|
number_to_currency item.total_price_usd
end
end
end
panel 'Order Total USD' do
number_to_currency order.total_price_usd
end
panel 'Order Total Iskr' do
number_to_currency order.total_price_isl
end
end
end
所以这里是 app/mailers/order_notifier
class OrderNotifier < ApplicationMailer
default from: 'Hlín Reykdal Concept Store <store@hlinreykdal.com>'
def received(order)
@order = order
mail to: order.email, subject: 'Hlín Reykdal Concept Store'
end
def shipped(order)
@order = order
mail to: order.email, subject: 'Order Shipped'
end
end
这里是 app/config/environment/production.rb
Rails.application.configure do
config/application.rb.
config.cache_classes = true
config.eager_load = true
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?
config.assets.js_compressor = :uglifier
config.assets.compile = true
config.assets.digest = true
config.assets.initialize_on_precompile = false
config.log_level = :debug
config.i18n.fallbacks = true
config.active_support.deprecation = :notify
config.log_formatter = ::Logger::Formatter.new
config.active_record.dump_schema_after_migration = false
config.action_mailer.default_url_options = { host: 'hlinreykdal.com'}
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: ENV["SMTP_ADDRESS"],
user_name: ENV["SMTP_USER"],
password: ENV["SMTP_PASSWORD"],
domain: "hlinreykdal.com",
port: 587,
authentication: :login,
enable_starttls_auto: true
}
Braintree::Configuration.environment = :production
Braintree::Configuration.merchant_id = ENV['merchant_id']
Braintree::Configuration.public_key = ENV['public_key']
Braintree::Configuration.private_key = ENV['private_key']
end
端口 587 通常为 SMTP 保留,所以您是对的:这是与电子邮件相关的:听起来配置的 SMTP 服务器未启动并接受连接。解决这个问题,这个错误就会消失。