20

I am trying to build a contact form in Rails 4, where the form takes a name, email, and body and sends it to my email address. Upon clicking "Submit", the app redirects back to the Contact page correctly, but no email appears to get sent.

routes.rb

match '/send_mail', to: 'contact#send_mail', via: 'post'

contact_email.html.erb

<!DOCTYPE html>
<html>
    <head>
        <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
        <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <p>You have received the following email from <%= "#{ @name } (#{ @email }):" %></p>
        <p><%= @body %></p>
    </body>
</html>

contact_controller.rb

def send_mail
    name = params[:name]
    email = params[:email]
    body = params[:comments]
    ContactMailer.contact_email(name, email, body).deliver
    redirect_to contact_path, notice: 'Message sent'
end

contact_mailer.rb

class ContactMailer < ActionMailer::Base
    default to: # my email address

    def contact_email(name, email, body)
        @name = name
        @email = email
        @body = body`enter code here`

        mail(from: email, subject: 'Contact Request')
    end
end

contact.html.erb

<div class="container-content">
    <div class="container">
        <%= form_tag(send_mail_path) do %>
            <div class="form-group">
                <%= label_tag 'name', 'Name' %>
                <%= text_field_tag 'name', nil, class: 'form-control', placeholder: 'Your Name' %>
            </div>
           <div class="form-group">
               <%= label_tag 'email', 'Email' %>
               <%= email_field_tag 'email', nil, class: 'form-control', placeholder: 'Your Email Address' %>
           </div>
           <div class="form-group">
               <%= label_tag 'comments', 'Comments' %>
               <%= text_area_tag 'comments', nil, class: 'form-control', rows: 4, placeholder: 'Comments...' %>
           </div>
           <%= submit_tag nil, class: 'btn btn-default btn-about pull-right' %>
       <% end %>
  </div>
</div>

application.rb

config.action_mailer.delivery_method = :sendmail
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
sethfri
  • 1,307
  • 1
  • 15
  • 31
  • Are you running in development mode with `delivery_method` set to `:test`? Do you see your e-mail in your log? – jb_314 Dec 25 '13 at 07:24
  • Maybe a stupid question: did you change config.action_mailer.perform_deliveries = true, as by default this is on false, preventing mails to be sent from the development environment... – Danny Dec 25 '13 at 07:31
  • @np_ No message is sent regardless of whether I'm running in production or via localhost – sethfri Dec 25 '13 at 09:02
  • @Danny Van Hoof I did set that to true, but no email is getting sent whether I'm in development or production. – sethfri Dec 25 '13 at 09:02
  • 2
    Your code looks ok. So, my guess is it has to do something with your smtp settings... Has it ever worked? In other words, are you sure your smtp settings are OK? – Danny Dec 25 '13 at 09:12
  • What params are you getting from the form submit? You sure they're just going to be `params[:name]` etc? – Richard Peck Dec 25 '13 at 10:30
  • Can you try sending email from console and look for errors? – Bart Dec 26 '13 at 00:06
  • @sethfri: with `delivery_method` set to `:test`, then e-mails will be put in the log file. You can use that to ensure that your mailer is working (in that it's getting called and generating a message), and therefore isolating the problem to your SMTP settings. – jb_314 Dec 26 '13 at 20:21
  • @DannyVanHoof No, this is the first time I am trying anything with mailers, so it has not worked in the past. I've updated the question with my *application.rb* settings. – sethfri Dec 26 '13 at 20:43
  • @BartoszKopiński When I try sending the email from the console `Sent mail to (39.6ms)` appears, which makes me think it's working. No errors in sight, but no email showing up either. – sethfri Dec 26 '13 at 20:44
  • @RichPeck Yes, these are the correct parameters. – sethfri Dec 26 '13 at 20:47

1 Answers1

14

It turned out that I hadn't configured my Heroku app with an external SMTP service (since I have never done anything with email before, I didn't know to do this). Since I'm relatively familiar with MailChimp, and especially since their Mandrill service has a free tier (I am building this app for a student organization), I easily added Mandrill to my Heroku app and included the following settings in application.rb:

ActionMailer::Base.smtp_settings = {
    address: 'smtp.mandrillapp.com',
    port: 587,
    user_name: ENV['MANDRILL_USERNAME'],
    password: ENV['MANDRILL_APIKEY']
}

Where the ENV vars were set automatically by the add-on.

sethfri
  • 1,307
  • 1
  • 15
  • 31
  • do you need those ENV texts? can't you just 'put it in quotes'? – smatthewenglish Nov 26 '16 at 21:14
  • 2
    Do you mean instead of retrieving an ENV var, using the username and password as raw strings? That would be functional, but it's not a good practice. Setting it in the ENV is better for security because it's not readily available to anyone with access to the source code. Additionally, if you need to modify these values ever, you can do so without redeploying your whole app. You just modify the ENV and reboot the app. – sethfri Dec 02 '16 at 00:52