Mailer error missing template

17,551

Solution 1

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

Solution 2

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

Solution 3

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.

Solution 4

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

Solution 5

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.)

Share:
17,551
Admin
Author by

Admin

Updated on June 02, 2022

Comments

  • Admin
    Admin almost 2 years

    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 :)

  • Christian Fazzini
    Christian Fazzini over 7 years
    Can you be specific? What method exactly?
  • montrealmike
    montrealmike almost 6 years
    @ChristianFazzini def mailer(user)