freezing_email 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ YjMyYzY5ODc3OWM5NWQwZjk5YmViMWZkNDJmYmU4MDRjMjNhMDUyNQ==
5
+ data.tar.gz: !binary |-
6
+ MWEzMzkzOWFmYWM2ODllOWEyMGM3NmFjMWVjZTA1MzZjZmFlNTkwOQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MTBkZDk5OTBkMTkyMGRkODg5N2MyZWE5N2Q5OTYzODBmMmJlNzVlMDQ4MmQ0
10
+ YzgxNzgzZDQzNzg4MTBiNzYxM2RhOWUzNGM3NmI5OTc2ODI1NDUzMTMyNmZm
11
+ ZGMwMWQxMDc1YzgwZDgyZDVmNmExYTM1ZDE4YTNmMGNjMTVmMTc=
12
+ data.tar.gz: !binary |-
13
+ MDcyZGJhYzU4NjI2Yzg4NDgzMjljOGY0MDMyMmI1YTBlYzg3MGMzZWUyM2Fi
14
+ ZDJmZmM0YjM5NGZjNTlkNDViNTBlZDE1Mjk1NGE4ZDAzOGFlZjEzZGI1OWZl
15
+ ZTk1MjdmMDI1ODUyODVhZTMyN2Q2MjgwODU0ZDU2ZjBjYzM5MTU=
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ env:
3
+ - TRAVIS=true
4
+ rvm:
5
+ - 1.9.3
6
+ - 2.0.0
7
+ branches:
8
+ only:
9
+ - master
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in freezing_email.gemspec
4
+ gemspec
5
+
6
+ gem 'pry'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Andrew8xx8
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # FreezingEmail
2
+ [![Build Status](https://travis-ci.org/kaize/freezing_email.png?branch=master)](https://travis-ci.org/kaize/freezing_email)
3
+
4
+ Saving email messages from your Rails app and view it later
5
+
6
+ ## Installation
7
+
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'freezing_email'
12
+ ```
13
+
14
+ And then execute:
15
+
16
+ ```
17
+ $ bundle
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ *Now supported only rspec integration*
23
+
24
+ ### Rspec integration
25
+
26
+ Include `FreezingEmail::Rspec` in your rspec test in wich your want to
27
+ save email messages. Looks like this:
28
+
29
+ ```ruby
30
+ describe UserMailer do
31
+ describe "password_reset" do
32
+ include FreezingEmail::Rspec
33
+ end
34
+ end
35
+ ```
36
+
37
+ Then on each test FreezingEmail will save generated deliveres in it's
38
+ store folder.
39
+
40
+ ### Configure store path
41
+
42
+ ```ruby
43
+ FreezingEmail::Config[:store_path] = "your_sexy_dir"
44
+ ```
45
+
46
+ ### Viewing saved emails
47
+
48
+ To view saved emails, include this lines in your `routes.rb`:
49
+
50
+ ```ruby
51
+ mount FreezingEmail::Web, at: "/freezed_emails", as: :freezing_email
52
+ ```
53
+
54
+
55
+ ## Contributing
56
+
57
+ 1. Fork it
58
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
59
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
60
+ 4. Push to the branch (`git push origin my-new-feature`)
61
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,15 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+ require 'cucumber/rake/task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ Cucumber::Rake::Task.new(:cucumber) do |t|
9
+ t.fork = true
10
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
11
+ end
12
+
13
+ task test_suite: [:spec, :cucumber]
14
+
15
+ task default: :test_suite
@@ -0,0 +1,37 @@
1
+ Feature: Capture and save emails generated in rspec test
2
+ Background:
3
+ Given I successfully run `bundle exec rails new testapp --skip-bundle --skip-sprockets --skip-javascript`
4
+ And I cd to "testapp"
5
+ And I add "rspec-rails" as a dependency
6
+ And I add "factory_girl_rails" as a dependency
7
+ And I add "freezing_email" from this project as a dependency
8
+ And I successfully run `bundle install`
9
+ And I successfully run `bundle exec rails g rspec:install`
10
+ And I successfully run `bundle exec rails g controller password_resets new --no-test-framework`
11
+ And I successfully run `bundle exec rails g mailer user_mailer password_reset`
12
+ And I successfully run `bundle exec rails g model user email:string password_hash:string password_salt:string password_reset_token:string password_reset_sent_at:date`
13
+ And I successfully run `bundle exec rake db:migrate RAILS_ENV=test`
14
+
15
+ @disable-bundler
16
+ Scenario: Unsng FreezingEmail to capture emails in rspec test
17
+ When I write to "spec/mailers/user_mailer_spec.rb" with:
18
+ """
19
+ require 'spec_helper'
20
+
21
+ describe UserMailer do
22
+ describe "password_reset" do
23
+ include FreezingEmail::Rspec
24
+
25
+ let(:user) { FactoryGirl.create(:user, :password_reset_token => "anything") }
26
+ let(:mail) { UserMailer.password_reset }
27
+
28
+ it "send user password reset url" do
29
+ mail.subject.should eq("Password reset")
30
+ mail.deliver
31
+ end
32
+ end
33
+ end
34
+ """
35
+ When I successfully run `bundle exec rspec`
36
+ Then the output should contain "2 examples, 0 failures, 1 pending"
37
+ Then a file named "freezed_emails/password_resets.yml" should exist
@@ -0,0 +1,13 @@
1
+ When /^I add "([^"]+)" from this project as a dependency$/ do |gem_name|
2
+ append_to_file('Gemfile', %{gem "#{gem_name}", :path => "#{PROJECT_ROOT}"\n})
3
+ end
4
+
5
+ When /^I add "([^"]+)" as a dependency$/ do |gem_name|
6
+ append_to_file('Gemfile', %{gem "#{gem_name}"\n})
7
+ end
8
+
9
+ And /^I have allready freezed emails in 'freezed_emails' folder$/ do
10
+ create_dir("#{PROJECT_ROOT}/freezed_emails/")
11
+
12
+ write_file("#{PROJECT_ROOT}/freezed_emails/password_resets", File.expand_path("../../fixtures/password_resets", __FILE__))
13
+ end
@@ -0,0 +1,7 @@
1
+ require 'aruba/cucumber'
2
+
3
+ PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze
4
+
5
+ Before do
6
+ @aruba_timeout_seconds = 3600
7
+ end
@@ -0,0 +1,19 @@
1
+ Feature: Web face
2
+ Background:
3
+ Given I successfully run `bundle exec rails new testapp --skip-bundle --skip-sprockets --skip-javascript`
4
+ And I cd to "testapp"
5
+ And I add "freezing_email" from this project as a dependency
6
+ And I successfully run `bundle install`
7
+ And I have allready freezed emails in 'freezed_emails' folder
8
+
9
+ @disable-bundler
10
+ Scenario: Integrate FreezingEmail web face to Rails
11
+ When I write to "config/routes.rb" with:
12
+ """
13
+ Testapp::Application.routes.draw do
14
+ mount FreezingEmail::Web, at: "/freezed_emails", as: :freezing_email
15
+ end
16
+ """
17
+ When I successfully run `bundle exec rake routes`
18
+ Then the output should contain "/freezed_emails"
19
+ Then the output should contain "freezing_email"
@@ -0,0 +1 @@
1
+ /Users/8xx8/projects/freezing_email/features/fixtures/password_resets
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'freezing_email/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "freezing_email"
8
+ spec.version = FreezingEmail::VERSION
9
+ spec.authors = ["Andrew8xx8"]
10
+ spec.email = ["avk@8xx8.ru"]
11
+ spec.description = %q{Saving email messages from your Rails app and view it later}
12
+ spec.summary = %q{Saving email messages from your Rails app and view it later}
13
+ spec.homepage = "https://github.com/kaize/freezing_email"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "rails", "~> 3.2.0"
22
+ spec.add_runtime_dependency 'mail'
23
+ spec.add_runtime_dependency "sinatra"
24
+ spec.add_runtime_dependency "haml"
25
+
26
+ spec.add_development_dependency "rack"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rspec", "~> 2.6"
29
+ spec.add_development_dependency "cucumber", "~> 1.0.0"
30
+ spec.add_development_dependency "aruba"
31
+ spec.add_development_dependency "coveralls"
32
+ end
@@ -0,0 +1,31 @@
1
+ class FreezingEmail::Config
2
+ class << self
3
+ @@defaults = {
4
+ store_path: "freezed_emails"
5
+ }
6
+
7
+ def [](key)
8
+ raise FreezingEmail::ConfigEntryNotFound unless key_exists?(key) || defaults_exists?(key)
9
+
10
+ if key_exists?(key)
11
+ @config[key]
12
+ else
13
+ @@defaults[key]
14
+ end
15
+ end
16
+
17
+ def key_exists?(key)
18
+ @config && @config.has_key?(key)
19
+ end
20
+
21
+ def defaults_exists?(key)
22
+ @@defaults.has_key?(key)
23
+ end
24
+
25
+
26
+ def []=(key, value)
27
+ @config ||= {}
28
+ @config[key] = value
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,16 @@
1
+ class FreezingEmail::Mail
2
+ attr_reader :delivery_handler, :subject, :body, :from, :to, :generated_in
3
+
4
+ def initialize(mail, params)
5
+ @subject = mail.subject
6
+ @body = mail.body
7
+ @to = mail.to
8
+ @from = mail.from
9
+ @delivery_handler = mail.delivery_handler.to_s
10
+ @generated_in = params[:generated_in] if params.has_key?(:generated_in)
11
+ end
12
+
13
+ def name
14
+ @name ||= "#{@subject.parameterize.tableize}"
15
+ end
16
+ end
@@ -0,0 +1,22 @@
1
+ module FreezingEmail::Rspec
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ before(:all) do
6
+ FreezingEmail::Storage.cleanup
7
+ end
8
+
9
+ after(:each) do |example_group|
10
+ dir = FreezingEmail::Config[:store_path]
11
+
12
+ ActionMailer::Base.deliveries.each do |mail|
13
+ freezing_mail = FreezingEmail::Mail.new(mail, {
14
+ generated_in: example_group.example.description.to_s
15
+ })
16
+
17
+ FreezingEmail::Storage.save(freezing_mail.name, freezing_mail)
18
+ puts "FreezingEmail: Saved email #{freezing_mail.name}"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,52 @@
1
+ class FreezingEmail::Storage
2
+ class << self
3
+ def cleanup(mask = "")
4
+ FileUtils.rm_rf(files_list(mask))
5
+ end
6
+
7
+ def index
8
+ emails = []
9
+
10
+ files_list.each do |file|
11
+ emails << load(file)
12
+ end
13
+
14
+ emails
15
+ end
16
+
17
+ def save(name, object)
18
+ File.open(expand_name(name), 'w') { |f| f.puts YAML::dump(object) }
19
+ end
20
+
21
+ def load(name)
22
+ file_name = expand_name(name)
23
+ if File.exists?(file_name)
24
+ YAML::load(IO.read(file_name))
25
+ end
26
+ end
27
+
28
+ def dir
29
+ dir = FreezingEmail::Config[:store_path]
30
+
31
+ if defined?(Rails)
32
+ dir = Rails.root.join(dir)
33
+ end
34
+
35
+ Dir.mkdir(dir) unless Dir.exists?(dir)
36
+
37
+ dir
38
+ end
39
+
40
+ private
41
+
42
+ def files_list(mask = "")
43
+ Dir.glob(File.join(dir, "#{mask}*.yml"))
44
+ end
45
+
46
+ def expand_name(name)
47
+ name = File.join(dir, "#{File.basename(name)}")
48
+ name = "#{name}.yml" unless File.extname(name) == ".yml"
49
+ name
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module FreezingEmail
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,168 @@
1
+ require 'sinatra/base'
2
+
3
+ require 'freezing_email'
4
+
5
+ module FreezingEmail
6
+ class Web < Sinatra::Base
7
+ enable :inline_templates
8
+ enable :reload_templates
9
+
10
+ helpers do
11
+ def root_path
12
+ "#{env['SCRIPT_NAME']}/"
13
+ end
14
+ end
15
+
16
+ get '/' do
17
+ emails = FreezingEmail::Storage.index
18
+ haml :index, layout: :layout, locals: { emails: emails }
19
+ end
20
+
21
+ get '/:email_name/source' do
22
+ email = FreezingEmail::Storage.load(params[:email_name])
23
+ email.body.to_s
24
+ end
25
+
26
+ get '/:email_name/view' do
27
+ email = FreezingEmail::Storage.load(params[:email_name])
28
+ haml :email, layout: :layout, locals: { email: email }
29
+ end
30
+
31
+ run! if app_file == File.expand_path($0)
32
+ end
33
+ end
34
+
35
+ __END__
36
+
37
+ @@ layout
38
+ %html
39
+ %head
40
+ %title
41
+ FreezingEmail - save emails for latter usage
42
+ %style
43
+ :plain
44
+ body {
45
+ background: url(data:image/png;base64,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)
46
+ }
47
+ .header-wrapper {
48
+ width: 100%;
49
+ height: 160px;
50
+ float: left;
51
+ clear: both;
52
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAACgCAYAAAAIJ5xTAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNzdGMTE3NDA3MjA2ODExQTg2OUEzMjZFRDRENTNBRCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMDNGRUM4MDYyMDMxMUUwQkIwN0YxNDMzRjIzRkEzOSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMDNGRUM3RjYyMDMxMUUwQkIwN0YxNDMzRjIzRkEzOSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjA1ODAxMTc0MDcyMDY4MTFBNjY3QUEwQTQ0NkUyQTY2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkY3N0YxMTc0MDcyMDY4MTFBODY5QTMyNkVENEQ1M0FEIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+3i8uWwAAASNJREFUeNrs281KxDAUhuGJ3RSbhSjOzhtwaToK7XX1Anstrl1Ii3Qj8ZySinQmSR2cle+BjxDaPBzSn12M9353ibraXaiAgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgf8nbIyxXdftczeO4zgnV2qpqR0Xfd/fy1j9QaNVsAqdXEse27atvfeVHuM4lWEY5sSu61o11ArmvM+3kqemaQ4xPANXulaNYH0/O239TuJieAJeUBeMYr0/STwCZ9EsfgLejCbxFWx/i8Zw+wO2B6lz0CO8rutnQfca59zLFtRswG8kD2VZKuSnaXqT8VXyLvk8F15wfeHt8nVLPlLoVnj9w/IhyTKcxAI+qi8BBgDMnwnTi//sKgAAAABJRU5ErkJggg==) center top repeat-x;
53
+ }
54
+ .header {
55
+ width: 880px;
56
+ height: 160px;
57
+ margin: 0 auto;
58
+ position: relative;
59
+ text-align: center;
60
+ }
61
+ .header a, .header a:visited {
62
+ display: inline-block;
63
+ position: relative;
64
+ color: #fff;
65
+ text-shadow: 1px 1px 2px black, 0 0 11em;
66
+ text-decoration: none;
67
+ }
68
+ .header h1 {
69
+ font-size: 52px;
70
+ position: relative;
71
+ color: #fff;
72
+ }
73
+ .main-wrapper {
74
+ width: 100%;
75
+ height: 160px;
76
+ float: left;
77
+ clear: both;
78
+ }
79
+ .container, .email-meta {
80
+ font-family: arial;
81
+ -webkit-border-radius: 5px;
82
+ border-radius: 5px;
83
+ -webkit-box-shadow: inset 1px 1px 3px 1px rgba(0, 0, 0, 0.5);
84
+ box-shadow: inset 1px 1px 3px 1px rgba(0, 0, 0, 0.5);
85
+ width: 820px;
86
+ margin: 20px auto;
87
+ padding: 5px
88
+ }
89
+ .container-big {
90
+ margin: 30px auto;
91
+ min-height: 20px;
92
+ background: #FFF;
93
+ width: 100%
94
+ }
95
+ .email-list {
96
+ font-family: arial;
97
+ margin: 0;
98
+ padding: 0;
99
+ }
100
+ .email-list-item {
101
+ border-bottom: 1px solid rgb(57, 49, 45);
102
+ padding: 0;
103
+ margin: 0;
104
+ list-style: none;
105
+ }
106
+ .email-list-item a {
107
+ padding: 10px;
108
+ display: block;
109
+ color: #fff;
110
+ text-decoration: none
111
+ }
112
+ .email-list-item a:hover {
113
+ background: rgb(57, 49, 45);
114
+ }
115
+ .email-meta {
116
+ width: 500px;
117
+ margin: 10px auto;
118
+ color :#fff;
119
+ }
120
+ .email-meta th {
121
+ text-align: left;
122
+ }
123
+ .email-meta th, .email-meta td {
124
+ color :#fff;
125
+ font-family: arial;
126
+ margin: 1px;
127
+ padding: 2px 4px;
128
+ }
129
+ %body
130
+ .header-wrapper
131
+ %header.header
132
+ %a.logo{ href: root_path }
133
+ %h1
134
+ FreezingEmail's
135
+ .main-wrapper
136
+ = yield
137
+
138
+ @@ index
139
+ .container
140
+ %ul.email-list
141
+ - emails.each do |email|
142
+ %li.email-list-item
143
+ %a{ href: "#{root_path}#{email.name}/view" }
144
+ .email-head
145
+ = email.to
146
+ .email-subject
147
+ = email.subject.to_s
148
+ @@ email
149
+ .email-meta
150
+ %table{ cellpadding: "2px"}
151
+ %tr
152
+ %td
153
+ Subject
154
+ %td
155
+ = email.subject.to_s
156
+ %tr
157
+ %td
158
+ From
159
+ %td
160
+ = email.from
161
+ %tr
162
+ %td
163
+ To
164
+ %td
165
+ = email.to
166
+
167
+ .container-big
168
+ != email.body.to_s