Sending HTML Mail

Rails is great at generating HTML, so of course ActionMailer can generate HTML. It works almost like generating text messages, but with a few more details. Because some users really prefer text email messages, this demonstration will give them a choice. The form in app/views/awards/show.html.erb used to request the email, previously shown in Example 17-5, will have an extra checkbox. This extra component sets a parameter identifying whether to send “rich text” (really HTML) email, highlighted in Example 17-6. (This code is in ch17/student011.)

Example 17-6. Adding a checkbox for choosing whether to send HTML or text email

<% form_tag email_student_award_path(@student, @award) do %>
  <p><%= check_box_tag :use_html %>
  <label for="use_html">Use rich text?</label></p>
  <%= submit_tag 'Email me this award' %>
<% end %>

The email method in awards_controller, previously shown in Example 17-2, grows a little more complex to support the checkbox’s new :use_html parameter, as shown in Example 17-7.

Example 17-7. Providing controller support for sending HTML-based email, when desired

def email
    @award = @student.awards.find(params[:id])
    if params[:use_html]
      AwardMailer.deliver_html_certificate(@award, current_user.email)
    else
      AwardMailer.deliver_certificate(@award, current_user.email)
    end
    flash[:notice] = "Email has been sent"
    redirect_to([@student, @award])
  end

If the checkbox was checked, the user wants rich text, and so the controller calls AwardMailer’s deliver_html_certificate method instead of just deliver_certificate. There still isn’t really a deliver_html_certificate method in the app/models/award_mailer.rb file shown in Example 17-8, but there is a new html_certificate method that looks almost like the certificate method from Example 17-3, except that it has a different name and one new field.

Example 17-8. An html_certificate method specifying headers and sending content

def html_certificate(award, email)
    subject       award.name
    recipients    email
    from          'School System <[email protected]>'
    sent_on       Time.now
    body          :award => award
    content_type  'text/html'
end

The new content_type field is critical if you want the HTML to be rendered in the recipient’s mail view rather than show its source. By default, content_type will be text/plain, a MIME content type identifier that tells the mailer to render as text. Setting it to text/html tells the mailer to render as HTML. Of course, that means creating a view that will generate HTML, the /app/views/award_mailer/html_certificate.html.erb file shown in Example 17-9.

Example 17-9. A view that generates the body of an HTML email message

<table width="100%" border="1" cellpadding="10">
  <tr>
    <td align="center">
      <br />
      <br />
      <h1><%=h @award.name %></h1>
      <br />
      <br />
      <p>awarded to</p>
      <br />
      <br />
      <h2><%=h @award.student.name %></h2>
      <br />
      <h3><%=h @award.year %></h3
    </td>
  </tr>
</table>
<br />
<br />
<hr />

<p>Courtesy of the School System!</p>

Now, if users visit an award page, they’ll see a checkbox and button like that shown in Figure 17-5, from which they can send a message like that shown in Figure 17-6.

The HTML email sent will also be recorded in the log.

Note

Through version 2.1 of Rails, ActionMailer had no concept of layouts for its messages. The most recent versions of Rails let you create layouts with filenames that include _mailer, such as layouts/award_mailer.html.erb.

An extra option for sending awards email

Figure 17-5. An extra option for sending awards email

A fancier award message

Figure 17-6. A fancier award message

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset