Mailer error missing template

21.7k views Asked by At

Hello,

I have problem with ActionMailer, when I try to execute action:

rake send_email

I get a error:

    rake aborted!
ActionView::MissingTemplate: Missing template user_mailer/mailer with "mailer". Searched in:
  * "user_mailer"

Here's my:

mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  def mailer(user)
    @user = user
    mail(to: @user.email, subject: 'Test')
  end

end

views/user_mailer/mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>
      Sample mail.
    </p>
  </body>
</html>

views/user_mailer/mailer.text.erb

Sample mail.

lib/tasks/emails_task.rake

desc 'send email'
task send_email: :environment do
  UserMailer.mailer(User.last).deliver!
end

config/environments/development.rb

# I recommend using this line to show error
  config.action_mailer.raise_delivery_errors = true

  # ActionMailer Config
  config.action_mailer.delivery_method = :letter_opener

# config.action_mailer.default_url_options = { :host => 'localhost:3000' }
# config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
 :address              => "smtp.gmail.com",
 :port                 => 587,
 :user_name            => ENV['gmail_username'],
 :password             => ENV['gmail_password'],
 :authentication       => "plain",
:enable_starttls_auto => true
}

# Send email in development mode?
config.action_mailer.perform_deliveries = true

I searched for the solution on stackoverflow and I tried many of the answers for the similar problem but unfortunately none of them worked for me.

I found solution, when I add body to mailer method like:

def mailer(user)
  @user = user
  mail(to: @user.email, subject: 'Test', body: 'something')
end

Then it does work but I would like to have a body in separate files and make it more complex with user name and other things.

If someone have a idea how to solve this problem then I would be very thankful :)

10

There are 10 answers

0
Jan Gerritsen On

I had the same problem. Restarting sidekiq solved it for me.

0
stevec On

If you want to send html but tell rails not to place it inside a layout, do two things:

  • instead of html_body, use body instead
  • Also provide the content_type: "text/html" argument
class TestMailer < ApplicationMailer
  default from: '[email protected]'

  def hello
    mail(
      subject: 'Hello from me',
      to: '[email protected]',
      from: '[email protected]',
      body: '<strong>Hello</strong> dear user...', # <--- use body instead of html_body
      content_type: "text/html"                    # <--- add this line too
      )
  end
end

TestMailer.hello.deliver_now
0
Matt Kandler On

It's likely that Rails just isn't finding your newly created files. If you have the spring gem running, that could be the issue. (More on spring: https://github.com/rails/spring)

To setup terminal commands and stop running spring:

 $ bundle exec spring binstub --all
 $ bin/spring stop

I tried this, then re-running my app with rails s. That didn't work so then try closing the terminal completely and rebooting your computer. Run rails s and try testing with rails c in a second tab:

 mail = UserMailer.mailer(User.last)

That finally worked for me, hopefully it'll help some of you!

(Some of these steps may be redundant.)

0
prajwalpinto On

I had a similiar issue. I had missed adding the gem 'haml-rails' in my Gemfile. Check if you are missing the gem.

0
sukanta On
class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  layout "mailer"

  def mailer(user)
   @user = user
   mail(to: @user.email, subject: 'Test')
 end

end

Add a html layout under layout#

mailer.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
      /* Email styles need to be inline */
    </style>
  </head>

  <body>
    <%= yield %>
  </body>
</html>

Add text layout under layout #

mailer.text.erb

<%= yield %>

Use preview to check your email based on your test framework.

0
tashi yangchen On

well, mine might be the silliest answer of all but mine work after deleting the template and recreating it with the same name

2
montrealmike On

I renamed my method and it worked. Maybe the name of the method can't be mail or mailer...

0
Ivica Lakatoš On

I had the same problem, my solution was to delete mailer template file, in your case views/user_mailer/mailer.html.erb and to create it again. It seems that I created file with proper name but with some weird white space somewhere, and ActionMailer didn't recognise it.

0
Habax On

Could you publish a minimalist Github repository reproducing your error?

You may try to generate your mailer in order to check you are not forgetting something:

bundle exec rails generate mailer mailer_classname mailer_viewname

In your case:

bundle exec rails generate mailer user_mailer mailer

0
Florin Ionita On

Try adding layout

class UserMailer < ActionMailer::Base
  default from: "[email protected]"

  layout "mailer"

  def mailer(user)
   @user = user
   mail(to: @user.email, subject: 'Test')
 end

end