Ruby on rails Rails应用程序在下订单和更改交付状态后不发送电子邮件,只是出现故障
我在建一家电子商店。客户可以购买物品,交易通过braintree进行,没有任何问题 但是当客户下订单时……事情就糟了。。。应用程序中断 rails给出了一个错误页面“很抱歉,出了点问题。” 这是来自服务器的Ruby on rails Rails应用程序在下订单和更改交付状态后不发送电子邮件,只是出现故障,ruby-on-rails,ruby,email,actionmailer,vps,Ruby On Rails,Ruby,Email,Actionmailer,Vps,我在建一家电子商店。客户可以购买物品,交易通过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:
.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'
这是订单控制器.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
同样,这种破坏与邮件的发送有关
这是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
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
下面是app/mailers/order\u通知程序
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
端口587通常是为SMTP保留的,因此您是对的:这与电子邮件有关:听起来好像配置的SMTP服务器没有启动并接受连接。解决这个问题,这个错误就会消失。好的,谢谢,然后我可以在VPS上安装类似于
Postfix
的东西吗?我以为这是全自动的,因为邮件是通过谷歌套装发送的\_(ツ)_/''我什么都用a。我也用Rails的东西。这比浪费时间戳AWS要容易得多。另外,使用延迟作业
或其他类似的gem来异步发送电子邮件,避免出现影响用户体验的错误/异常。好吧……谢谢……我做了一些挖掘……是否可能digitalOcean正在阻止587端口?在l照这个吃
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