#ruby-on-rails #actionmailer
#ruby-on-rails #actionmailer
Вопрос:
Я пытаюсь отправить почту с помощью actionmailer в приложении Rails 3.0.1. Вот моя настройка
config/initializers/setup_mail.rb
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:domain => "saidyes.co.uk",
:user_name => "username",
:password => "password",
:authentication => "plain",
:enable_starttls_auto => true
}
ActionMailer::Base.default_url_options[:host] = "localhost:3000"
ActionMailer::Base.register_interceptor(DevelopmentMailInterceptor) if Rails.env.development?
config/environments/development.rb
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
app/mailers/user_mailer.rb
class UserMailer < ActionMailer::Base
default :from => "info@saidyes.co.uk"
def self.registration_confirmation(user)
@user = user
attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
mail(:to => "#{user.email}", :subject => "Welcome")
end
end
app/models/user.rb
require "#{Rails.root}/app/mailers/user_mailer"
after_create :send_welcome_email
private
def send_welcome_email
UserMailer.registration_confirmation(self).deliver
end
Первой ошибкой, которую я получил, была неинициализированная константа UserMailer в моем классе модели Users. Я исправил это, добавив требование в верхней части определения модели пользователя. Теперь я получаю
неопределенная локальная переменная или метод `вложения» для UserMailer: Класс
Должно быть, я неправильно настроил actionmailer или мое приложение rails настроено неправильно для использования mailer.
В любом случае, любые советы или помощь будут оценены.
Приветствия
Ответ №1:
Я думаю, что простая проблема, с которой вы столкнулись, заключается в том, что методы mail должны быть определены в экземплярах вашего класса mailer.
А именно это должно быть
class UserMailer < ActionMailer::Base
def registration_confirmation(user)
@user = user
attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png")
mail(:to => "#{user.email}", :subject => "Welcome")
end
end
Обратите внимание, что нет self
Взгляните на полезное руководство Rails по этому вопросу
Как и в вашем примере, вы все равно будете вызывать метод в классе
UserMailer.registration_confirmation(user).deliver
Метод class выполняет некоторую магию для создания экземпляра экземпляра и обеспечения отображения правильного шаблона.
Комментарии:
1. дох! Я ввел ссылку на себя, когда получил более раннюю ошибку неинициализированной константы usermailer в пользовательской модели. В любом случае, спасибо, что нашли время ответить, это сработало!