Подтвердить что ты не робот

Отправка почты с помощью Rails 3 в среде разработки

Я уверен, что об этом спрашивали миллионы раз, но я не могу найти ничего, что работает для меня, поэтому я снова спрашиваю!

Мне просто нужен способ отправки писем с помощью ActionMailer в rails 3. Я следил за многочисленными учебниками, включая учебник Railscasts о новом ActionMailer, и я могу видеть созданные письма, но я их не получаю.

Я пробовал кучу разных способов, но они обычно сводятся к настройке следующих параметров

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

Я пробовал приведенный выше код (с достоверными данными gmail, конечно) в моем config/environment.rb, config/environment/development.rb и в настоящее время имею его в своем собственном инициализаторе config/initialisers/setup_mail.rb

Я также пробовал с несколькими различными SMTP-серверами, включая Gmail и Sendgrid, соответственно настраивая параметры smtp, но все равно ничего. Я могу видеть почту в терминале и журнале разработки и что он.

Кто-нибудь знает о какой-либо другой ошибке, которую я, возможно, пропустил, нужно настроить для ActionMailer? В противном случае, есть ли способ получить больше информации о том, почему письма не отправляются? У меня

config.action_mailer.raise_delivery_errors = true

в моем config/development.rb, но журнал разработки все еще показывает то же самое, что и в терминале.

Для чего это стоит, я разрабатываю ноутбук Ubuntu 10.04 на случай, если для этого потребуется какая-то конкретная настройка.

Большое спасибо

4b9b3361

Ответ 1

Ну, я решил проблему, но почему это работает, а другие методы этого не делают, я не знаю.

Решением было создать инициализатор в config/initialisers/setup_mail.rb, содержащий следующие

if Rails.env != 'test'
  email_settings = YAML::load(File.open("#{Rails.root.to_s}/config/email.yml"))
  ActionMailer::Base.smtp_settings = email_settings[Rails.env] unless email_settings[Rails.env].nil?
end

Затем я добавил config/email.yml, содержащий сведения об учетных записях dev и production.

development:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true
production:
  :address: smtp.gmail.com
  :port: 587
  :authentication: plain
  :user_name: xxx
  :password: yyy
  :enable_starttls_auto: true

Как я уже сказал, не знаю, почему, но это, похоже, это трюк. Спасибо всем за указатели

Ответ 2

У меня есть следующее в config/environments/development.rb

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

Фактическая почтовая конфигурация, config.actionmailer.* i, помещена в config\application.rb.

Надеюсь, что это поможет:)

Ответ 3

Попробуйте использовать "sendmail" вместо "smtp".

ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

Ответ 4

Три вещи.

Во-первых, порт является целым числом и не нуждается в кавычках, как в первом примере. (Но я думаю, что строка должна работать.)

Во-вторых, не забудьте перезапустить свой сервер каждый раз, когда вы изменяете этот (или любой) файл инициализатора. Это может объяснить, почему вы не заметили ошибку после добавления:

config.action_mailer.raise_delivery_errors = true

Без этого сообщения об ошибке трудно определить, почему почта не была, но теперь. Одна из возможностей - использование двойных кавычек вокруг пароля. Если вы использовали сильный пароль и имели токен в своем пароле, который не был сбежал, он мог быть переинтерпретирован. (т.е. "[email protected]\0rd" станет [email protected]). Именно по этой причине я всегда использую одинарные кавычки в моем коде, если я специально не нуждаюсь в синтаксическом сахаре.

Наконец, enable_starttls_auto: true является стандартным и ненужным.

Ответ 5

Просто поместите всю конфигурацию в: конфигурации/среда/development.rb

Я имею в виду

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => "587",
  :domain               => "gmail.com",
  :user_name            => "[email protected]il.com",
  :password             => "yyy",
  :authentication       => "plain",
  :enable_starttls_auto => true
}

и

config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true

Это сработало для меня.

Ответ 6

ActionMailer::Base.delivery_method = :sendmail
и
config.action_mailer.perform_deliveries = true

были двумя необходимыми шагами, которые привели меня к этой проблеме