2017-01-22 4 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 google.

Лучшая идея - использовать фиксированный адрес отправителя (например, свой собственный) и поместить исходный адрес в текст. Так работает большинство форм электронной почты.

Редактировать: Согласно 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