Net::SMTPAuthenticationError (530-5.5.1 Требуется аутентификация. Подробнее на):

Я следую Руководству по Rails в Главе 10. Поскольку у меня нет кредитной карты, я пытаюсь отправить электронное письмо в процессе разработки. Я новичок в программировании, поэтому я просто хочу посмотреть, как это работает.

Но я получаю эту ошибку.

    Net::SMTPAuthenticationError (530-5.5.1 Authentication Required. Learn more at
    ):
      app/models/user.rb:65:in `send_password_reset_email'
      app/controllers/password_resets_controller.rb:13:in `create'

  Rendered /home/budi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_source.erb (5.3ms)
  Rendered /home/budi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_trace.html.erb (2.6ms)
  Rendered /home/budi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_request_and_response.html.erb (1.1ms)
  Rendered /home/budi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/_web_console.html.erb (0.9ms)
  Rendered /home/budi/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/web-console-2.0.0.beta3/lib/action_dispatch/templates/rescues/diagnostics.html.erb within rescues/layout (30.9ms)

Может ли кто-нибудь показать мне, где я пропустил?

development.rb

  config.cache_classes = false
  config.eager_load = false
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false
  config.action_mailer.perform_deliveries = true
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :domain               => 'mail.google.com',
    :user_name            => ENV['#I hardcoded it here'], # I put my my email which I used regularly here.
    :password             => ENV['#I hardcoded it here'], # I put the password here.
    :authentication       => 'plain',
    :enable_starttls_auto => true
  }

  config.active_support.deprecation = :log
  config.active_record.migration_error = :page_load
  config.assets.debug = true
  config.assets.digest = true
  config.assets.raise_runtime_errors = true

user_mailer.rb

class UserMailer < ApplicationMailer
  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end

  def password_reset(user)
    @user = user
    mail to: user.email, subject: "Password reset"
  end
end

application_mailer.rb

class ApplicationMailer < ActionMailer::Base
  #default from: "from@example.com"
  default from: "xxxxxx@gmail.com" # I put my my email which I used regularly here.
  layout 'mailer'
end

password_reset_controller.rb

class PasswordResetsController < ApplicationController
  before_action :get_user,         only: [:edit, :update]
  before_action :valid_user,       only: [:edit, :update]
  before_action :check_expiration, only: [:edit, :update]

  def new
  end

  def create
    @user = User.find_by(email: params[:password_reset][:email].downcase)
    if @user
        @user.create_reset_digest
        @user.send_password_reset_email
        flash[:info] = "Email sent with password reset instructions"
        redirect_to root_url
    else
        flash.now[:danger] = "Email address not found"
        render 'new'
    end
  end

  def edit
  end

  def update
    if params[:user][:password].empty?
        @user.errors.add(:password, "can't be empty")
        render 'edit'
    elsif @user.update_attributes(user_params)
        log_in @user
        flash[:success] = "Password has been reset."
        redirect_to @user
    else
        render 'edit'
    end

  end

  private

  def user_params
    params.require(:user).permit(:password, :password_confirmation)
  end

  def get_user
    @user = User.find_by(email: params[:email])
  end

  # Confirms a valid user.
  def valid_user
    unless (@user && @user.activated? && @user.authenticated?(:reset, params[:id]))
        redirect_to root_url
    end
  end

  # Checks expiration of reset token.
  def check_expiration
    if @user.password_reset_expired?
        flash[:danger] = "Password reset has expired."
        redirect_to new_password_reset_url
    end
  end
end

2 ответа

Решение

Я хотел бы предложить вам продолжить

Определенно помог бы Вам

Изменить обновление

Разрешить менее защищенным приложениям доступ к аккаунтам

Google может блокировать попытки входа в некоторые приложения или устройства, которые не используют современные стандарты безопасности. Поскольку эти приложения и устройства легче взломать, их блокировка помогает обеспечить безопасность вашей учетной записи.

Вот некоторые примеры приложений, которые не поддерживают новейшие стандарты безопасности:

  • Приложение Почта на вашем iPhone или iPad с iOS 6 или ниже Приложение Почта

  • на вашем телефоне Windows Phone, предшествующем версии 8.1

  • такие клиенты, как Microsoft Outlook и Mozilla Thunderbird

Надеюсь, вы не установите имя пользователя и пароль в переменной среды ENV вместо этого ты пишешь это ENV["the actual user name"]

так что это не прошло.

и попробуйте gmail.com, если вы хотите отправить его через Gmail

Ты можешь использовать

config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :domain               => "gmail.com",
    :user_name            => "test@gmail.com" #your gmail id
    :password             => "1234" #your gmail password
    :authentication       => :plain,
    :enable_starttls_auto => true
  }

или если вы хотите установить пароль в env

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

Если вы знакомы с Unix, у вас, вероятно, был опыт установки переменных среды. Переменные среды Unix обычно устанавливаются в файле, который читается при запуске интерактивной оболочки (файл ~/.bashrc для оболочки bash).

Для оболочки bash отредактируйте файл ~/.bashrc и добавьте:

export GMAIL_USERNAME="myname@gmail.com" 
export GMAIL_PASSWORD="mypassword"
Другие вопросы по тегам