English 中文(简体)
Rails 2.1 Sends Emails
  • 时间:2024-09-17

Ruby on Rails 2.1 - Sending Emails


Previous Page Next Page  

ActionMailer is the Rails component that enables apppcations to send and receive emails. In this chapter, we will see how to send an email using Rails.

Let’s start with creating an emails project using the following command.

C:
uby> rails -d mysql emails

Here we are using -d mysql option to specify our interest to use MySQL database. We can specify any other database name pke oracle or postgress using the -d option. By default, Rails uses SQLite database.

Setting Up the Database

Even though we are not using a database in our apppcation, but Rails needs it to proceed. So let s perform these additional steps.

Given below is the way to create a database −

mysql> create database emails;
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on emails.*
 to  root @ localhost  identified by  password ;
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

To direct Rails to locate the database, edit the configuration file ~uploadconfigdatabase.yml and change the database name to cookbook. When you finish, it should look as follows −

development:
   adapter: mysql
   encoding: utf8
   database: emails
   username: root
   password: password
   host: localhost
test:
   adapter: mysql
   encoding: utf8
   database: emails
   username: root
   password: password
   host: localhost
production:
   adapter: mysql
   encoding: utf8
   database: emails
   username: root
   password: password
   host: localhost

Action Mailer – Configuration

Following are the steps you have to follow to complete your configuration before proceeding with the actual work. −

Go to the config folder of your emails project and open the environment.rb file and add the following pne at the bottom of this file.

ActionMailer::Base.depvery_method = :smtp

It informs the ActionMailer that you want to use the SMTP server. You can also set it as :sendmail if you are using a Unix-based operating system such as Mac OS X or Linux.

Add the following pnes of code at the bottom of your environment.rb as well.

ActionMailer::Base.smtp_settings = {
   :address => "smtp.tutorialspoint.com",
   :port => 25,
   :domain => "tutorialspoint.com",
   :authentication => :login,
   :user_name => "username",
   :password => "password",
}

Replace each hash value with proper settings for your Simple Mail Transfer Protocol (SMTP) server. You can take this information from your Internet Service Provider if you already don t know. You don t need to change port number 25 and authentication type if you are using standard SMTP server.

You may also change the default email message format. If you prefer to send email in HTML instead of plain text format, add the following pne to config/environment.rb as well −

ActionMailer::Base.default_content_type = "text/html"

ActionMailer::Base.default_content_type could be set to "text/plain", "text/html", and "text/enriched". The default value is "text/plain".

The next step is to create a mailer.

Generate a Mailer

Use the following command to generate a mailer as follows −

C:
uby> cd emails
C:
ubyemails> ruby script/generate mailer Emailer

It will create a file emailer.rb in the app/models directory. Check the content of this file as follows −

class Emailer < ActionMailer::Base
end

Now let s create one method inside the ActionMailer::Base class as follows −

class Emailer < ActionMailer::Base
   def contact(recipient, subject, message, sent_at = Time.now)
      @subject = subject
      @recipients = recipient
      @from =  no-reply@yourdomain.com 
      @sent_on = sent_at
      @body["title"] =  This is title 
      @body["email"] =  sender@yourdomain.com 
      @body["message"] = message
      @headers = {}
   end
end

The contact method has four parameters: a recipient, a subject, a message, and a sent_at, which defines when the email is sent. The method also defines six standard parameters that are a part of every ActionMailer method −

    @subject defines the e-mail subject.

    @body is a Ruby hash that contains values with which you can populate the mail template. You created three key-value pairs: title, email, and message

    @recipients is a pst of the people to whom the message is being sent.

    @from defines who the e-mail is from.

    @sent_on takes the sent_at parameter and sets the timestamp of the email.

    @headers is another hash that enables you to modify the e-mail headers. For example, you can set the MIME type of the e-mail if you want to send either plain text or HTML e-mail.

Creating the Controller

Now, we will create a controller for this apppcation as follows −

C:
ubyemails> ruby script/generate controller Emailer

Let’s define a controller method sendmail in app/controllers/emailer_controller.rb, which will call the Model method to send an actual email as follows −

class EmailerController < ApppcationController
   def sendmail
      recipient = params[:email]
      subject = params[:subject]
      message = params[:message]
      Emailer.depver_contact(recipient, subject, message)
      return if request.xhr?
      render :text =>  Message sent successfully 
   end
end

To depver e-mail using the mailer s contact method, you have to add depver_ to the beginning of the method name. You add a return if request.xhr?, so that you can escape to Rails Java Script (RJS) if the browser does not support JavaScript and then instruct the method to render a text message.

You are almost done except to prepare a screen from where you will get the user information to send email. Let s define one screen method index in the controller and then in the next section, we will define all the required views −

Add the following code in emailer_controller.rb file.

def index
   render :file =>  appviewsemailerindex.html.erb 
end

Defining Views

Define a view in appviewsemailsindex.html.erb. This will be called as the default page for the apppcation and will allow users to enter message and send the required email −

<h1>Send Email</h1>
<% form_tag :action =>  sendmail  do %>
<p><label for="email_subject">Subject</label>:
<%= text_field  email ,  subject  %></p>
<p><label for="email_recipient">Recipient</label>:
<%= text_field  email ,  recipient  %></p>
<p><label for="email_message">Message</label><br/>
<%= text_area  email ,  message  %></p>
<%= submit_tag "Send" %>
<% end %>

Apart from the above view, we need one more template, which will be used by the Emailer s contact method while sending message. This is just text with standard Rails <%= %> placeholders scattered throughout.

Just put the following code in the app/views/contact.html.erb file.

Hi!
You are having one email message from <%= @email %> with a title 
<%= @title %>
and following is the message:
<%= @message %>
Thanks

Rest for Testing

Before testing, make sure your machine is connected to the internet and your Email Server and the Webserver are up and running.

Now, test your apppcation by using http://127.0.0.1:3000/Emailer/index. It displays the following screen and by using this screen, you will be able to send your message to anybody.

Send Email

After sending a message, it will display the text message - "Message sent successfully".

Sending HTML Emails using Rails

To send mails as HTML, make sure your view (the .erb file) generates HTML and set the content type to html in your emails/app/models/emailer.rb file as follows −

class Emailer < ActionMailer::Base
   def contact(recipient, subject, message, sent_at = Time.now)
      @subject = subject
      @recipients = recipient
      @from =  no-reply@yourdomain.com 
      @sent_on = sent_at
      @body["title"] =  This is title 
      @body["email"] =  sender@yourdomain.com 
      @body["message"] = message
      @headers = {content_type =>  text/html }
   end
end

For a complete detail on ActionMailer, please look into the standard Ruby documentation.

Advertisements