freezing_email 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +9 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +61 -0
- data/Rakefile +15 -0
- data/features/rspec_integration.feature +37 -0
- data/features/step_definitions/rails_steps.rb +13 -0
- data/features/support/env.rb +7 -0
- data/features/web_face.feature +19 -0
- data/freezed_emails/password_resets +1 -0
- data/freezing_email.gemspec +32 -0
- data/lib/freezing_email/config.rb +31 -0
- data/lib/freezing_email/mail.rb +16 -0
- data/lib/freezing_email/rspec.rb +22 -0
- data/lib/freezing_email/storage.rb +52 -0
- data/lib/freezing_email/version.rb +3 -0
- data/lib/freezing_email/web.rb +168 -0
- data/lib/freezing_email.rb +19 -0
- data/spec/fixtures/password_resets.yml +886 -0
- data/spec/lib/freezing_email/config_spec.rb +13 -0
- data/spec/lib/freezing_email/rspec_spec.rb +4 -0
- data/spec/lib/freezing_email/storage_spec.rb +58 -0
- data/spec/lib/freezing_email/web_spec.rb +32 -0
- data/spec/lib/freezing_email.rb +4 -0
- data/spec/spec_helper.rb +13 -0
- metadata +223 -0
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
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
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,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,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,iVBORw0KGgoAAAANSUhEUgAAADwAAABaCAYAAADkUTU1AAAQMUlEQVR4XnXcaZIkuQ2E0V6vpG0kjf5ovf9tepOBlo/2FTq6zMayKjKCBAGHu5OZPe//8/c///j+/fu79+/fv5vXjx8/vvv27du7+Zlrnz59Or/PtQ8fPrz7+vXruT7/zd+emevzrLHOQ6/n5vrcOz9z3/zM3z9+/Dj3zxwz3vw9/4nFWPO++b16dsaZ8b98+XLGEZ9x5j3jzbPv//23P/14mkxQFjEDz6DzMwPPgP2ZweZePyZxn3H2YiV23p9gZ54mQxLmvs+fP5/hO/fMM3NLXONw31noK6Hv//nbH86CTdKJm02Buc/Aqi67XmV2kiTQ+V2ljbPHs6AZf1d24pRUFWzlIU/Fm7y5f/4+C56AJkN+QFV2VXQGLCwlaiojONearFbeomXf68QgiTPeXBeX2LTXjLEXLta7sFdF51kLP5X+3z9+O9g0scHnJgEIfu4DnQ1v9/Q5sJZIVSkXgPjcW37onFDgHuPhBv1rcS1MEXfGnwU367BeAmr/mkRGkdYE0QSpUPtt7vUcsuk45QTVRIYWa7x53wIlRz+XaEuKp8LD0jLeCgh+rukJmetrKwPWntkEIkCIAsu5LnF+LzEqQtsEdD1X1LQ99f28TmFPD8M4SBXiFlG5cj9kIDoLrQSVD1xvQtpzgq+MqFblrqpifJWsxGqXovBCGpOqwskGKn/pbhOhV/ci6KNFCQSx7fbxPjLcpAcFU13wL8nO9fkbOvf4M672PMkYSINl2bjX9OfOop6xeM8LApm4T8Kqs4JXVXBssi0GkvT6bjHFmvuq3zjoypLBBYIQEMS5UQ+8tBB0Kl1Y/Cl4lStpGVOAEjLzkx6Lgpz5e0PatYmJfoulvX3WMRVmJZW+LKfH9EoH2hnGARJU1mUpBVcCMk7bRODt3Va/hsV82ggimlzFO6QF59yUbPpbn/b9Lg6EVch7NQcNEBG2RYoiiarT0hZYtxIHkU2S5NQan/j/9dc//qic0E++VvaRCiEvyemdzbIWRJ4EWdmYcWo5VQlvtFo2GZwYFla9ee0GQoFmvktss2DZxaRg2wqBVmFnAZ63cEEWEYLyTIOtnFk8VGFn9+vfSmH7WkXrHcoDp8JPgXFCZWh97D0bg0JYO5SJK1H11eUDcNTr2xIiNq8MigQUedugqPwp2mwPEVOFWgCyU1NSMtowwsbuBye6XkUgF5WR7rokpFoLPdvFtW3q4Arrg8Tx0vr1eM3XVhGdN6N0tuZCL8/AFqW6xtIOzTz4I8zyQHmDdNlNSTa0bWZu78/vevf6bSwt83sB3SwIhKFQAbqL8PRhyammpO7pSSFqXCpx5LMyVqeGWGtUSBOkHR2WtTJi9Q/hCM59M3GPdsgSmajmSmjHMK5FQRhiK9kY0wL36QhUqXBRVo66xmMqizB+xZqCrgGwSMEJuosFxy6w2g3OtaIWjY2xb8eohM3vdVniEqsCXpaeAYk7SdA/+hh0NzNuBJjYq4Vct/M6MGySqrET7DYT4Kxt5u8aFwusnNH4HhScBT8xZ6FXr9s+0hc9kqGbJm6PIY5KytyHrUEbOkqEVQPWV0GMYR1UZ15BXxyHpTU2WRLYZbZXRWpQGJCyoMSQiCayxqOy0cW1h9vXlcHyTc/RSlTItE7vpwVrbBWy4S+8SwgWrI8mk3iguy29061n2b3zkbvawyf0ISSV3OTYv5u407b//f0vl6V/5XZUp71c2BRKFmPx+5naz5JO+xlR0XFttPWd05NUxKV3kaXnzuLHaQmynrgSQ3qe5AjEsCodr9NCGu7tWXUdnPl7IjrjQhvOqDL0XjLZ9+2t7+aB03KTN9oH4A4q1UlJ6NlTWdoiVQ1PeG73KiUw3tyPeKBKG0CAMZEcF9a4r5Q64rHgJ09aEmr29JydCbbUzxKDFEtQtazdaKjmPoQgR8a6uvr6cMAYTfbW8JOAqfCWi3nYImQJkZSdq41lSQtucBboeT27UVOtVu22V3mGdygCIEqVzXfnnR6uVuoZWsnhyHwJapsVumgRZdM+X49dphVkUdbTkRm3hGZMi1SUvei2yfXS1WIib3GS0KPWGbQyVM1ue2ytbB9yV61qTzMktH0smRCCayDM3K2w5898Pnkg+ha+9asb87otOi0ZpEFbYHhEI/uqJfvtQXOLRXsxLB2jbVP9bzv0cODIUi2inp1JSUZhhUwkAEMKWIY3C9dOgrQz6Xl2y4vENXDJNWf1GYnReXPsPfw5tdSndUOgBdbEvBKwzce2khap2gz/3GeuQrCwrAOjr90x1RNU+ub3oglaLr/M5gFU9EW3ZvW31dxmkjwVOtCBD7pvrn4yIU5L9K2D+EJdr/ebAK4VUYpVtbmObxY8N8se2IA0iGPyai9Y18pZwNzXvgY5LEtX67Se+KMnJaxi/blEdlcknp/gPJ9ajJfWJyWusvD8XsbcCJAkTI0hQb4yZK6ybS0hvgBF1XIdYvRvvXpRVxTNdfp9DwCaDX1axiXcKj4DyLhWMKgFWrAEtMogaxx96DxMwF1EibTEhwdaCHzi9TL7VJjQ0zSTFM4llCan7Ow5k5Q8mAQVqR0tElSw0lP9V+kSWF1giVQBxH7ax7d4mhFGo1UFa0xrQtltgHU2TZrxjK+6kKSvm3jjd48MMWX6GhFcUEXBLQfSMwC4VNz1Ce1FWCpZ61h5aS8jpfa1JLSfnzYL5EsyjWtBXpkYkC6b9wOAw0MD6bohD7cvBGggC92Mi/R2tsvwM1bZHVwFW4LbrQOiPRQsbGmweAv768Gx9NzUA3Y7HoMgnKIBBDe7t5qSVEg2gd3xuMc1i9cC3XZi+X7FgbxifUxfnrkftSCVQqtyU/iBmAWzhfRPhXlbpDjXW6UZRxXZS+wseIVokvo1CW0m7lpMKIXa015TYcxWuCEx2UYs1c8+x2g0MJXu50Ky3vGQVNHTtpAE5qLvKUrd1ROfQMlZMEia2AQGFhzWK0RAfle1hFbZ0c94w5xleYmCqqf3IEDLQNEmX9xwx/T5MH0zeLNkoeBSWBZeWLTEY7wZ/4kjyJy9NR2uppekjF3nVw5pG87cWtX1ewBQNwRa/TS+max3ngAuXNaHa63Qk0GRjDqokptxLb52sg6tG5VtcLTg3f31A/Fmp5vuQt4Alaj2LWh5BV1up5DrPVvTFcACunF42ujXQnb3J+mSdTcP7VM9d2Hw+kZeF4NhQZ+NfMOIrzOoPidREofEuv92zSI2B0iwVpPM7s6MX5t8Cucg3uLau6X4smGZet9vQXpRcBt2zIdFIUokVsdHVytjSJKT0h7mVVHxnfOs2R6OlwaRNngfaMZ5Uu+DXuVGpgVqw4DsCj8sr0rITQKQlOv9+KQVtbASZgn1Mr1v06J5md/7XwH07Ek1IKFwVSHaWa31nuD0Gcm6/ZZPLfW+KnNdEiUuzIwTKq13t8Tt0Kx5yDGKxbRXy4SVrMKx/eeeee3JhIULujzSY5ynxEIU1KigRBSJRdTp4UpS/azBvP6qp7cbsxDPlakhiZwJVOXaKhJVkzLB9/thOKIJ6GbF2iT1/jOe7YAwo4oIVLYRF8mSDLuSbtTbBk8Vaf9KRKFoTD2pdco5WhE5lZ3f7AbnIN6EhScY1JqBdYPRf7ZiW5YkiJPCBd2N1QdLfFm3SlB2705Lz5Y77pYw//zneulZtAzKTvt3+2dJ4obKkpza3EOO5hrrKTnljOpmE992mTG4P9WdOUhR+9cY5gL9+23a9kVPDgVZQ6/CzEaNwUwgMFs28oQcu+k3rorWK1sMD9BCSHC3hZi88e9Wux+1lDFRe79SsI0HkiD8slyJKqSq15JoQWXx/q5Xuym55PP6iiSIFxV7I6K6Jzb/UAs5GVwVVUtvkhbvl6QKqXmO4VBR8N6sXobWw02chatmz6ncXxR1k7F9wz211MO0sB63lL8tX9m8/rj9C2IW0UPB6mfdVY9e557ujjzDoytClQQiu54zv1NLA+7MIhsB9LXBdrIJvMGU8fWo75Js+TBmPXb7FOsj0fZoFQUqwPnaWh+XekMvgCwWrm0sRFUYiehl11UajEFPIlVVwjqPBTQWvr8LNXf7ufLIf58YfCDeD8HAQLbL0IU6CMt6oVp9Nl49dOWkvFEHtltJVWt29nmZJFEE7XAT6evD7cVWo4lQneoeYgJVveN6TcNPBLK+ZCqorfmSB307gdBZVi/pIstzn+0hugcVryazPcO+glf9/c07rVBjUp8882HYbv7fSMjr4KFIk+z2smS37zePQMX9Ni152Wyt8npuC76JBeo+ZNSEzTXkWFiac65JNLdWYpzfOSxStj9QVxgOS0Euan1Pq5Voz9aUtz/0hgX3o1PZtdhqcuFY57QD3K5Kq0gs/oDMIk5iQLzO7s1uSe8YrNuysiKS6UCg1lZgPVVLhVWJDa1FFawFeg8CxVhSahIVS7t43rj3k4ftj2vPmn33cWZlUj0E1tVwrFxD0CpuRu5eHGL6sUydoS0h+Gs7aFCY49B8ubQQ6T4TjMuEnBMNLbwxKWYso7cH51kypp9rfgS/9faST/5tc62kxErS3kMfHS5ReECg+9BOrzc4E6oAEyHoBiH7qqsH93XMe7/2+5Iw7N6trPnEoXjQ6P17pgVmZTT7TlUhHT0E73vVvRnnyY2VuVUAIuoDMHAlEpPjlXoCn4Qgx21k3iTCp4e1kLLOD3cAv7unSdoMrEoWVaf1RC5NSGPo0aw5ah0lqO/VESrMSaB/MN2eahZLBJsouh0UgMphyXnec6BNEwvjoqXvS1p3aThjrvV4FsqMu789eJLoC+I0y2DdnrWfVaa7JvCS6QliH634uz1bN2QMzF5lkPTqOvRJpsX3lGWeQ7pXLh3TVm56To2dQb4TFAmVnboo47Znn9Ak4XV0uKX92mtNkqrimC2zEHIrLBPIY/7eXzyTMbIkyG4UZHKzr0C3g1JJzCpZlTcGBbzpfe8turSHJFjTianf4lFNEFJB1a0md7GFzv48h9PZLF75k9z2JlUgS4LuOVv5pcnYO7jed52WRRXasrbPpFSP8WD6KyftxRJZGVXV93maZ4u2IqF8A22qWUsKJSp+nFY/EC/5zE3s5e6l7liwcxm3/bg3/bwwebOQ7X3bJn1GsiuLjfuJ7N4803+ZpvT6sIRV19LqqQ4GJSkmIRtl6SKniZUoMOanQV18El5i4qeNgSs8Ay1vvk3b71uZZPfGpfecVpRw3E++qo3Q0CS4b284jFkDUrNRv082uztjfTlG4735/2lt11SWK0O32iW2ni4WZj0NKXrqrKCpNrAWtXralqqnru3FSTMGX3Dm6BfTZKhE0C1eJUUw87ohbu9axpYA78l4yQaEC0vwl3Dz4gZc4Nmak3kG218e8n9MM3D7xgOOTbirpwzv/Sup0eMqRFNnUU5TsD02r3noAUCtKagbH0K8VvYK/zfbQ8xI2PVjTUQra1GVCRneVcK0ZWXzWPBm6lbLAjxjnKLR8zx+k8I93v9jmiw0i80WTQNrxLOrg1ho81OPlUEL4/YvxOk/LcH9WUwdIb1t1fGStfwfLCucCAbuttsAAAAASUVORK5CYII=)
|
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
|