Ruby on Rails 2.1 - Invio di e-mail
ActionMailerè il componente Rails che consente alle applicazioni di inviare e ricevere email. In questo capitolo vedremo come inviare un'e-mail utilizzando Rails.
Cominciamo con la creazione di un file emails progetto utilizzando il seguente comando.
C:\ruby> rails -d mysql emails
Qui stiamo usando -d mysqlopzione per specificare il nostro interesse a utilizzare il database MySQL. Possiamo specificare qualsiasi altro nome di database come oracle o postgress utilizzando l' estensione-dopzione. Per impostazione predefinita, Rails utilizzaSQLite Banca dati.
Configurazione del database
Anche se non stiamo usando un database nella nostra applicazione, ma Rails ne ha bisogno per procedere. Quindi eseguiamo questi passaggi aggiuntivi.
Di seguito è riportato il modo per creare un database:
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)
Per indicare a Rails di individuare il database, modificare il file di configurazione ~ \ upload \ config \ database.yml e cambiare il nome del database in cookbook. Al termine, dovrebbe apparire come segue:
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 - Configurazione
Di seguito sono riportati i passaggi da seguire per completare la configurazione prima di procedere con il lavoro vero e proprio. -
Vai alla cartella di configurazione del tuo progetto di posta elettronica e apri il file environment.rb file e aggiungi la seguente riga in fondo a questo file.
ActionMailer::Base.delivery_method = :smtp
Informa l'ActionMailer che desideri utilizzare il server SMTP. Puoi anche impostarlo come: sendmail se stai utilizzando un sistema operativo basato su Unix come Mac OS X o Linux.
Aggiungi anche le seguenti righe di codice nella parte inferiore del tuo environment.rb.
ActionMailer::Base.smtp_settings = {
:address => "smtp.tutorialspoint.com",
:port => 25,
:domain => "tutorialspoint.com",
:authentication => :login,
:user_name => "username",
:password => "password",
}
Sostituisci ogni valore hash con le impostazioni appropriate per il tuo server SMTP (Simple Mail Transfer Protocol). Puoi richiedere queste informazioni al tuo provider di servizi Internet se già non lo sai. Non è necessario modificare il numero di porta 25 e il tipo di autenticazione se si utilizza un server SMTP standard.
È inoltre possibile modificare il formato predefinito del messaggio di posta elettronica. Se preferisci inviare e-mail in HTML invece che in formato testo, aggiungi anche la seguente riga a config / environment.rb -
ActionMailer::Base.default_content_type = "text/html"
ActionMailer :: Base.default_content_type potrebbe essere impostato su "text / plain", "text / html" e "text / arricchito". Il valore predefinito è "text / plain".
Il prossimo passo è creare un mailer.
Genera un bollettino
Utilizzare il seguente comando per generare un mailer come segue:
C:\ruby\> cd emails
C:\ruby\emails> ruby script/generate mailer Emailer
Creerà un file emailer.rb nella directory app / models. Controlla il contenuto di questo file come segue:
class Emailer < ActionMailer::Base
end
Ora creiamo un metodo all'interno della classe ActionMailer :: Base come segue:
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
Il metodo di contatto ha quattro parametri: un destinatario, un oggetto, un messaggio e un sent_at, che definisce quando viene inviata l'e-mail. Il metodo definisce anche sei parametri standard che fanno parte di ogni metodo ActionMailer -
@subject definisce l'oggetto dell'e-mail.
@body è un hash Ruby che contiene valori con cui è possibile popolare il modello di posta. Hai creato tre coppie chiave-valore: titolo, email e messaggio
@recipients è un elenco delle persone a cui viene inviato il messaggio.
@from definisce da chi proviene l'e-mail.
@sent_on accetta il parametro sent_at e imposta il timestamp dell'email.
@headers è un altro hash che consente di modificare le intestazioni di posta elettronica. Ad esempio, è possibile impostare il tipo MIME del messaggio di posta elettronica se si desidera inviare un messaggio di posta elettronica in formato testo o HTML.
Creazione del controller
Ora creeremo un controller per questa applicazione come segue:
C:\ruby\emails> ruby script/generate controller Emailer
Definiamo un metodo controller sendmail in app / controllers / emailer_controller.rb, che chiamerà il metodo Model per inviare un'e-mail effettiva come segue:
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
Per recapitare la posta elettronica utilizzando il metodo di contatto del mailer, è necessario aggiungere deliver_ all'inizio del nome del metodo. Si aggiunge un ritorno se request.xhr ?, in modo da poter passare a Rails Java Script (RJS) se il browser non supporta JavaScript e quindi istruire il metodo a visualizzare un messaggio di testo.
Hai quasi finito tranne che per preparare una schermata da cui otterrai le informazioni sull'utente per inviare e-mail. Definiamo un indice del metodo dello schermo nel controller e quindi nella sezione successiva definiremo tutte le viste richieste -
Aggiungi il seguente codice nel file emailer_controller.rb.
def index
render :file => 'app\views\emailer\index.html.erb'
end
Definizione delle viste
Definisci una visualizzazione in app \ views \ emails \ index.html.erb. Questa verrà chiamata come pagina predefinita per l'applicazione e consentirà agli utenti di inserire il messaggio e inviare l'e-mail richiesta -
<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 %>
Oltre alla vista sopra, abbiamo bisogno di un altro modello, che verrà utilizzato dal metodo di contatto dell'emailer durante l'invio del messaggio. Questo è solo testo con segnaposto Rails <% =%> standard sparsi ovunque.
Basta inserire il codice seguente nel file app/views/contact.html.erb file.
Hi!
You are having one email message from <%= @email %> with a title
<%= @title %>
and following is the message:
<%= @message %>
Thanks
Riposo per il test
Prima di eseguire il test, assicurati che la tua macchina sia connessa a Internet e che il tuo server di posta elettronica e il server web siano attivi e funzionanti.
Ora, prova la tua applicazione utilizzando http://127.0.0.1:3000/Emailer/index. Visualizza la seguente schermata e utilizzando questa schermata, sarai in grado di inviare il tuo messaggio a chiunque.
Dopo aver inviato un messaggio, verrà visualizzato il messaggio di testo - "Messaggio inviato con successo".
Invio di e-mail HTML utilizzando Rails
Per inviare messaggi come HTML, assicurati che la tua visualizzazione (il file .erb) generi HTML e imposta il tipo di contenuto su html nel tuo emails/app/models/emailer.rb file come segue -
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
Per un dettaglio completo su ActionMailer, per favore guarda nella documentazione standard di Ruby.