mailer作成 その6
添付ファイルを参照できるようにした。
(とりあえず)filenameがあるpartのbodyをpublic/tmp/<unique_id>ディレクトリにそのfilenameでおくようにし、メールの内容表示を行っているところでそのファイルへのリンクを作成するようにしてみた。
添付ファイルを作成するのは、list_controller.rbのshowメソッドとそれから呼ばれるcreateMultipart。
showメソッド
def show mail = Mail.find(params[:id]) unique_id = mail['unique_id'] content = mail['content'] MailParser.output_charset = "utf-8" StringIO.open(content, "r+b") {|f| message = MailParser.parse_message f @from = (message[:from]) @to = (message[:to]) @date = message[:date] @date_s = @date.strftime("%y/%m/%d %H:%M:%S") @subject = (message[:subject]) @type = message[:type] @subtype = message[:subtype] @parts = message[:parts] @body = message[:body] } if @type == 'multipart' @tmpdir = 'tmp/' + unique_id if FileTest.exists?("public/" + @tmpdir) File.rename("public/" + @tmpdir, "public/" + @tmpdir + '.bkup') end Dir.mkdir("public/" + @tmpdir) createMultipart end end
public/tmpディレクトリに添付ファイルを保持するためのディレクトリを作成するのが後半。フォルダが存在したり、同名のファイルがあったりした場合の処理をもう一工夫したいところ。
実際にファイルを作成するのは、createMultipart。
createMultipart
def createMultipart for part in @parts type = part[:type] subtype = part[:subtype] filename = part[:filename] if filename != nil && filename != "" filename = "public/" + @tmpdir + '/' + filename body = part[:body] File.open(filename, "wb") {|fd| fd.write(body) } end end end
filenameを持つpartのbodyをfilenameを名前とするファイルに格納する。メンバ変数@tmpdirに"public/"を含めないのがミソ。この@tmpdirメンバをビューから参照して、添付ファイルへのリンクをビューに作成する。添付ファイルへのアクセスは、view/list/show.rhtmlで行っているが、publicディレクトリがルートディレクトリになるため、あえて"public/"フォルダをはずしている。
show.rhtml
</tr> <% if @type == "multipart" %> <% l = @parts.length %> <% i = 0 %> <% while i < l %> <% type = @parts[i][:type] %> <% subtype = @parts[i][:subtype] %> <% filename = @parts[i][:filename] %> <% if filename == nil || filename == "" %> <tr> <td colspan="2" width="100%"><pre><%=h @parts[i][:body] %></pre></td> </tr> <% else %> <tr> <td colspan="2" width="100%"> <a href="/<%=h @tmpdir %>/<%=h filename %>"><%=h filename%></a></td> </tr> <% end %> <% i += 1%> <% end %> <% else %> <tr> <td colspan="2"><pre><%=h @body %></pre></td> </tr> <% end %>
コードを整理しきれていないが、後半のAタグの部分が添付ファイルへのリンク。/@tmpdir/filenameへのリンクを作成している。