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へのリンクを作成している。