Actionmailer не доставляет почту, с рельсами 3
Я пытаюсь создать приложение, которое отправляет электронное сообщение, когда пользователь регистрируется.
я вставляю параметры smtp для gmail в файле config/application.rb, а функция почты выглядит как
mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :content_type => "text/html")
теперь, когда я вижу журналы, я вижу, что он говорит, что почта отправлена, но я никогда не получаю почту вообще...
также, когда я вызываю функцию доставки почты, Emails.signed(@user).deliver
, страница формы не перенаправляется, но она работает, если я прокомментирую код отправки электронной почты, который является
Emails.signed(@user).deliver
или
mail(:to => "[email protected]", :subject => "Mail!", :from => "[email protected]", :content_type => "text/html")
Спасибо:)
Изменить: development.rb
App::Application.configure do
# Settings specified here will take precedence over those in config/environment.rb
# In the development environment your application code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the webserver when you make code changes.
config.cache_classes = false
# Log error messages when you accidentally call methods on nil.
config.whiny_nils = true
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_view.debug_rjs = true
config.action_controller.perform_caching = false
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
# Print deprecation notices to the Rails logger
config.active_support.deprecation = :log
end
Ответы
Ответ 1
Несколько поздно, но тем не менее, возможно, это спасет кого-то несколько часов головокружительных ударов. Вероятно, это относится только к отправке писем из gmail.
Во-первых, чтобы помочь отладить ситуацию, установите следующую строку в development.rb в true (если вы находитесь в режиме разработки):
config.action_mailer.raise_delivery_errors = true
Это заставит ActionMailer молча игнорировать ошибки.
Когда я это сделал, я понял, что gmail отказывается от имени пользователя и пароля.
Затем я перешел в конфигурационный файл, где я поместил все директивы конфигурации Action Mailer (для меня это было в development.rb, возможно, было лучшее место для него), и заметил, что: user_name было установлено как "admin", а не "[email protected]". Его изменение решило проблему. Вот моя исправленная часть development.rb:
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => 'thedomain.com',
:user_name => '[email protected]',
:password => '<password>',
:authentication => 'plain',
:enable_starttls_auto => true }
Литература:
http://forums.pragprog.com/forums/43/topics/541
http://edgeguides.rubyonrails.org/action_mailer_basics.html
Ответ 2
Еще одна вещь, которую вы не должны забывать: вы должны перезапустить приложение после внесения изменений в файлы конфигурации среды. при использовании пассажира это можно быстро пропустить:)
что решило мою "проблему", когда ActionMailer не захотела отправлять электронные письма без каких-либо ошибок.
Ответ 3
То, что написано здесь, мне не помогло.
Я использую Rails 3.2.8, и я потратил несколько часов, пытаясь понять это, и это было очень просто в конце. Я забыл называть .deliver()
для объекта Mail::Message
, возвращаемого вызовом метода mail(:to => @user.email, :subject => 'Welcome to the Site')
.
Просто оставьте все, как указано в официальном учебнике RoR.
То есть в файлах среды разработки/производственной среды создайте раздел, например:
# mailer
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
port: 587,
domain: 'gmail.com',
user_name: '<username>@gmail.com',
password: '<password>',
authentication: 'plain',
enable_starttls_auto: true
}
И тогда вы подклассом ActionMailer:: Base, например, следующим образом:
class InfoMailer < ActionMailer::Base
default from: "<username>@gmail.com"
def welcome_user_and_send_password(user, password)
default_url_options = self.default_url_options()
@user = user
@password = password
@url = default_url_options[:host]
mail(:to => @user.email, :subject => 'Welcome to the Site').deliver()
end
end
После этого вы можете просто использовать этот метод InfoMailer
из своего кода, как метод класса:
InfoMailer.welcome_user_and_send_password(user, password)
Ответ 4
Если вы используете тестовую среду, обязательно закомментируйте эту строку кода в средах /test.rb:
config.action_mailer.delivery_method = :test