Integralist
Integralist

Reputation: 2211

Send email via Ruby code on Heroku

I'm having problems sending email via my Ruby code. You can see my full code on GitHub.

UPDATE: the below code has been amended to reflect suggestions from @Gaurish

UPDATE2: looks like gmail refused the login attempt - I received an email from them to warn me some unknown application tried to access my account but they disabled it

The specific class is here:

require 'net/smtp'

=begin
    http://apidock.com/ruby/v1_9_3_125/Net/SMTP/start/class
    https://devcenter.heroku.com/articles/config-vars

    I added the following config vars to Heroku
    heroku config:add GM_USR=xxxx
    heroku config:add GM_PSW=xxxx
=end

class Email
    def initialize (to, from, subject, body)
            @to = to
            @from = from
            @subject = subject
            @body = body
            @message = <<MESSAGE_CONTENT
                From: User <#{@from}>
                To: Integralist <#{@to}>
                MIME-Version: 1.0
                Content-type: text/html
                Subject: #{@subject}
                #{@body}
MESSAGE_CONTENT

            @smtp = Net::SMTP.new('smtp.gmail.com', 587)
        end

        def send_email
            @smtp.enable_starttls
            @smtp.start('furious-wind-9309.herokuapp.com', ENV['GM_USR'], ENV['GM_PSW'], :login) do |smtp|
            @smtp.send_message(@message, @from, @to)
        end
    end
end

I'm calling it like so:

email = Email.new('[email protected]', params[:email], 'test subject', params[:message]);
email.send_mail

But when I execute the code I get the error displayed on screen: 535-5.7.1 Please log in with your web browser and then try again. Learn more at

I checked the logs and I get...

2012-06-13T08:01:08+00:00 heroku[router]: POST furious-wind-9309.herokuapp.com/contact dyno=web.1 queue=0 wait=0ms service=628ms status=500 bytes=2060
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-protection-1.2.0/lib/rack/protection/xss_header.rb:22:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:200:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/session/abstract/id.rb:205:in `context'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/logger.rb:15:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/commonlogger.rb:20:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/head.rb:9:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/rack-1.4.1/lib/rack/methodoverride.rb:21:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334:in `block in call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1416:in `synchronize'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/sinatra-1.3.2/lib/sinatra/base.rb:1334:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:80:in `block in pre_process'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `catch'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/thin-1.3.1/lib/thin/connection.rb:78:in `pre_process'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in `call'
2012-06-13T08:01:08+00:00 app[web.1]:   /app/vendor/bundle/ruby/1.9.1/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in `block in spawn_threadpool'
2012-06-13T08:01:08+00:00 app[web.1]: 82.69.39.185 - - [13/Jun/2012 08:01:08] "POST /contact HTTP/1.1" 500 2060 0.6254

I know people will likely suggest ActionMailer or Pony, but I'd rather not use those or have those suggested to me please. I'd instead like a solution that helps fix the above code instead.

Upvotes: 1

Views: 2999

Answers (3)

CuriousMind
CuriousMind

Reputation: 34135

[Update 1]

If gmail doesn't work for you, you can use SendGrid Addon which gives you upto 200emails per day at no charge.

Here is a sample(taken from docs) on how to use their STMP API with mail gem

require 'mail'
Mail.defaults do
  delivery_method :smtp, { :address   => "smtp.sendgrid.net",
                           :port      => 587,
                           :domain    => "yourdomain.com",
                           :user_name => "[email protected]",
                           :password  => "yourPassword",
                           :authentication => 'plain',
                           :enable_starttls_auto => true }
end

mail = Mail.deliver do
  to '[email protected]'
  from 'Your Name <[email protected]>'
  subject 'This is the subject of your email'
  text_part do
    body 'Hello world in text'
  end
  html_part do
    content_type 'text/html; charset=UTF-8'
    body '<b>Hello world in HTML</b>'
  end
end

Using Sendgrid is much better solution because you also get access Advanced reporting & analyticss which are not available with gmail. Also, there is no restriction on "from" addresses in sendgrid.


With Heroko, you can't send emails directly from localhost because Heroku does not provide an outgoing mail service.

so you will have to consider an external smtp server for sending your emails. popular ones are Gmail & Sendgrid

this is just one trade-off of using a cloud computing platform like heroku.

With Gmail, try doing something like this:

require 'net/smtp'

    msg = "your message goes here"
    smtp = Net::SMTP.new 'smtp.gmail.com', 587
    smtp.enable_starttls
    smtp.start(YourDomain, YourAccountName, YourPassword, :login) do
      smtp.send_message(msg, FromAddress, ToAddress)
    end

Upvotes: 4

Adam O&#39;Connor
Adam O&#39;Connor

Reputation: 2652

Just load up SendGrid as an add-on and it works right out of the box. Plus you get a whole suite of analytics for troubleshooting bounces, deliveries, etc...

Upvotes: 0

Marcus S&#225;
Marcus S&#225;

Reputation: 608

If you try:

@email = Email.new('[email protected]', params[:email], 'test subject', params[:message])
@email.send_email

Upvotes: 0

Related Questions