これまでの経緯
- RailsでWebアプリケーションを作ろう(マスタ画面)
- Modalウィンドウでajaxのマスタ画面の実装 - OK
- 会員登録機能の作成
- メールによるユーザの認証(仮登録機能) - ここ
- メールに記載のURLで本登録(本登録機能)
- 本登録後、ログイン(ユーザ認証機能)
Action Mailer
まずは、メール送信について
RailsにはAction Mailerという機能があり、それでメールを送信することができます。
生成
Mailerクラスを生成します。
$ rails g mailer UserMailer
create app/mailers/user_mailer.rb
create app/mailers/application_mailer.rb
create app/views/user_mailer
$ rails g mailer [Mailer名]
で作成します。
基底クラスのapplication_mailer.rb
を継承している[Mailer名].rb
と本文を記載するviews/[Mailer名]
以下には、メール本文を定義します。
class UserMailer < ApplicationMailer
default from: 'hogehoge@gmail.com'
def test_email
@user = params[:user]
mail(to: 'fugafuga@gmail.com', subject: 'これはRails Application Mailerのテストです。')
end
end
このtest_mail
メソッドでviews/user_mailer/test_email.html.erb
もしくは、test_email.text.erb
を本文としてメールを送信します。
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<h1><%= @user.name %>さん、こんにちは!</h1>
<p>これはAction Mailerのテストメールです。</p>
</body>
</html>
<%= @user.name %>さん、こんにちは!
これはAction Mailerのテストメールです。
メール送信します。上記のMailerのtest_emailを
UserMailer.with(user: @user).test_email.deliver_now
送信について
**with()**によって、paramsとしてMailerActionに渡すことができます。
**with(user: @user)**とすることで、**param[:user]**で参照することが可能となるわけです。
deliver_nowとdeliver_laterの2種類のメール送信メソッドがあります。
deliver_nowは、今すぐに送信したい場合に使用します。
deliver_laterは、非同期で送信したい場合に使用します。
html.erbとtext.erb
メールのヘッダー情報はデフォルトでmultipart/alternativeとなり、これに基づいて、HTMLメールとテキストメールが送信され、受信側の設定により、HTMLメールとテキストメールがよしなに展開されます。
しかし、当然「HTML」+「テキスト」が同時に送信されるため、コンテンツによっては、サイズが肥大化することもあり、「テキストだけ送りたい」「HTMLだけ送りたい」という場合が出てくると思います。
それを制御するにはmailメソッドを以下のように記述します。
mail(to: 'hogehoge@gmail.com', subject: 'これはテストです。') do |format|
format.text #テキストメールを指定
format.html #HTMLメールを指定
end
メールの設定 ~GMail編~
以上でメール送信はできるわけですが、メールサーバの情報がないとメールは送信できません。
(他の方も書いていらっしゃいますが)GMailのアカウントを使って、メールを送信してみます。
予め、アカウントは作成されている前提でconfig/environments
以下の設定ファイルに設定します。
例では、developmentの設定ファイルに記載します。
Rails.application.configure do
...(略)...
## メールの配信方法
## :smtp -- config.action_mailer.smtp_settingsで設定可能
## :sendmail -- config.action_mailer.sendmail_settingsで設定可能
## :file: -- メールをファイルとして保存する。config.action_mailer.file_settingsで設定可能
## :test: -- メールを配列ActionMailer::Base.deliveriesに保存
config.action_mailer.delivery_method = :smtp
## メール送信失敗時エラーとするかどうか
config.action_mailer.raise_delivery_errors = true
## SMTPの設定
config.action_mailer.smtp_settings = {
## SMTPサーバでSTARTTLSが有効かどうかを検出して有効にする
:enable_starttls_auto => true,
## リモートメールサーバ
:address => 'smtp.gmail.com',
## メールサーバのポート
:port => '587',
## HELOドメイン
:domain => 'smtp.gmail.com',
## メールサーバの認証が必要な場合の認証方法
## :plain -- パスワードを平文で送信
## :login -- パスワードをBase64でエンコード
## :cram_md5 -- チャレンジ/レスポンスによる情報交換と、MD5アルゴリズムによる重要情報のハッシュ化の組み合わせ
:authentication => 'plain',
## メールサーバの認証に使用するユーザ名
:user_name => '<GMailのユーザ名>',
## メールサーバの認証に使用するパスワード
:password => '<GMailのパスワード>'
}
end
最後にGoogleアカウントの設定を変更します。
※アカウントを脆弱にさせてしまうので、気をつけて設定してください。
Googleにログイン後、アカウント設定を開きます。
アカウントのメニューの「セキュリティ」を選択します。
「セキュリティ」メニューの下の方の「安全性の低いアプリのアクセス」の「アクセスを有効にする(非推奨)」を選択します。
「安全性の低いアプリのアクセス」の「安全性の低いアプリの許可:有効」にします。
最後に
これで、Railsでメールを送信することができました。
Action Mailerは直感的でわかりやすいなぁという印象です。
ほぼほぼ、Railsガイドを舐めれば、基本的なことはできそうです。