Hi,
would someone please help me. I have been desperatley trying to fnd out for the last two days why the following code is not working. Any ideas.
I'm running Instant Rails 1.4 / Rails version 1.2.5 / Ruby version 1.8.5 (i386-mswin32) / RubyGems version 1.1.1 / Action Mailer version 1.3.5 / Windows XP.
Here is a description of my emailing application:
in app/views/emailer/correspond.rhtml:
<h2>Request A Call Back</h2>
<p>Email a request to receive a Call Back from XYZ:</p>
<% form_tag :action => 'sendmail' do -%>
<p>First Name:<br /><%= text_field 'email', 'firstname', :size => 30 %></p> <p>Surname:<br /><%= text_field 'email', 'surname', :size => 30 %></p> <p>Email Address:<br /><%= text_field 'email', 'email_address', :size => 30 %></p> <p>Telephone Number:<br /><%= text_field 'email', 'telephone', :size => 30 %></p> <p>Message:<br /><%= text_area 'email', 'message_body', :rows => 20, :cols => 50 %></p>
<%= submit_tag "Send", :class => "submit" %> or <%= link_to 'Cancel', '/' %>
<% end -%>
in app/controllers/emailer_controller.rb:
class EmailerController < ApplicationController
def sendmail email = params[:email] recipient = 'abc@def.com' subject = 'Request A Call Back' firstname = email["firstname"] surname = email["surname"] email_address = email["email_address"] telephone = email["telephone"] message_body = email["message_body"] Emailer.deliver_message(recipient, subject, firstname, surname, email_address, telephone, message_body) return if request.xhr? flash[:notice] = "Email Sent Successfully." redirect_to '/emailer/correspond' end
end
in app/models/emailer.rb:
class Emailer < ActionMailer::Base
def message(recipient, subject, firstname, surname, email_address, telephone, message_body) @subject = subject @recipients = recipient @from = 'no-reply@def.com'
@body["firstname"] = firstname @body["surname"] = surname @body["email_address"] = email_address @body["telephone"] = telephone @body["message_body"] = message_body end
end
in app/views/emailer/message.rhtml:
Hi XYZ!
You are receiving an email message from:
First Name: <%= @firstname %>
Surname: <%= @surname %>
Email address: <%= @email_address %>
Telephone Number: <%= @telephone %>
Message: <%= @message_body %>
requesting a Call Back.
in config/environment.rb:
require 'smtp_tls' ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.server_settings = { :address => "smtp.gmail.com", :port => 587, :domain => "def.com", :authentication => :plain, :user_name => "abc@googlemail.com", :password => "abcdef" }
in lib/smtp_tls.rb:
require "openssl" require "net/smtp"
Net::SMTP.class_eval do private def do_start(helodomain, user, secret, authtype) raise IOError, 'SMTP session already started' if @started check_auth_args user, secret, authtype if user or secret
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) } @socket = Net::InternetMessageIO.new(sock) @socket.read_timeout = 60 #@read_timeout #@socket.debug_output = STDERR #@debug_output
check_response(critical { recv_response() }) do_helo(helodomain)
if starttls raise 'openssl library not installed' unless defined?(OpenSSL) ssl = OpenSSL::SSL::SSLSocket.new(sock) ssl.sync_close = true ssl.connect @socket = Net::InternetMessageIO.new(ssl) @socket.read_timeout = 60 #@read_timeout #@socket.debug_output = STDERR #@debug_output do_helo(helodomain) end
authenticate user, secret, authtype if user @started = true ensure unless @started # authentication failed, cancel connection. @socket.close if not @started and @socket and not @socket.closed? @socket = nil end end
def do_helo(helodomain) begin if @esmtp ehlo helodomain else helo helodomain end rescue Net::ProtocolError if @esmtp @esmtp = false @error_occured = false retry end raise end end
def starttls getok('STARTTLS') rescue return false return true end
def quit begin getok('QUIT') rescue EOFError, OpenSSL::SSL::SSLError end end
end
I get the following error message:
Errno::EBADF in EmailerController#sendmail Bad file descriptor - connect(2) RAILS_ROOT: ./script/../config/..
Application Trace | Framework Trace | Full Trace C:/InstantRails/rails_apps/YOTO/vendor/plugins/action_mailer_tls/lib/ smtp_tls.rb:10:in `initialize' C:/InstantRails/rails_apps/YOTO/vendor/plugins/action_mailer_tls/lib/ smtp_tls.rb:10:in `open' C:/InstantRails/rails_apps/YOTO/vendor/plugins/action_mailer_tls/lib/ smtp_tls.rb:10:in `do_start' C:/InstantRails/ruby/lib/ruby/1.8/timeout.rb:56:in `timeout' C:/InstantRails/ruby/lib/ruby/1.8/timeout.rb:76:in `timeout' C:/InstantRails/rails_apps/YOTO/vendor/plugins/action_mailer_tls/lib/ smtp_tls.rb:10:in `do_start' C:/InstantRails/ruby/lib/ruby/1.8/net/smtp.rb:378:in `start' C:/InstantRails/ruby/lib/ruby/1.8/net/smtp.rb:316:in `start' C:/InstantRails/rails_apps/YOTO/vendor/rails/actionmailer/lib/ action_mailer/base.rb:565:in `perform_delivery_smtp' C:/InstantRails/rails_apps/YOTO/vendor/rails/actionmailer/lib/ action_mailer/base.rb:451:in `send' C:/InstantRails/rails_apps/YOTO/vendor/rails/actionmailer/lib/ action_mailer/base.rb:451:in `deliver!' C:/InstantRails/rails_apps/YOTO/vendor/rails/actionmailer/lib/ action_mailer/base.rb:333:in `method_missing' C:/InstantRails/rails_apps/YOTO/app/controllers/emailer_controller.rb: 12:in `sendmail'
What on earth is happening?
I have a working version of this code running on Mac OS X with Rails 2.0.2 (with the obvious changes: rhtml --> html.erb and server_settings --> smtp_settings).
Thanks in advance.
Regards
Walter