2017-01-22 77 views
0

我想要生成一个表单,以便访问者可以发送电子邮件到一个固定的地址而不会混乱数据库。当我测试的形式,轨道返回该错误......Rails通过actionmailer和activemodel给我发电子邮件,SMTPAuthenticationError

Net::SMTPAuthenticationError in ContactsController#create 

看来,答案是允许访问Gmail的安全性较低的应用程序。我如何在不降低安全性的情况下保留功能?

控制器/ contacts_controller.rb

class ContactsController < ApplicationController 
    def new 
    @contact = Contact.new 
    end 

    def create 
    @contact = Contact.new(params[:contact]) 
    if @contact.valid? 
     ContactMailer.contact_submit(@contact).deliver 
     flash[:notice] = "Thank you for your email, I'll respond shortly" 
     redirect_to new_contact_path 
    else 
     render :new 
    end 
    end 
end 

寄件人/ contact_mailer.rb

class ContactMailer < ActionMailer::Base 
    default to: "#{ENV['GMAIL_USERNAME']}@gmail.com" 

    def contact_submit(msg) 
    @msg = msg 
    mail(from: @msg.email, name: @msg.name, message: @msg.message) 
    end 
end 

模型/ contact.rb

class Contact 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 

    attr_accessor :name, :email, :message 

    validates_format_of :email, :with => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i 
    validates_presence_of :message 
    validates_presence_of :name 

    def initialize(attributes = {}) 
    attributes.each do |name, value| 
     send("#{name}=", value) 
    end 
    end 

    def persisted? 
    false 
    end 
end 

配置/环境/ development.rb

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } 
    config.action_mailer.delivery_method = :smtp 
    config.action_mailer.perform_deliveries = true 
    config.action_mailer.default :charset => 'utf-8' 
    config.action_mailer.smtp_settings = { 
    address: 'smtp.gmail.com', 
    port: 587, 
    domain: 'localhost:3000', 
    user_name: ENV['GMAIL_USERNAME'], 
    password: ENV['GMAIL_PASSWORD'], 
    authentication: 'plain', 
    enable_starttls_auto: true 
    } 

配置/环境/ production.rb

config.action_mailer.default_url_options = { host: ENV['WEBSITE'] } 
    config.action_mailer.delivery_method = :smtp 
    config.action_mailer.smtp_settings = { 
    address: 'smtp.gmail.com', 
    port: 587, 
    domain: ENV['WEBSITE'], 
    user_name: ENV['GMAIL_USERNAME'], 
    password: ENV['GMAIL_PASSWORD'], 
    authentication: 'plain', 
    enable_starttls_auto: true 
    } 

回答

1

你配置SMTP Settings in ActiveMailer

此外,当您仅使用谷歌smtp服务器的随机电子邮件地址时,您很可能会遇到垃圾邮件问题。

更好的主意是使用固定的发件人地址(例如您自己的地址)并将原始地址放在文本中。这就是大多数电子邮件表单的工作原理

编辑:根据another StackOverflow answer,您需要在您的电子邮件设置中启用安全性较低的应用程序。

+0

我记得当我试图邮寄到我自己的Gmail地址时遇到类似的问题。 IIRC与G安全设置有关,是的。我使用Mailtrap等免费邮件服务解决了这个问题。这对你来说是一种选择吗? Mailtrap捕获您从应用发送的所有邮件。 – Mauddev

+0

我配置了stmp设置,代码在上面列出。我还使用了一个固定的电子邮件地址,它位于我的env文件中,并在上面的代码中作为ENV常量引用。 –

+0

那么你是否已经在GMail帐户中配置了你的设置?到此SO回答:http://stackoverflow.com/questions/25872389/rails-4-how-to-correctly-configure-smtp-settings-gmail#answer-32019587 – leifg

相关问题