在生产 ROR 中通过 actionmailer 发送邮件的严重问题
serious problems sending mails via actionmailer in production ROR
我真的需要帮助,我已经尝试解决这个问题 3 天了:(
我的应用程序应该在收到或发货时向客户发送电子邮件,但它经常因此错误而中断。
I, [2017-05-23T11:01:44.741054 #1060] INFO -- : Completed 500 Internal Server Error in 66ms (ActiveRecord: 4.2ms)
F, [2017-05-23T11:01:44.743481 #1060] FATAL -- :
SocketError (getaddrinfo: Name or service not known):
app/admin/order.rb:6:in `block (2 levels) in <top (required)>'
我的actionmailer
设置似乎是正确的:
config.action_mailer.default_url_options = { host: 'mypage.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"].inspect,
user_name: ENV["SMTP_USER"],
password: ENV["SMTP_PASSWORD"],
domain: "mypage.com",
port: 587,
authentication: :login,
enable_starttls_auto: true
}
ENV
变量存储在application.yml
SMTP_ADDRESS: "smtp.gmail.com"
SMTP_USER: "xxx@xxxxxxxxxx.com"
SMTP_PASSWORD: "xxxxxxxx"
ENV
变量已被运行检查:
Loading production environment (Rails 4.2.5)
irb(main):001:0> puts ENV["SMTP_ADDRESS"].inspect
"smtp.gmail.com"
=> nil
irb(main):002:0>
我已经 host smtp.gmail.com
取得了积极的成果:
smtp.gmail.com is an alias for gmail-smtp-msa.l.google.com.
gmail-smtp-msa.l.google.com has address 74.125.206.108
gmail-smtp-msa.l.google.com has address 74.125.206.109
gmail-smtp-msa.l.google.com has IPv6 address 2a00:1450:400c:c04::6d
我已经完成了telnet smtp.gmail.com 587
:
Trying 74.125.206.108...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP c17sm3264999wre.35 - gsmtp
我也做过nslookup smtp.gmail.com
:
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
smtp.gmail.com canonical name = gmail-smtp-msa.l.google.com.
Name: gmail-smtp-msa.l.google.com
Address: 74.125.206.108
Name: gmail-smtp-msa.l.google.com
Address: 74.125.206.109
我 运行 在这里没有选择,这在本地完美运行 config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
但在部署后 actionmailer
中断。
在我的 google 帐户中,我已经 https://accounts.google.com/DisplayUnlockCaptcha
并启用了 less secure apps
但运气不好。
下面是 admin/order.rb
第 6 行出现的错误。
ActiveAdmin.register Order do
permit_params :shipped
after_update do |order|
OrderNotifier.shipped(@order).deliver if order.shipped #this is line 6.
end
show do |order|
panel 'Customer Details' do
attributes_table_for order, :name, :email, :address, :city, :country
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
这里是 mailer/order_notifier.rb
class OrderNotifier < ApplicationMailer
default from: 'Concept Store <mail@mypage.com>'
def received(order)
@order = order
mail to: order.email, subject: 'Concept Store'
end
def shipped(order)
@order = order
mail to: order.email, subject: 'Order Shipped'
end
end
不知道是不是像下面这样简单:
config.action_mailer.smtp_settings = {
# address: ENV["SMTP_ADDRESS"].inspect,
address: ENV["SMTP_ADDRESS"],
# ...
}
因为 inspect
将引号添加到字符串中(见下文):
puts "somestring"
# => somestring
puts "somestring".inspect
# => "somestring"
我真的需要帮助,我已经尝试解决这个问题 3 天了:( 我的应用程序应该在收到或发货时向客户发送电子邮件,但它经常因此错误而中断。
I, [2017-05-23T11:01:44.741054 #1060] INFO -- : Completed 500 Internal Server Error in 66ms (ActiveRecord: 4.2ms)
F, [2017-05-23T11:01:44.743481 #1060] FATAL -- :
SocketError (getaddrinfo: Name or service not known):
app/admin/order.rb:6:in `block (2 levels) in <top (required)>'
我的actionmailer
设置似乎是正确的:
config.action_mailer.default_url_options = { host: 'mypage.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"].inspect,
user_name: ENV["SMTP_USER"],
password: ENV["SMTP_PASSWORD"],
domain: "mypage.com",
port: 587,
authentication: :login,
enable_starttls_auto: true
}
ENV
变量存储在application.yml
SMTP_ADDRESS: "smtp.gmail.com"
SMTP_USER: "xxx@xxxxxxxxxx.com"
SMTP_PASSWORD: "xxxxxxxx"
ENV
变量已被运行检查:
Loading production environment (Rails 4.2.5)
irb(main):001:0> puts ENV["SMTP_ADDRESS"].inspect
"smtp.gmail.com"
=> nil
irb(main):002:0>
我已经 host smtp.gmail.com
取得了积极的成果:
smtp.gmail.com is an alias for gmail-smtp-msa.l.google.com.
gmail-smtp-msa.l.google.com has address 74.125.206.108
gmail-smtp-msa.l.google.com has address 74.125.206.109
gmail-smtp-msa.l.google.com has IPv6 address 2a00:1450:400c:c04::6d
我已经完成了telnet smtp.gmail.com 587
:
Trying 74.125.206.108...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.
220 smtp.gmail.com ESMTP c17sm3264999wre.35 - gsmtp
我也做过nslookup smtp.gmail.com
:
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
smtp.gmail.com canonical name = gmail-smtp-msa.l.google.com.
Name: gmail-smtp-msa.l.google.com
Address: 74.125.206.108
Name: gmail-smtp-msa.l.google.com
Address: 74.125.206.109
我 运行 在这里没有选择,这在本地完美运行 config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
但在部署后 actionmailer
中断。
在我的 google 帐户中,我已经 https://accounts.google.com/DisplayUnlockCaptcha
并启用了 less secure apps
但运气不好。
下面是 admin/order.rb
第 6 行出现的错误。
ActiveAdmin.register Order do
permit_params :shipped
after_update do |order|
OrderNotifier.shipped(@order).deliver if order.shipped #this is line 6.
end
show do |order|
panel 'Customer Details' do
attributes_table_for order, :name, :email, :address, :city, :country
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
这里是 mailer/order_notifier.rb
class OrderNotifier < ApplicationMailer
default from: 'Concept Store <mail@mypage.com>'
def received(order)
@order = order
mail to: order.email, subject: 'Concept Store'
end
def shipped(order)
@order = order
mail to: order.email, subject: 'Order Shipped'
end
end
不知道是不是像下面这样简单:
config.action_mailer.smtp_settings = {
# address: ENV["SMTP_ADDRESS"].inspect,
address: ENV["SMTP_ADDRESS"],
# ...
}
因为
inspect
将引号添加到字符串中(见下文):puts "somestring" # => somestring puts "somestring".inspect # => "somestring"