Ruby on Rails 2.1 - Enviando e-mails

ActionMaileré o componente Rails que permite aos aplicativos enviar e receber emails. Neste capítulo, veremos como enviar um e-mail usando Rails.

Vamos começar criando um emails projeto usando o seguinte comando.

C:\ruby> rails -d mysql emails

Aqui estamos usando -d mysqlopção para especificar nosso interesse em usar o banco de dados MySQL. Podemos especificar qualquer outro nome de banco de dados como oracle ou postgress usando o-dopção. Por padrão, o Rails usaSQLite base de dados.

Configurando o Banco de Dados

Mesmo que não estejamos usando um banco de dados em nossa aplicação, o Rails precisa dele para continuar. Então, vamos realizar essas etapas adicionais.

A seguir está a maneira de criar um banco de dados -

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)

Para direcionar o Rails para localizar o banco de dados, edite o arquivo de configuração ~ \ upload \ config \ database.yml e mude o nome do banco de dados para cookbook. Quando terminar, deve ser o seguinte -

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 - Configuração

A seguir estão as etapas que você deve seguir para concluir a configuração antes de prosseguir com o trabalho real. -

Vá para a pasta de configuração do seu projeto de e-mails e abra o environment.rb arquivo e adicione a seguinte linha na parte inferior deste arquivo.

ActionMailer::Base.delivery_method = :smtp

Informa ao ActionMailer que você deseja usar o servidor SMTP. Você também pode defini-lo como: sendmail se estiver usando um sistema operacional baseado em Unix, como Mac OS X ou Linux.

Adicione as seguintes linhas de código na parte inferior do seu environment.rb também.

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

Substitua cada valor de hash pelas configurações adequadas para o servidor Simple Mail Transfer Protocol (SMTP). Você pode obter essas informações com seu provedor de serviços de Internet, se ainda não souber. Você não precisa alterar o número da porta 25 e o tipo de autenticação se estiver usando um servidor SMTP padrão.

Você também pode alterar o formato padrão da mensagem de e-mail. Se você preferir enviar e-mail em HTML em vez do formato de texto simples, adicione a seguinte linha a config / environment.rb também -

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

ActionMailer :: Base.default_content_type pode ser definido como "texto / simples", "texto / html" e "texto / enriquecido". O valor padrão é "text / plain".

A próxima etapa é criar um mailer.

Gerar um Mailer

Use o seguinte comando para gerar um mailer da seguinte maneira -

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

Ele criará um arquivo emailer.rb no diretório app / models. Verifique o conteúdo deste arquivo da seguinte forma -

class Emailer < ActionMailer::Base
end

Agora vamos criar um método dentro da classe ActionMailer :: Base da seguinte maneira -

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

O método de contato tem quatro parâmetros: um destinatário, um assunto, uma mensagem e um sent_at, que define quando o e-mail é enviado. O método também define seis parâmetros padrão que fazem parte de cada método ActionMailer -

  • @subject define o assunto do e-mail.

  • @body é um hash Ruby que contém valores com os quais você pode preencher o modelo de correio. Você criou três pares de valores-chave: título, e-mail e mensagem

  • @recipients é uma lista das pessoas para quem a mensagem está sendo enviada.

  • @from define de quem é o e-mail.

  • @sent_on pega o parâmetro sent_at e define o carimbo de data / hora do e-mail.

  • @headers é outro hash que permite modificar os cabeçalhos do e-mail. Por exemplo, você pode definir o tipo MIME do e-mail se quiser enviar texto sem formatação ou HTML.

Criando o controlador

Agora, vamos criar um controlador para este aplicativo da seguinte maneira -

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

Vamos definir um método de controle sendmail em app / controllers / emailer_controller.rb, que chamará o método Model para enviar um e-mail real da seguinte forma -

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

Para entregar e-mail usando o método de contato da mala direta, você deve adicionar deliver_ ao início do nome do método. Você adiciona um return if request.xhr ?, para que possa escapar para Rails Java Script (RJS) se o navegador não suportar JavaScript e então instruir o método a renderizar uma mensagem de texto.

Você está quase terminando, exceto para preparar uma tela de onde obterá as informações do usuário para enviar e-mail. Vamos definir um índice de método de tela no controlador e, em seguida, na próxima seção, definiremos todas as visualizações necessárias -

Adicione o seguinte código no arquivo emailer_controller.rb.

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

Definindo Vistas

Defina uma visualização em app \ views \ emails \ index.html.erb. Isso será chamado de página padrão para o aplicativo e permitirá que os usuários insiram a mensagem e enviem o e-mail necessário -

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

Além da visualização acima, precisamos de mais um modelo, que será usado pelo método de contato do Emailer durante o envio da mensagem. Este é apenas um texto com marcadores padrão do Rails <% =%> espalhados por toda parte.

Basta colocar o seguinte código no app/views/contact.html.erb Arquivo.

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

Descanse para teste

Antes de testar, certifique-se de que sua máquina esteja conectada à Internet e que seu servidor de e-mail e o servidor da Web estejam funcionando.

Agora, teste seu aplicativo usando http://127.0.0.1:3000/Emailer/index. Ele exibe a seguinte tela e usando esta tela, você poderá enviar sua mensagem para qualquer pessoa.

Após o envio da mensagem, será exibida a mensagem de texto - "Mensagem enviada com sucesso".

Enviando e-mails HTML usando Rails

Para enviar e-mails como HTML, certifique-se de que sua visualização (o arquivo .erb) gere HTML e defina o tipo de conteúdo como html em seu emails/app/models/emailer.rb arquivo da seguinte forma -

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

Para um detalhe completo sobre ActionMailer, consulte a documentação padrão do Ruby.