mail_male_mail 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +4 -0
- data/Gemfile.lock +78 -0
- data/README.md +67 -1
- data/lib/mail_male_mail.rb +41 -5
- data/lib/mail_male_mail/configuration.rb +4 -1
- data/lib/mail_male_mail/mailgun.rb +12 -0
- data/lib/mail_male_mail/sendgrid.rb +22 -0
- data/lib/mail_male_mail/version.rb +1 -1
- data/mail_male_mail.gemspec +3 -1
- data/spec/config/mail_male_mail.yml +32 -0
- data/spec/mail_male_mail/mailgun_spec.rb +21 -0
- data/spec/mail_male_mail/sendgrid_spec.rb +20 -0
- data/spec/mail_male_mail_spec.rb +8 -0
- data/spec/spec_helper.rb +26 -0
- metadata +49 -3
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
mail_male_mail (0.0.2)
|
5
|
+
actionmailer (>= 3.0.0)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
actionmailer (3.2.13)
|
11
|
+
actionpack (= 3.2.13)
|
12
|
+
mail (~> 2.5.3)
|
13
|
+
actionpack (3.2.13)
|
14
|
+
activemodel (= 3.2.13)
|
15
|
+
activesupport (= 3.2.13)
|
16
|
+
builder (~> 3.0.0)
|
17
|
+
erubis (~> 2.7.0)
|
18
|
+
journey (~> 1.0.4)
|
19
|
+
rack (~> 1.4.5)
|
20
|
+
rack-cache (~> 1.2)
|
21
|
+
rack-test (~> 0.6.1)
|
22
|
+
sprockets (~> 2.2.1)
|
23
|
+
activemodel (3.2.13)
|
24
|
+
activesupport (= 3.2.13)
|
25
|
+
builder (~> 3.0.0)
|
26
|
+
activesupport (3.2.13)
|
27
|
+
i18n (= 0.6.1)
|
28
|
+
multi_json (~> 1.0)
|
29
|
+
builder (3.0.4)
|
30
|
+
columnize (0.3.6)
|
31
|
+
debugger (1.5.0)
|
32
|
+
columnize (>= 0.3.1)
|
33
|
+
debugger-linecache (~> 1.2.0)
|
34
|
+
debugger-ruby_core_source (~> 1.2.0)
|
35
|
+
debugger-linecache (1.2.0)
|
36
|
+
debugger-ruby_core_source (1.2.0)
|
37
|
+
diff-lcs (1.2.3)
|
38
|
+
erubis (2.7.0)
|
39
|
+
hike (1.2.2)
|
40
|
+
i18n (0.6.1)
|
41
|
+
journey (1.0.4)
|
42
|
+
mail (2.5.3)
|
43
|
+
i18n (>= 0.4.0)
|
44
|
+
mime-types (~> 1.16)
|
45
|
+
treetop (~> 1.4.8)
|
46
|
+
mime-types (1.22)
|
47
|
+
multi_json (1.7.2)
|
48
|
+
polyglot (0.3.3)
|
49
|
+
rack (1.4.5)
|
50
|
+
rack-cache (1.2)
|
51
|
+
rack (>= 0.4)
|
52
|
+
rack-test (0.6.2)
|
53
|
+
rack (>= 1.0)
|
54
|
+
rspec (2.13.0)
|
55
|
+
rspec-core (~> 2.13.0)
|
56
|
+
rspec-expectations (~> 2.13.0)
|
57
|
+
rspec-mocks (~> 2.13.0)
|
58
|
+
rspec-core (2.13.1)
|
59
|
+
rspec-expectations (2.13.0)
|
60
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
61
|
+
rspec-mocks (2.13.1)
|
62
|
+
sprockets (2.2.2)
|
63
|
+
hike (~> 1.2)
|
64
|
+
multi_json (~> 1.0)
|
65
|
+
rack (~> 1.0)
|
66
|
+
tilt (~> 1.1, != 1.3.0)
|
67
|
+
tilt (1.3.7)
|
68
|
+
treetop (1.4.12)
|
69
|
+
polyglot
|
70
|
+
polyglot (>= 0.3.1)
|
71
|
+
|
72
|
+
PLATFORMS
|
73
|
+
ruby
|
74
|
+
|
75
|
+
DEPENDENCIES
|
76
|
+
debugger
|
77
|
+
mail_male_mail!
|
78
|
+
rspec
|
data/README.md
CHANGED
@@ -1,4 +1,70 @@
|
|
1
1
|
MailMaleMail
|
2
2
|
==============
|
3
3
|
|
4
|
-
Manage mail configurations using configuration instead of code. This allows you to cleanly and easily swap mail settings.
|
4
|
+
Manage mail configurations using configuration instead of code. This allows you to cleanly and easily swap mail settings.
|
5
|
+
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
### Config File
|
10
|
+
|
11
|
+
Create a config in config/mail_male_mail.yml file and specify your settings
|
12
|
+
|
13
|
+
```
|
14
|
+
#config/mail_male_mail.yml
|
15
|
+
production: &production
|
16
|
+
mailman_1:
|
17
|
+
delivery_method: smtp
|
18
|
+
smtp_settings:
|
19
|
+
address: "smtp.gmail.com"
|
20
|
+
port: 587
|
21
|
+
development:
|
22
|
+
<%= "<<: *production" if ENV['SEND_REAL_EMAILS'] == '1' %>
|
23
|
+
default:
|
24
|
+
delivery_method: letter_opener
|
25
|
+
test:
|
26
|
+
default:
|
27
|
+
delivery_method: test
|
28
|
+
```
|
29
|
+
|
30
|
+
### Mailman
|
31
|
+
|
32
|
+
In your mailer specify the 'mailman' to deliever the mail:
|
33
|
+
|
34
|
+
```
|
35
|
+
class MainMailer < ActionMailer::Base
|
36
|
+
mailman :mailman_1
|
37
|
+
end
|
38
|
+
```
|
39
|
+
|
40
|
+
### Categories/Variables
|
41
|
+
|
42
|
+
MailMaleMale supports Sendgrid Categories/UniqArgs and Mailgun Tags/Varibales
|
43
|
+
|
44
|
+
<table>
|
45
|
+
<tr><th>MailMaleMail</th><th>Sendgrid</th><th>Mailgun</th></tr>
|
46
|
+
<tr><td>category</td><td>category</td><td>tag</td></tr>
|
47
|
+
<tr><td>variables</td><td>unique args</td><td>variables</td></tr>
|
48
|
+
</table>
|
49
|
+
|
50
|
+
```
|
51
|
+
class MainMailer < ActionMailer::Base
|
52
|
+
def test_email
|
53
|
+
set_mail_male_mail_category("CategoryName")
|
54
|
+
set_mail_male_mail_variables(:key1 => "value1", :key2 => "value2")
|
55
|
+
mail(...)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
```
|
59
|
+
|
60
|
+
To add this functionality, add sendgrid/mailgun to the provider in your config
|
61
|
+
|
62
|
+
```
|
63
|
+
#config/mail_male_mail.yml
|
64
|
+
production:
|
65
|
+
sendgrid_mailman:
|
66
|
+
provider: sendgrid
|
67
|
+
mailgun_mailman:
|
68
|
+
provider: mailgun
|
69
|
+
```
|
70
|
+
|
data/lib/mail_male_mail.rb
CHANGED
@@ -1,13 +1,19 @@
|
|
1
1
|
require "yaml"
|
2
|
+
require 'json'
|
2
3
|
require "action_mailer"
|
4
|
+
require "mail_male_mail/sendgrid"
|
5
|
+
require "mail_male_mail/mailgun"
|
6
|
+
require "mail_male_mail/configuration"
|
3
7
|
|
4
8
|
module MailMaleMail
|
5
|
-
|
6
|
-
|
9
|
+
PROVIDERS = %w(sendgrid mailgun)
|
7
10
|
|
8
11
|
if defined? Rails::Railtie
|
9
12
|
class MailMaleMailRailtie < Rails::Railtie
|
10
13
|
initializer "mail_male_mail_initializer" do |app|
|
14
|
+
unless File.exist? MailMaleMail::Configuration.filepath
|
15
|
+
raise LoadError, "#{MailMaleMail::Configuration.filepath} is required for MailMaleMail and does not exist"
|
16
|
+
end
|
11
17
|
ActionMailer::Base.send(:include, MailMaleMail)
|
12
18
|
end
|
13
19
|
end
|
@@ -17,16 +23,46 @@ module MailMaleMail
|
|
17
23
|
base.extend(ClassMethods)
|
18
24
|
base.class_eval do
|
19
25
|
Configuration.load
|
26
|
+
include(Sendgrid)
|
27
|
+
include(Mailgun)
|
28
|
+
class << self
|
29
|
+
attr_accessor :mmm_provider
|
30
|
+
end
|
31
|
+
attr_accessor :mmm_category, :mmm_variables
|
32
|
+
alias_method_chain :mail, :mmm_headers
|
33
|
+
|
20
34
|
mailman('default')
|
21
35
|
end
|
22
36
|
end
|
23
37
|
|
38
|
+
def mail_with_mmm_headers(headers={}, &block)
|
39
|
+
mail_without_mmm_headers(headers, &block).tap do |m|
|
40
|
+
send("write_#{self.class.mmm_provider}_headers") if self.class.mmm_provider
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def mail_male_mail_category(category)
|
45
|
+
self.mmm_category = category
|
46
|
+
end
|
47
|
+
|
48
|
+
def mail_male_mail_variables(variables)
|
49
|
+
if variables.is_a?(Hash)
|
50
|
+
self.mmm_variables = variables
|
51
|
+
else
|
52
|
+
raise TypeError, "variables must be a Hash"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
24
56
|
module ClassMethods
|
25
57
|
def mailman(name)
|
26
|
-
config = Configuration.get(name)
|
27
|
-
if config
|
58
|
+
if config = Configuration.get(name)
|
28
59
|
self.delivery_method = config['delivery_method'].to_sym if config.key?('delivery_method')
|
29
|
-
|
60
|
+
if config.key?('smtp_settings') && config['smtp_settings'].is_a?(Hash)
|
61
|
+
self.smtp_settings = config['smtp_settings'].symbolize_keys
|
62
|
+
end
|
63
|
+
if config.key?('provider') && PROVIDERS.include?(config['provider'])
|
64
|
+
self.mmm_provider = config['provider']
|
65
|
+
end
|
30
66
|
end
|
31
67
|
end
|
32
68
|
end
|
@@ -3,8 +3,11 @@ require "yaml"
|
|
3
3
|
module MailMaleMail
|
4
4
|
class Configuration
|
5
5
|
class <<self
|
6
|
+
def filepath
|
7
|
+
@filepath ||= Rails.root.join("config/mail_male_mail.yml")
|
8
|
+
end
|
6
9
|
def load
|
7
|
-
@configurations ||= YAML.load(ERB.new(File.read(
|
10
|
+
@configurations ||= YAML.load(ERB.new(File.read(filepath)).result)[Rails.env]
|
8
11
|
end
|
9
12
|
|
10
13
|
def get(name)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module MailMaleMail
|
2
|
+
module Mailgun
|
3
|
+
def write_mailgun_headers
|
4
|
+
if mmm_category == :use_subject_lines
|
5
|
+
self.headers['X-Mailgun-Tag'] = message.subject
|
6
|
+
elsif mmm_category
|
7
|
+
self.headers['X-Mailgun-Tag'] = mmm_category
|
8
|
+
end
|
9
|
+
self.headers['X-Mailgun-Variables'] = mmm_variables.to_json.gsub(/(["\]}])([,:])(["\[{])/, '\\1\\2 \\3') if mmm_variables
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MailMaleMail
|
2
|
+
module Sendgrid
|
3
|
+
def write_sendgrid_headers
|
4
|
+
self.headers['X-SMTPAPI'] = build_sendgrid_json
|
5
|
+
end
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
def build_sendgrid_json
|
10
|
+
header_opts = {}
|
11
|
+
|
12
|
+
if mmm_category == :use_subject_lines
|
13
|
+
header_opts[:category] = message.subject
|
14
|
+
elsif mmm_category
|
15
|
+
header_opts[:category] = mmm_category
|
16
|
+
end
|
17
|
+
header_opts[:unique_args] = mmm_variables if mmm_variables
|
18
|
+
|
19
|
+
header_opts.to_json.gsub(/(["\]}])([,:])(["\[{])/, '\\1\\2 \\3')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/mail_male_mail.gemspec
CHANGED
@@ -14,5 +14,7 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.require_paths = ["lib"]
|
15
15
|
gem.version = MailMaleMail::VERSION
|
16
16
|
|
17
|
-
gem.
|
17
|
+
gem.add_dependency "actionmailer", ">= 3.0.0"
|
18
|
+
gem.add_development_dependency "rspec"
|
19
|
+
gem.add_development_dependency "debugger"
|
18
20
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
production:
|
2
|
+
default: &default
|
3
|
+
delivery_method: test
|
4
|
+
smtp_settings:
|
5
|
+
address: 'smtp.gmail.com'
|
6
|
+
port: 587
|
7
|
+
|
8
|
+
invalid_provider:
|
9
|
+
<<: *default
|
10
|
+
provider: "google"
|
11
|
+
sendgrid:
|
12
|
+
<<: *default
|
13
|
+
provider: sendgrid
|
14
|
+
smtp_settings:
|
15
|
+
address: "smtp.sendgrid.net"
|
16
|
+
port: '587'
|
17
|
+
enable_starttls_auto: true
|
18
|
+
domain: "example.com"
|
19
|
+
authentication: 'plain'
|
20
|
+
user_name: "test@example.com"
|
21
|
+
password: "superamazingpasswordforsendgrid"
|
22
|
+
mailgun:
|
23
|
+
<<: *default
|
24
|
+
provider: mailgun
|
25
|
+
smtp_settings:
|
26
|
+
address: "smtp.mailgun.org"
|
27
|
+
port: '587'
|
28
|
+
enable_starttls_auto: true
|
29
|
+
user_name: "test@example.com"
|
30
|
+
password: "superamazingpasswordformailgun"
|
31
|
+
|
32
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MMMMailgunMailer < MMMailer
|
4
|
+
mailman :mailgun
|
5
|
+
def test_mail
|
6
|
+
set_mmm_cateogry("MailgunCategory1")
|
7
|
+
set_mmm_variables(:color => "green", :sound => "bark")
|
8
|
+
mail(:subject => "Mailgun Testing", :from => "test@example.com", :to => "test2@example.com")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module MailMaleMail
|
13
|
+
describe Sendgrid do
|
14
|
+
it "should set the X-SMTPAPI header with category unique_args" do
|
15
|
+
mail = MMMMailgunMailer.test_mail
|
16
|
+
mail.header['X-Mailgun-Tag'].to_s.should == "MailgunCategory1"
|
17
|
+
mail.header['X-Mailgun-Variables'].to_s.should == "{\"color\": \"green\", \"sound\": \"bark\"}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class MMMSendGridMailer < MMMailer
|
4
|
+
mailman :sendgrid
|
5
|
+
def test_mail
|
6
|
+
set_mmm_cateogry("SendgridCategory1")
|
7
|
+
set_mmm_variables(:color => "blue", sound: "meow")
|
8
|
+
mail(:subject => "Sengrid Testing", :from => "test@example.com", :to => "test2@example.com")
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module MailMaleMail
|
13
|
+
describe Sendgrid do
|
14
|
+
it "should set the X-SMTPAPI header with category unique_args" do
|
15
|
+
mail = MMMSendGridMailer.test_mail
|
16
|
+
mail.header['X-SMTPAPI'].to_s.should == "{\"category\": \"SendgridCategory1\", \"unique_args\": {\"color\": \"blue\", \"sound\": \"meow\"}}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'debugger'
|
3
|
+
|
4
|
+
class Rails
|
5
|
+
def self.root
|
6
|
+
Pathname.new(__FILE__).dirname
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.env
|
10
|
+
"production"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
require "mail_male_mail"
|
15
|
+
ActionMailer::Base.send(:include, MailMaleMail)
|
16
|
+
class MMMailer < ActionMailer::Base
|
17
|
+
end
|
18
|
+
|
19
|
+
RSpec.configure do |config|
|
20
|
+
config.after :each do
|
21
|
+
MMMailer.class_eval do
|
22
|
+
mailman :default
|
23
|
+
self.mmm_provider = nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mail_male_mail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,10 +9,42 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: actionmailer
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.0.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rspec
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: debugger
|
16
48
|
requirement: !ruby/object:Gem::Requirement
|
17
49
|
none: false
|
18
50
|
requirements:
|
@@ -35,12 +67,21 @@ extensions: []
|
|
35
67
|
extra_rdoc_files: []
|
36
68
|
files:
|
37
69
|
- .gitignore
|
70
|
+
- Gemfile
|
71
|
+
- Gemfile.lock
|
38
72
|
- README.md
|
39
73
|
- Rakefile
|
40
74
|
- lib/mail_male_mail.rb
|
41
75
|
- lib/mail_male_mail/configuration.rb
|
76
|
+
- lib/mail_male_mail/mailgun.rb
|
77
|
+
- lib/mail_male_mail/sendgrid.rb
|
42
78
|
- lib/mail_male_mail/version.rb
|
43
79
|
- mail_male_mail.gemspec
|
80
|
+
- spec/config/mail_male_mail.yml
|
81
|
+
- spec/mail_male_mail/mailgun_spec.rb
|
82
|
+
- spec/mail_male_mail/sendgrid_spec.rb
|
83
|
+
- spec/mail_male_mail_spec.rb
|
84
|
+
- spec/spec_helper.rb
|
44
85
|
homepage: http://github.com/carlallen/mail_male_mail
|
45
86
|
licenses: []
|
46
87
|
post_install_message:
|
@@ -65,4 +106,9 @@ rubygems_version: 1.8.23
|
|
65
106
|
signing_key:
|
66
107
|
specification_version: 3
|
67
108
|
summary: extend actionmailer to work with multiple mail providers
|
68
|
-
test_files:
|
109
|
+
test_files:
|
110
|
+
- spec/config/mail_male_mail.yml
|
111
|
+
- spec/mail_male_mail/mailgun_spec.rb
|
112
|
+
- spec/mail_male_mail/sendgrid_spec.rb
|
113
|
+
- spec/mail_male_mail_spec.rb
|
114
|
+
- spec/spec_helper.rb
|