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 = '[email protected]' @sent_on = sent_at @body["title"] = 'This is title' @body["email"] = '[email protected]' @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 = '[email protected]' @sent_on = sent_at @body["title"] = 'This is title' @body["email"] = '[email protected]' @body["message"] = message @headers = {content_type => 'text/html'} end end
Для получения полной информации о ActionMailer , пожалуйста, обратитесь к стандартной документации Ruby.