Railsでメールフォームからのメール送信を行うサンプルをざっくりと作成
Ruby on Railsでメールフォームの作成を行って、やっと入力~確認~送信までの大方の流れがつかめたのでコードを掲載しようと思う。
本来はもう少し早く掲載しようと思っていたが、件のhtml_safeメソッドの動きの検証と、もはや20年ながらの持病の頭痛が第◯三共さんの出してる某鎮痛剤を飲んでも止めきれないほど酷かったので本日にした次第。
今回の記事は・・・書いたコードを掲載する事情で非常に長いです。
だから事前知識的な部分で、以下のものは割と先めに書いておくことにしました。
- deliver_nowメソッド
- mailメソッド
- radio_button_tag(ラジオボタン出力)、check_box_tag(チェックボックス出力)、select_tag(セレクトボックス出力)
- ついでにeachの書式
だって後から「あのコードどうだっけ?」と、いちいち記事の中身を拾うのやだもんね。
ユーザー情報登録時等のメールの送信とかは、やはりRuby on Railsの代名詞的なもので調べれば相当出てきたけど、俺がやりたかったのは「フォームの情報を引き継いだメールの送信」。
まぁとどのつまりがメールフォーム(お問い合わせフォームとも言う)の役割を果たすもの。これをRailsでやりたい。
まぁ単に習得だけなら、ユーザー情報登録後のメールの送信でもいいのかもしれないけど・・・。
けど、俺みたいなおバカはサンプルコードが沢山ある状態だとコピペコピペで「自分はできるんだ」と勘違いする。
そして、コピペで開発や制作をしていると、ものの本質の理解を得ないままに適当な仕事や作業につながっていく。
そうなるとある時点で訳がわからなくなったときにもういいやと放棄するか、ただでさえ稚拙なものを更に稚拙にした別の方法を取るしかなくなる。
・・・自他含めてそういう光景を何度となく見てきた(遠い目)。
ちょっと話が逸れたけど、今回行う内容はこんな感じ。
- 『入力画面』→『確認画面』→『実際のメールの送信』→『完了画面の表示』の流れでRailsにおけるメール送信の基礎習得を行うためのサンプルをざっくりと作成する。
- メールの送信サーバーはSMTPサーバーを指定して送信を行う(リモートサーバーならsendmailも使えるみたいだけど)。SMTPサーバーはとりあえずさくらさんの共用サーバー or Gmailを利用。
- メールフォームついでにラジオボタン、チェックボックス、セレクトボックスも使う。
- 送信メッセージはテキストエリア。改行の<br />変換を行う。(こちらの記事に付随)
- 『入力画面』→『確認画面』のデータの引き継ぎはPOSTとセッションを併用して行う。(hiddenでデータを維持するのが面倒なので。・・・セッション併用とか、もしかしたら余計面倒になってる?知らん!)
よって、『ActiveRecord_session_store』のgemは必須。(PHPだとこの辺ぜんぜん苦労しないんだがなぁ・・・。) - 悩むことを楽しんで作ること(いつも通り)
作成を行う前の事前知識
とりあえず、今回書いたところで覚えなきゃいけないもんがコードに巻かれて雑多になるのもアレなので、先に使うコードの事前知識を書いておく。
deliver_nowメソッド
メール送信を行うメソッドはcontroller側で一行で済む。(mailerを用意していること前提)
# メールの即時送信 メーラー.メーラーのメソッド(引数).deliver_now
メール送信の設定が出来ていること前提だが、上記のコードで即時送信される。
mailer側に値を渡す場合は引数も指定できる。
Ajaxで送信を行う場合は「deliver_now」→「deliver_later」。(今回はAjaxは使わないのでメモ程度)
先に触れていたユーザー情報登録時等のメールの送信も同じような形で行える。
mailメソッド
mailer側で使用し、これを利用してdeliver_nowとかで送信するメールの情報を設定する。
mail :to => 'otoiawase_moto@example.net', :subject => '件名' # こんな感じで:fromも設定できる mail :to => 'otoiawase_moto@example.net', :from => 'otoiawase_saki@example.jp', :subject => '件名'
リファレンス通りだと:toと:subjectだけだが、mailメソッドの中でも:fromは指定可能。
メールのヘッダー情報はデフォルトでmultipart/alternativeとなり、これに基づいて、HTMLメールとテキストメールが送信される。(テキストメールはメールクライアントがHTMLメールを受信しない場合に適用される)
ちなみに「テキストメールのみを送信したい!」等と言った場合は、以下のような書き方をすることで可能となる。
mail :to => 'otoiawase_moto@example.net', :subject => '件名' do | format | format.text #format.html #←コメントアウトしてるけど実際は消す end
radio_button_tag、check_box_tag
ラジオボタン&チェックボックスはview側で以下のコードで作成可能。
radio_button_tag :name => :input_name, :value => 'value', {property} # selected radio_button_tag :name => :input_name, :value => 'value', {:checked => true} # ラジオボタンで受け取るデータを同一param上で多重配列として扱う場合は以下の書き方 radio_button_tag :name => 'input_name[radio][]', :value => '', {property} check_box_tag :name => :input_name, :value => 'value', {property} # selected check_box_tag :name => :input_name, :value => 'value', {:checked => true} # ラジオボタンで受け取るデータを同一param上で多重配列として扱う場合は以下の書き方 check_box_tag :name => 'input_name[check][]', :value => '', {property}
これで<input type=”radio” name=”input_name”>、<input type=”checkox” name=”input_name”>が出力される。
基本的に双方とも書き方は同じ。第三引数でハッシュ指定されている{property}のところに、その他のHTMLの属性を書いていく。
checkedについては送信するデータの取扱いの仕様に応じて適宜つければいいと思う。
nameをネストしたハッシュとして扱う場合は直接指定する。というか書式をできる限り合わせたくて試行錯誤したけど、どうしてもこの書き方に辿り着いてしまう・・・orz
select_tag
セレクトボックス(選択肢)はview側で以下のコードで作成可能。
select_tag :name => :input_name, options_for_select({property}, :selected) # 選択肢とselectedを出力する場合 select_tag 'name', options_for_select({ '選択して下さい' => '', '選択肢1を選択する' => '選択肢1', '選択肢2を選択する' => '選択肢2', '選択肢3を選択する' => '選択肢3', }, :selected => '選択肢1')
これで<select name=”input_name”></select>が出力される。<option>の設定は、options_for_selectメソッドの第一引数の{property}で指定する。
<option>については「’セレクトボックスに表示する文字列’ => ‘受け取るvalue’」が基本的な書式となり、これで<option value=”受け取るvalue”>セレクトボックスに表示する文字列</option>が出力される。selected属性は受け取るvalueで適宜変更。
eachの構文
配列とハッシュからデータを取り出す、PHPで言うところのforeach。
配列orハッシュ.each do |key, val| ~~~ end
Rails(というかRuby)はこれでループ可能。
・・・なのだが、PHPのforeach($array as $key => $val)に慣れてしまっているところ、この書き順に得も言われぬ違和感を覚える。
今回、抑える事前知識はこんなところかな?
こいつらを利用して、メールフォームをレッツメイキング。
メールフォームを実際に作成してみる
前準備
まずはメールを送信する際の根幹になる部分mailerの作成を行う。
一個作っておけば後は同じような内容でmailerを作っていけばいいけど、この時点では初期状態のコードさえないので、最初はお馴染みrails generateを使用。
rails generate mailer mailform_mailer mailform
これでapp/mailersディレクトリにcontrollerに相当する「mailform_mailer.rb」、app/viewsの「mailform_mailer」ディレクトリにテンプレートに相当する「mailform.html.erb」「mailform.text.erb」が作成される。
とりあえず、これらのファイルの編集はメールフォーム作成中に編集しても問題ないのでとりあえず作成して置いておく。後回し。
次に、メール送信を行うためにSMTPサーバーを指定する。
「config/environments」のディレクトリから「development.rb」を編集。(本番環境で起動モードが「-e production」なら「production.rb」)
「config.action_mailer.raise_delivery_errors」か「config.action_mailer.perform_caching」あたりで当該のファイルを検索してそこへ追記。
さくらさんの共用サーバーのメールを利用する場合
config.action_mailer.raise_delivery_errors = true # エラー出力は絶対にtrueにしておく! ~~~ config.action_mailer.default_url_options = { :host => 'localhost', # サーバーのホスト(非メールサーバー) :port => 3000 # アプリのポート番号を指定(本番環境なら無くてもOK) } config.action_mailer.delivery_method = :smtp # SMTPを指定。リモートなら:sendmailでいけるかも config.action_mailer.smtp_settings = { :enable_starttls_auto => true, # tlsでのメールの暗号化を有効に :address => 'SAKURAUSER.sakura.ne.jp', # SMTPサーバーのaddressという意味。借りているさくらさんの共用サーバーの共通ドメインを指定 :port => '587', # さくらさんの共用サーバーのSMTPのポート :domain => 'example.jp', # 独自ドメイン(必須ではない、というかなくても動く) :user_name => 'MAILUSER@example.jp', # さくらさんの場合はメアドがメールユーザー名 :password => 'hogehoge', # メアドのパスワード :authentication => 'plain' # tlsで既に暗号化されてるのでプレインテキスト認証を指定 }
多分、XSERVERさんとかでも同じ感じで記述できるはず。
Gmailを利用する場合
# 以下は↑と同じように設定 # config.action_mailer.raise_delivery_errors # config.action_mailer.default_url_options # config.action_mailer.delivery_method config.action_mailer.smtp_settings = { :enable_starttls_auto => true, :address => 'smtp.gmail.com', :port => '587', :domain => 'smtp.gmail.com', # 多分なくてもいいと思う :user_name => 'GoogleUSER@gmail.com', # Gmailもメアドがメールユーザー名 :password => 'hogehoge', :authentication => 'plain' }
Gmailでの設定は大方どこでも掲載されているので書く必要あるのか疑問だけど一応。
次に、mailerのcontrollerに相当するファイルを「app/mailers」のディレクトリから編集する。
今回の場合は「mailform_mailer.rb」。
mailform_mailer.rb
class MailformMailer < ApplicationMailer # Subject can be set in your I18n file at config/locales/en.yml # with the following lookup: # # en.mailform_mailer.mailform.subject # default :from => 'MAILUSER@example.jp' def mailform(post_data_mail = nil) @mail_data = post_data_mail # テストする際には、@mail_data['email']を「送信元の固定メアド」、@mail_data['subject']を「テスト」とでも。 mail :to => 'MAILUSER@example.jp', :from => @mail_data['email'], :subject => @mail_data['subject'] end end
初期状態から上記のような感じで書き換え。
実際は書き換えを行う前に、固定のメアドや件名を指定してちゃんとメールの送信ができるかどうかを確認しておくこと。じゃないと余計なところでハマるので。
あと、このmailerから呼び出されるテンプレート「views/mailform_mailer/mailform.html.erb」と「views/mailform_mailer/mailform.text.erb」には、初期状態のmailer側で指定された変数が入っていたような気もする。(うろ覚え)
テストの際は、development.rbでconfig.action_mailer.raise_delivery_errorsを指定してるので、送信失敗時のエラーはきちんと見られるはず。
指定しないと送信エラーがあったとしても、あたかもエラーなく送信されてるかのように見えるので注意。
ともあれ、後でフォームからのデータを取得するようにするために上記のような書き方をしている。
mailメソッドについては先に事前知識で触れたとおりだが、上記ではmailに:fromを指定している。
メールフォームからのfromは可変なので、defaultは念のために自メールアドレスを指定してるが多分いらないはず。
とりあえず、これで前準備は終わり。
次はフォームの内容をcontollerとviewに書いていく。
フォームの内容をcontollerとviewに記述する
contollerとviewについては既に習得し終えてるので、ここはズラッとしたソースコード。
ソースコード書いた後にポイントとなる部分を少しだけ書いてみる。
ルーティングの設定
match 'mailforms/mailform' => 'mailforms#mailform', :via => [:get, :post] # 入力画面 match 'mailforms/mailform_confirm' => 'mailforms#mailform_confirm', :via => [:get, :post] # 確認画面 match 'mailforms/mailform_thanks' => 'mailforms#mailform_thanks', :via => [:get, :post] # 送信完了画面
ここのポイント
- 各画面を表示させられるように上記のようにルーティングを設定。
入力画面(controller)
#class MailformsController < ApplicationController def mailform # 確認画面とのやり取り用。既にセッションあったら確認画面のデータ引継ぎ、通常のアクセスであれば初期化。 session[:mailform] = session[:mailform].nil? ? nil : session[:mailform] @post_data = Hash.new # 入力エラーのレスポンス @response = { :error => false, :notice_subject => '', :notice_message => '', :notice_email => '', } if !params['send_data'].nil? then # 送信ボタンを押した後の処理 @post_data = params['send_data'] @post_data['radio'] = @post_data['radio'].nil? ? Array.new : @post_data['radio'] @post_data['check'] = @post_data['check'].nil? ? Array.new : @post_data['check'] session[:mailform] = @post_data if session[:mailform]['subject'] == '' || session[:mailform]['message'] == '' || session[:mailform]['email'] == '' then @response[:error] = true end # 入力エラー1 if session[:mailform]['subject'] == '' then @response[:notice_subject] = '件名を入力して下さい。' end # 入力エラー2 if session[:mailform]['message'] == '' then @response[:notice_message] = 'メッセージを入力して下さい。' end # 入力エラー3 if session[:mailform]['email'] == '' then @response[:notice_email] = 'メールアドレスを入力して下さい。' end # エラーフラグを見て、エラーなければ確認画面呼び出し if !@response[:error] then redirect_to :action => 'mailform_confirm' end elsif !session[:mailform].nil? then # 確認画面から戻したら、上でのセッションデータを変数に引き継いでセッションをクリア @post_data = session[:mailform] session[:mailform] = nil end end
ここのポイント
- 最初の表示、確認画面からの再表示共にmailformのcontrollerに一度回帰すると言う形。最初の表示で入力・送信して、確認画面が表示可能であればそちらへ移行、そうでなければ同一の画面を表示する。
- 当初は単なる送信にしようと思ったけど、入力エラーのアタリの箇所を付けたかったので、「入力エラー」の各コメント部分で記述。他のデータチェックとかもこんな感じで行えるはず。
- paramsから受け取ったラジオボタンやチェックボックスの内容がnil(未入力)の際は、空配列を代替値として持たせる。
- エラー表示時の再描画、確認画面移行のどちらでも対応させるため、POSTのデータは変数@post_data・セッション配列session[:mailform]でのマルチで管理。
基本的に再描画時の出力目的で@post_dataを利用、データやりとりはsession[:mailform]を利用。
入力画面(view)
<h1>お問い合わせ</h1> <%= form_tag({:controller => 'mailforms', :action => 'mailform'}) do %> <table> <tr> <th style="width: 160px;">件名(必須)</th> <td> <% recursive = nil if !@post_data['subject'].nil? then recursive = @post_data['subject'] end %> <%= text_field 'send_data', 'subject', :value => recursive %> <div><%= @response[:notice_subject] %></div> </td> </tr> <tr> <th>メールアドレス(必須)</th> <td> <% recursive = nil if !@post_data['email'].nil? then recursive = @post_data['email'] end %> <%= text_field 'send_data', 'email', :value => recursive %> <div><%= @response[:notice_email] %></div> </td> </tr> <tr> <th>好きなメーカー</th> <td> <% recursive = Array.new if !@post_data['radio'].nil? then recursive[0] = @post_data['radio'].include?('HONDA') ? {:checked => true} : nil recursive[1] = @post_data['radio'].include?('Kawasaki') ? {:checked => true} : nil recursive[2] = @post_data['radio'].include?('YAMAHA') ? {:checked => true} : nil recursive[3] = @post_data['radio'].include?('SUZUKI') ? {:checked => true} : nil end %> <label><%= radio_button_tag 'send_data[radio][]', 'HONDA', recursive[0] %> HONDAは王道</label> <label><%= radio_button_tag 'send_data[radio][]', 'Kawasaki', recursive[1] %> Kawasakiは最強</label> <label><%= radio_button_tag 'send_data[radio][]', 'YAMAHA', recursive[2] %> YAMAHAは堅実</label> <label><%= radio_button_tag 'send_data[radio][]', 'SUZUKI', recursive[3] %> SUZUKIはメジャー度・走行性能・フィーリング、そして何より外観、全てが他三社を超越している!つまりSUZUKIは唯一愛すべき全知全能の神である!GOD!!ONLY LOVE!!!</label> </td> </tr> <tr> <th>好きな果実</th> <td> <% recursive = Array.new if !@post_data['check'].nil? then recursive[0] = @post_data['check'].include?('オレンジ') ? {:checked => true} : nil recursive[1] = @post_data['check'].include?('バナナ') ? {:checked => true} : nil recursive[2] = @post_data['check'].include?('ぶどう') ? {:checked => true} : nil recursive[3] = @post_data['check'].include?('メロン') ? {:checked => true} : nil end %> <label><%= check_box_tag 'send_data[check][]', 'オレンジ', recursive[0] %> オレンジ</label> <label><%= check_box_tag 'send_data[check][]', 'バナナ', recursive[1] %> バナナ</label> <label><%= check_box_tag 'send_data[check][]', 'ぶどう', recursive[2] %> ぶどう</label> <label><%= check_box_tag 'send_data[check][]', 'メロン', recursive[3] %> メロン</label> </td> </tr> <tr> <th>向かいたい方角</th> <td> <% recursive = nil if !@post_data['select'].nil? then recursive = @post_data['select'] end %> <label><%= select_tag 'send_data[select]', options_for_select({ '選択して下さい' => '', '東' => '東へ', '西' => '西へ', '南' => '南へ', '北' => '北へ', }, :selected => recursive) %></label> </td> </tr> <tr> <th>メッセージ(必須)</th> <td> <% recursive = nil if !@post_data['message'].nil? then recursive = @post_data['message'] end %> <%= text_area 'send_data', 'message', :value => recursive %> <div><%= @response[:notice_message] %></div> </td> </tr> </table> <p><%= submit_tag '送信内容確認' %></p> <% end %>
ここのポイント
- controller側で@post_dataをHash.newで第一階層のハッシュを作成するように初期化しているので、最初の表示の際は!@post_data[‘hoge’].nil?の全ての条件がスルーされる。
そして、確認画面から戻ったときは@post_dataの各添字のデータはラジオボタンとチェックボックスを除いて、未入力でも空白文字が入ってくるため条件を参照できる。 - ラジオボタン、チェックボックスの書式はほぼ事前知識の方に書いている通り。
行き戻りの設定のため変数(配列)でcheckedを指定。 - ラジオボタンとチェックボックスには、当該の添字のところへcontroller側でArray.newをしているため、確認画面から戻ったときには空配列が来る。
よって!@post_data[‘hoge’].nil?の条件は満たされ、更に、値が含まれるかどうかをチェックするinclude?を使用して条件毎値代入。仮に未チェックで送信したとしてもラジオボタンとチェックボックスは空白なだけになる。
あとはこれらを元に、radio_button_tag及びcheck_box_tagのselected=”selected”のプロパティである{:checked => true}を付ける。 - セレクトボックスも同じく。ただしこちらはテキストで取れるのでselectedはvalueを直指定。
考えようによってはラジオボタンも同じか・・・?まぁいいや。 - みんな!SUZUKIだ!SUZUKIを買ええええええ!!(ば◯おんの某きりんさん風)・・・俺はHONDA乗りだけどな!!!
確認画面(controller)
#class MailformsController < ApplicationController def mailform_confirm @post_data = Hash.new if !session[:mailform].nil? then if !params[:commit].nil? then # 確認画面より送信を行う if params[:commit] == '送信' then # 送信ボタンが押されたときはmailer側へデータを移行 post_data_mail = session[:mailform] session[:mailform] = nil MailformMailer.mailform(post_data_mail).deliver_now redirect_to :action => 'mailform_thanks' else # 再編集を行う時(セッションはそのまま保持される) redirect_to :action => 'mailform' end else # 入力画面からの確認画面の表示時 @post_data = session[:mailform] end else # 直接アクセスされた場合はセッションクリアした上で戻す session[:mailform] = nil redirect_to :action => 'mailform' end end
ここのポイント
- なんとcontoller→mailerに移行するときにはsessionが引き継がれない。
まぁ、mailerはActive Recordを参照してないので当たり前といえば当たり前だけど・・・。
そのため、セッションのデータは引数へ渡す。 - 再編集を行う際はセッションから送信確認前のデータを再帰させる。
- このページへの直接アクセスがあった場合、入力画面へ強制的に戻す。セッションは強制的に削除。慈悲はない。
- 最終的に送信が押された際にdeliver_nowメソッドでメールを飛ばす。ここもほぼ事前知識の方に書いている通り。
確認画面(view)
<h1>送信内容の確認</h1> <p>下記の内容で送信します。よろしいですか?</p> <%= form_tag({:controller => 'mailforms', :action => 'mailform_confirm'}) do %> <table> <tr> <th>件名</th> <td> <% recursive = @post_data['subject'] %> <div><%= recursive %></div> </td> </tr> <tr> <th>件名</th> <td> <% recursive = @post_data['email'] %> <div><%= recursive %></div> </td> </tr> <tr> <th>好きなメーカー</th> <td> <% recursive = @post_data['radio'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> <%= recursive %> </td> </tr> <tr> <th>好きな果実</th> <td> <% recursive = @post_data['check'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> <%= recursive %> </td> </tr> <tr> <th>向かいたい方角</th> <td> <% recursive = @post_data['select'] %> <%= recursive %> </td> </tr> <tr> <th>メッセージ</th> <td> <% recursive = html_escape(@post_data['message']) recursive = recursive.gsub(/(\r\n|\r|\n)/, '<br />') %> <%= recursive.html_safe %> </td> </tr> </table> <p><%= submit_tag '再編集' %> <%= submit_tag '送信' %></p> <% end %>
ここのポイント
- 直接アクセスがあった場合、controller側で入力画面へ強制的に戻すため、空値チェックとかは入れていない。
- テキストエリアに設定している改行コードの取扱いについてはこちらの記事での検証をもとに設定している。
ここで少し補足するとテキストエリアに最初から入っているHTMLを置き換え、その後、改行コードを置き換えていくという形。 - ラジオボタンやチェックボックスはeachで読み出し。
ちなみにeach do |key, val|としてやることで配列キーも取り出せる。(今回は必要ないのでkeyは省略) - controller側でここのsubmit_tagの値をチェック、それによって再編集か送信を切り分ける。
送信完了画面(controller)
#class MailformsController < ApplicationController def mailform_thanks # 念のためセッション削除 if !session[:mailform].nil? then session[:mailform] = nil end end
ここのポイント
- まぁうん。ない・・・ね。
送信完了画面(view)
<h1>送信完了</h1> <p>お問い合わせいただきありがとうございました。<br />メールの確認後、担当者からご連絡いたします。</p> <p><%= link_to 'お問い合わせに戻る', {:controller => 'mailforms', :action => 'mailform'} %></p>
ここのポイント
- 同上。
これで、controllerとviewのコードは完了。
次はいよいよ、ここで入力したりしたデータをメールに投げてみる。
フォームの入力内容からメールを送信する
上2項でメールの送信設定、操作画面のフロントエンド・バックエンドの動きはほぼほぼできた。
残りは実際に飛ばすメールの内容のみ。この辺は、リファレンス通りにコーディングしていく。
HTMLでのメール内容(view)
<h1>お問い合わせを受信しました。</h1> <% recursive = @mail_data['subject'] %> <h2>件名</h2> <p><%= recursive %></p> <% recursive = @mail_data['radio'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> <h2>好きなメーカー(ラジオボタン)</h2> <p><%= recursive %></p> <% recursive = @mail_data['check'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> <h2>好きな果実(チェックボックス)</h2> <p><%= recursive %></p> <% recursive = @mail_data['select'] %> <h2>向かいたい方角</h2> <p><%= recursive %></p> <% recursive = html_escape(@mail_data['message']) recursive = recursive.gsub(/(\r\n|\r|\n)/, '<br />') %> <h2>メッセージ</h2> <%= recursive.html_safe %>
テキストでのメール内容(view)
お問い合わせを受信しました。 <% recursive = @mail_data['subject'] %> 件名: <%= recursive %> <% recursive = @mail_data['radio'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> 好きなメーカー(ラジオボタン): <%= recursive %> <% recursive = @mail_data['check'] string = '' recursive.each do |val| string = string + '【' + val + '】' end recursive = string string = nil %> 好きな果実(チェックボックス): <%= recursive %> <% recursive = @mail_data['select'] %> 向かいたい方角: <%= recursive %> <% recursive = @mail_data['message'] %> メッセージ: <%= recursive %>
これで、メールのフォーマットは設定完了。
締め
これでメールフォームのざっくりとした作成がほぼ完了した。
あとは実際にメールフォームを動かしてみて、フォームの情報からのメールが送信されるか見てみる。
入力画面
送信内容確認画面
受け取ったメール
ざっくりと作成してざっくりとテスト。
どうせ習作なので細かい部分はおざなりにしてるが、ひとまず想定していた動きができたので満足。
いやぁ!大変だった、大変だった!
何が大変って?
この記事書くのがだよ。
正直、コードは調べながらも1~2日程度でできたもんだけど、この記事書くのに校正とか含めて3日かかってるという不思議。
ってか、長文書くと流石に結構しんどい。
そういえば、作ってる間、リファレンスサイトさんをちょくちょく見てたけど、なんかサーバーが落ちてるね。
誤植は多少あれども基本的なところは抑えていたので、なんやかんやいいながら他のサイトさんと併せて見て重宝してたんだけどなぁ。
Google先生のサーチ結果からも次々URLが削除されているみたいだし、これは閉鎖された感じなのかな・・・?
・・・少し残念だ。