Ruby on Rails 2.1 - Gửi email

ActionMailerlà thành phần Rails cho phép các ứng dụng gửi và nhận email. Trong chương này, chúng ta sẽ xem cách gửi email bằng Rails.

Hãy bắt đầu với việc tạo emails dự án bằng cách sử dụng lệnh sau.

C:\ruby> rails -d mysql emails

Ở đây chúng tôi đang sử dụng -d mysqlđể xác định sở thích của chúng tôi để sử dụng cơ sở dữ liệu MySQL. Chúng tôi có thể chỉ định bất kỳ tên cơ sở dữ liệu nào khác như oracle hoặc postgress bằng cách sử dụng-dLựa chọn. Theo mặc định, Rails sử dụngSQLite cơ sở dữ liệu.

Thiết lập cơ sở dữ liệu

Mặc dù chúng tôi không sử dụng cơ sở dữ liệu trong ứng dụng của mình, nhưng Rails cần nó để tiếp tục. Vì vậy, hãy thực hiện các bước bổ sung này.

Dưới đây là cách tạo cơ sở dữ liệu -

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)

Để hướng dẫn Rails định vị cơ sở dữ liệu, hãy chỉnh sửa tệp cấu hình ~ \ upload \ config \ database.yml và thay đổi tên cơ sở dữ liệu thành sách dạy nấu ăn. Khi bạn hoàn thành, nó sẽ trông như sau:

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 - Cấu hình

Sau đây là các bước bạn phải làm để hoàn thành cấu hình của mình trước khi tiếp tục công việc thực tế. -

Đi tới thư mục cấu hình của dự án email của bạn và mở environment.rb và thêm dòng sau vào cuối tệp này.

ActionMailer::Base.delivery_method = :smtp

Nó thông báo cho ActionMailer rằng bạn muốn sử dụng máy chủ SMTP. Bạn cũng có thể đặt nó là: sendmail nếu bạn đang sử dụng hệ điều hành dựa trên Unix như Mac OS X hoặc Linux.

Thêm các dòng mã sau vào cuối môi trường của bạn.rb.

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

Thay thế mỗi giá trị băm bằng các cài đặt thích hợp cho máy chủ Giao thức Truyền Thư Đơn giản (SMTP) của bạn. Bạn có thể lấy thông tin này từ Nhà cung cấp dịch vụ Internet của mình nếu bạn chưa biết. Bạn không cần thay đổi số cổng 25 và loại xác thực nếu bạn đang sử dụng máy chủ SMTP tiêu chuẩn.

Bạn cũng có thể thay đổi định dạng email mặc định. Nếu bạn muốn gửi email bằng HTML thay vì định dạng văn bản thuần túy, hãy thêm dòng sau vào config / environment.rb -

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

ActionMailer :: Base.default_content_type có thể được đặt thành "văn bản / thuần túy", "văn bản / html" và "văn bản / được làm giàu". Giá trị mặc định là "văn bản / thuần túy".

Bước tiếp theo là tạo một bưu phẩm.

Tạo một Mailer

Sử dụng lệnh sau để tạo một bưu phẩm như sau:

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

Nó sẽ tạo một tệp emailer.rb trong thư mục app / models. Kiểm tra nội dung của tệp này như sau:

class Emailer < ActionMailer::Base
end

Bây giờ, hãy tạo một phương thức bên trong lớp ActionMailer :: Base như sau:

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

Phương thức liên hệ có bốn tham số: người nhận, chủ đề, tin nhắn và sent_at, xác định thời điểm email được gửi. Phương thức này cũng xác định sáu tham số tiêu chuẩn là một phần của mọi phương thức ActionMailer -

  • @subject xác định chủ đề e-mail.

  • @body là một hàm băm Ruby chứa các giá trị mà bạn có thể điền vào mẫu thư. Bạn đã tạo ba cặp khóa-giá trị: tiêu đề, email và tin nhắn

  • @recipient là danh sách những người mà tin nhắn đang được gửi đến.

  • @from xác định e-mail đến từ ai.

  • @sent_on nhận tham số sent_at và đặt dấu thời gian của email.

  • @headers là một hàm băm khác cho phép bạn sửa đổi tiêu đề e-mail. Ví dụ: bạn có thể đặt kiểu MIME của e-mail nếu bạn muốn gửi e-mail văn bản thuần túy hoặc HTML.

Tạo bộ điều khiển

Bây giờ, chúng ta sẽ tạo một bộ điều khiển cho ứng dụng này như sau:

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

Hãy xác định một phương thức điều khiển sendmail trong app / controllers / emailer_controller.rb, phương thức này sẽ gọi phương thức Model để gửi một email thực như sau:

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

Để gửi e-mail bằng phương thức liên hệ của người gửi thư, bạn phải thêm deliver_ vào đầu của tên phương thức. Bạn thêm trả về nếu request.xhr ?, để bạn có thể thoát sang Rails Java Script (RJS) nếu trình duyệt không hỗ trợ JavaScript và sau đó hướng dẫn phương thức hiển thị tin nhắn văn bản.

Bạn gần như đã hoàn tất ngoại trừ việc chuẩn bị một màn hình mà từ đó bạn sẽ lấy thông tin người dùng để gửi email. Hãy xác định một chỉ mục phương thức màn hình trong bộ điều khiển và sau đó trong phần tiếp theo, chúng ta sẽ xác định tất cả các chế độ xem cần thiết -

Thêm mã sau vào tệp emailer_controller.rb.

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

Xác định chế độ xem

Xác định chế độ xem trong app \ views \ email \ index.html.erb. Đây sẽ được gọi là trang mặc định cho ứng dụng và cho phép người dùng nhập tin nhắn và gửi email được yêu cầu -

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

Ngoài giao diện trên, chúng ta cần thêm một mẫu nữa, sẽ được sử dụng bởi phương thức liên hệ của Người gửi email khi gửi tin nhắn. Đây chỉ là văn bản với các trình giữ chỗ Rails <% =%> tiêu chuẩn nằm rải rác khắp nơi.

Chỉ cần đặt mã sau vào app/views/contact.html.erb tập tin.

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

Nghỉ ngơi để kiểm tra

Trước khi kiểm tra, hãy đảm bảo rằng máy của bạn được kết nối với Internet và Máy chủ Email và Máy chủ trang web của bạn đang hoạt động.

Bây giờ, hãy kiểm tra ứng dụng của bạn bằng cách sử dụng http://127.0.0.1:3000/Emailer/index. Nó hiển thị màn hình sau và bằng cách sử dụng màn hình này, bạn sẽ có thể gửi tin nhắn của mình cho bất kỳ ai.

Sau khi gửi tin nhắn, nó sẽ hiển thị thông báo văn bản - "Đã gửi tin nhắn thành công".

Gửi email HTML bằng Rails

Để gửi thư dưới dạng HTML, hãy đảm bảo rằng chế độ xem của bạn (tệp .erb) tạo HTML và đặt loại nội dung thành html trong emails/app/models/emailer.rb tập tin như sau -

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

Để biết chi tiết đầy đủ về ActionMailer, hãy xem tài liệu chuẩn của Ruby.