Учебники

Ruby on Rails 2.1 — Отправка писем

ActionMailer — это компонент Rails, который позволяет приложениям отправлять и получать электронную почту. В этой главе мы увидим, как отправить электронное письмо с помощью Rails.

Давайте начнем с создания проекта электронной почты с помощью следующей команды.

C:\ruby> rails -d mysql emails

Здесь мы используем параметр -d mysql, чтобы указать наш интерес к использованию базы данных MySQL. Мы можем указать любое другое имя базы данных, например oracle или postgress, используя опцию -d . По умолчанию Rails использует базу данных SQLite .

Настройка базы данных

Несмотря на то, что мы не используем базу данных в нашем приложении, но Rails нуждается в ней для продолжения. Итак, давайте выполним эти дополнительные шаги.

Ниже приведен способ создания базы данных —

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)

Чтобы указать Rails найти базу данных, отредактируйте файл конфигурации ~ \ upload \ config \ database.yml и измените имя базы данных на поваренную книгу. Когда вы закончите, это должно выглядеть следующим образом —

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 — Конфигурация

Ниже приведены шаги, которые вы должны выполнить, чтобы завершить настройку, прежде чем приступить к реальной работе.

Перейдите в папку config вашего проекта электронной почты, откройте файл environment.rb и добавьте следующую строку внизу этого файла.

ActionMailer::Base.delivery_method = :smtp

Он сообщает ActionMailer, что вы хотите использовать SMTP-сервер. Вы также можете установить его как: sendmail, если вы используете операционную систему на основе Unix, такую ​​как Mac OS X или Linux.

Добавьте также следующие строки кода внизу вашего environment.rb.

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

Замените каждое хеш-значение правильными настройками для вашего SMTP-сервера. Вы можете взять эту информацию у своего интернет-провайдера, если вы уже не знаете. Вам не нужно менять номер порта 25 и тип аутентификации, если вы используете стандартный SMTP-сервер.

Вы также можете изменить формат сообщения электронной почты по умолчанию. Если вы предпочитаете отправлять электронную почту в формате HTML, а не в текстовом формате, добавьте также следующую строку в config / environment.rb:

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

ActionMailer :: Base.default_content_type может быть установлен в «text / plain», «text / html» и «text / enriched». Значением по умолчанию является «text / plain».

Следующим шагом является создание почтовой программы.

Создать почтовик

Используйте следующую команду для генерации почтовой программы следующим образом:

C:\ruby\> cd emails
C:\ruby\emails> ruby script/generate mailer Emailer

Это создаст файл emailer.rb в каталоге app / models. Проверьте содержимое этого файла следующим образом —

class Emailer < ActionMailer::Base
end

Теперь давайте создадим один метод внутри класса ActionMailer :: Base следующим образом:

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

Метод contact имеет четыре параметра: получатель, тема, сообщение и sent_at, которые определяют, когда отправляется электронное письмо. Метод также определяет шесть стандартных параметров, которые являются частью каждого метода ActionMailer.

  • @subject определяет тему письма.

  • @body — это хэш Ruby, содержащий значения, которыми вы можете заполнить почтовый шаблон. Вы создали три пары ключ-значение: заголовок, электронная почта и сообщение

  • @recipients — это список людей, которым отправляется сообщение.

  • @from определяет, от кого получено электронное письмо.

  • @sent_on принимает параметр sent_at и устанавливает метку времени электронного письма.

  • @headers — еще один хеш, который позволяет вам изменять заголовки электронной почты. Например, вы можете установить тип MIME для электронной почты, если вы хотите отправлять либо обычное текстовое, либо HTML-сообщение.

@subject определяет тему письма.

@body — это хэш Ruby, содержащий значения, которыми вы можете заполнить почтовый шаблон. Вы создали три пары ключ-значение: заголовок, электронная почта и сообщение

@recipients — это список людей, которым отправляется сообщение.

@from определяет, от кого получено электронное письмо.

@sent_on принимает параметр sent_at и устанавливает метку времени электронного письма.

@headers — еще один хеш, который позволяет вам изменять заголовки электронной почты. Например, вы можете установить тип MIME для электронной почты, если вы хотите отправлять либо обычное текстовое, либо HTML-сообщение.

Создание контроллера

Теперь мы создадим контроллер для этого приложения следующим образом:

C:\ruby\emails> ruby script/generate controller Emailer

Давайте определим метод контроллера sendmail в app / controllers / emailer_controller.rb, который вызовет метод Model для отправки фактического электронного письма следующим образом:

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

Чтобы доставлять электронную почту, используя метод связи почтовой программы, вы должны добавить _ в начало имени метода. Вы добавляете return if request.xhr ?, чтобы можно было перейти к Rails Java Script (RJS), если браузер не поддерживает JavaScript, а затем дать указание методу визуализировать текстовое сообщение.

Вы почти закончили, за исключением подготовки экрана, откуда вы получите информацию о пользователе для отправки электронной почты. Давайте определим один индекс метода экрана в контроллере, а затем в следующем разделе мы определим все необходимые представления —

Добавьте следующий код в файл emailer_controller.rb.

def index
   render :file => 'app\views\emailer\index.html.erb'
end

Определение видов

Определите представление в app \ views \ emails \ index.html.erb. Это будет называться страницей по умолчанию для приложения и позволит пользователям вводить сообщения и отправлять необходимые электронные письма —

<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 %>

Помимо приведенного выше представления нам нужен еще один шаблон, который будет использоваться методом контакта Emailer при отправке сообщения. Это просто текст со стандартными заполнителями Rails <% =%>, разбросанными повсюду.

Просто поместите следующий код в файл app / views / contact.html.erb .

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

Отдых для тестирования

Перед тестированием убедитесь, что ваш компьютер подключен к Интернету, а ваш почтовый сервер и веб-сервер запущены и работают.

Теперь протестируйте ваше приложение, используя http://127.0.0.1:3000/Emailer/index. Он отображает следующий экран, и с помощью этого экрана вы сможете отправить свое сообщение кому угодно.

Отправить письмо

После отправки сообщения отобразится текстовое сообщение «Сообщение успешно отправлено».

Отправка электронных писем в формате HTML с помощью Rails

Чтобы отправлять письма в формате HTML, убедитесь, что ваше представление (файл .erb) генерирует HTML и установите тип содержимого html в файле emails / app / models / emailer.rb следующим образом:

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

Для получения полной информации о ActionMailer , пожалуйста, обратитесь к стандартной документации Ruby.