Ruby-on-rails-2.1-rails-send-emails

提供:Dev Guides
移動先:案内検索

Ruby on Rails 2.1-メールの送信

*ActionMailer* は、アプリケーションがメールを送受信できるようにするRailsコンポーネントです。 この章では、Railsを使用してメールを送信する方法を説明します。

次のコマンドを使用して*メール*プロジェクトを作成することから始めましょう。

C:\ruby> rails -d mysql emails

ここでは、-d mysql *オプションを使用して、MySQLデータベースを使用する関心を指定しています。 *-d オプションを使用して、_oracle_や_postgress_などの他のデータベース名を指定できます。 デフォルトでは、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を編集し、データベース名をcookbookに変更します。 終了したら、次のようになります-

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

アクションメーラー–構成

以下は、実際の作業に進む前に構成を完了するために従う必要のある手順です。 −

メールプロジェクトのconfigフォルダーに移動して、 environment.rb ファイルを開き、このファイルの下部に次の行を追加します。

ActionMailer::Base.delivery_method = :smtp

SMTPサーバーを使用することをActionMailerに通知します。 Mac OS XやLinuxなどのUnixベースのオペレーティングシステムを使用している場合は、:sendmailとして設定することもできます。

environment.rbの下部にも次のコード行を追加します。

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

各ハッシュ値を、Simple Mail Transfer Protocol(SMTP)サーバーの適切な設定に置き換えます。 わからない場合は、インターネットサービスプロバイダーからこの情報を取得できます。 標準のSMTPサーバーを使用している場合、ポート番号25と認証タイプを変更する必要はありません。

デフォルトの電子メールメッセージ形式を変更することもできます。 プレーンテキスト形式ではなく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

app/modelsディレクトリにemailer.rbファイルが作成されます。 次のようにこのファイルの内容を確認してください-

class Emailer < ActionMailer::Base
end
次のようにActionMailer
Baseクラス内に1つのメソッドを作成しましょう-
class Emailer < ActionMailer::Base
   def contact(recipient, subject, message, sent_at = Time.now)
      @subject = subject
      @recipients = recipient
      @from = 'no-reply@yourdomain.com'
      @sent_on = sent_at
      @body["title"] = 'This is title'
      @body["email"] = 'sender@yourdomain.com'
      @body["message"] = message
      @headers = {}
   end
end

連絡方法には、受信者、件名、メッセージ、およびメールが送信されるタイミングを定義するsent_atの4つのパラメーターがあります。 メソッドは、すべてのActionMailerメソッドの一部である6つの標準パラメーターも定義します-

  • @subjectは、電子メールの件名を定義します。
  • @bodyは、メールテンプレートに入力できる値を含むRubyハッシュです。 タイトル、メール、メッセージの3つのキーと値のペアを作成しました
  • @recipientsは、メッセージの送信先のユーザーのリストです。
  • @fromは、電子メールの送信者を定義します。
  • @sent_onは、sent_atパラメーターを受け取り、電子メールのタイムスタンプを設定します。
  • @headersは、電子メールヘッダーを変更できる別のハッシュです。 たとえば、プレーンテキストまたはHTML電子メールを送信する場合は、電子メールのMIMEタイプを設定できます。

コントローラーの作成

今、私たちは次のようにこのアプリケーションのコントローラを作成します-

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

app/controllers/emailer_controller.rbでコントローラーメソッド sendmail を定義します。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

メーラーの連絡方法を使用して電子メールを配信するには、メソッド名の先頭に deliver _を追加する必要があります。 request.xhr?の場合はreturnを追加します。これにより、ブラウザーがJavaScriptをサポートしていない場合にRails Java Script(RJS)にエスケープし、テキストメッセージをレンダリングするようメソッドに指示できます。

電子メールを送信するためのユーザー情報を取得する画面を準備する以外は、ほぼ完了です。 コントローラーで1つの画面メソッドインデックスを定義してみましょう。次のセクションでは、必要なすべてのビューを定義します-

emailer_controller.rbファイルに次のコードを追加します。

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

ビューの定義

app \ views \ emails \ indexl.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 %>

上記のビューとは別に、もう1つのテンプレートが必要です。このテンプレートは、メッセージの送信中にEmailerの連絡方法で使用されます。 これは、標準のRails <%=%>プレースホルダーが散在するテキストです。

*app/views/contactl.erb* ファイルに次のコードを挿入するだけです。
Hi!
You are having one email message from <%= @email %> with a title
<%= @title %>
and following is the message:
<%= @message %>
Thanks

テスト用の休憩

テストする前に、マシンがインターネットに接続されており、メールサーバーとWebサーバーが稼働していることを確認してください。

次に、http://127.0.0.1:3000/Emailer/indexを使用してアプリケーションをテストします。 次の画面が表示され、この画面を使用して、誰にでもメッセージを送信できます。

メール送信

メッセージを送信した後、テキストメッセージ「メッセージが正常に送信されました」が表示されます。

Railsを使用してHTMLメールを送信する

メールをHTMLとして送信するには、ビュー(.erbファイル)がHTMLを生成し、次のように emails/app/models/emailer.rb ファイルでコンテンツタイプをhtmlに設定していることを確認します-

class Emailer < ActionMailer::Base
   def contact(recipient, subject, message, sent_at = Time.now)
      @subject = subject
      @recipients = recipient
      @from = 'no-reply@yourdomain.com'
      @sent_on = sent_at
      @body["title"] = 'This is title'
      @body["email"] = 'sender@yourdomain.com'
      @body["message"] = message
      @headers = {content_type => 'text/html'}
   end
end
*ActionMailer* の詳細については、標準のRubyドキュメントをご覧ください。