我有一个rails 4 app。我设置了ActionMailer,我可以通过localhost和gmail发送订单确认电子邮件。
我在Heroku上安装了Sendgrid并按照设置说明操作。我得到Net::SMTPSyntaxError (501 Syntax error
my environment.rb(我在application.yml中有sendgrid用户/ pwd)
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
生产中的.rb - 我唯一的actionamailer设置就是这个。我有这个作为占位符,以便在以后放置真正的域名。我目前正在使用herokuapp.com。
config.action_mailer.default_url_options = { host: 'localhost:3000' }
在订单创建方法中的orders_controller中,我调用下面的内容。
AutoNotifier.orderconf_email(current_user, @order).deliver
auto_notifier.rb
class AutoNotifier < ActionMailer::Base
default from: "Test Email"
def orderconf_email(current_user, order)
@buyer = current_user
@order = order
mail(to: @buyer.email, subject: 'Thank you for your order.')
end
end
我错过了什么?它适用于使用gmail的localhost,因此我在sendgrid设置或production.rb文件的default_url中遗漏了一些内容。
答案 0 :(得分:23)
对于后代,这是Heroku上Rails中外部SMTP的工作设置:
#config/environments/production.rb
config.action_mailer.smtp_settings = {
:address => "smtp.sendgrid.net",
:port => 587, # ports 587 and 2525 are also supported with STARTTLS
:enable_starttls_auto => true, # detects and uses STARTTLS
:user_name => ENV["SENDGRID_USERNAME"],
:password => ENV["SENDGRID_PASSWORD"], # SMTP password is any valid API key, when user_name is "apikey".
:authentication => 'login',
:domain => 'yourdomain.com', # your domain to identify your server when connecting
}
答案 1 :(得分:4)
将default from: "Test Email"
更改为有效的电子邮件地址,甚至是example@example.com
。
答案 2 :(得分:0)
我想指出,这是通过SMTP发送电子邮件。虽然这种方法完全没问题,但您还应该考虑通过API发送。
为此,您需要指定一个拦截器。幸运的是,有一个宝石可以帮助你。这是一篇很好的文章,展示了如何使用它。
https://rubyplus.com/articles/561-Sending-Emails-using-SendGrid-API-in-Rails-4-1