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.