mail_safe-sendgrid 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ coverage/*
6
+ .yardoc/*
7
+ doc/*
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ desc "Run specs"
5
+ RSpec::Core::RakeTask.new { |t| t.rspec_opts = "--color" }
6
+
7
+ task :default => :spec
@@ -0,0 +1,8 @@
1
+ module Kernel
2
+ def silence_warnings
3
+ verbosity = $VERBOSE
4
+ result = yield
5
+ $VERBOSE = verbosity
6
+ result
7
+ end
8
+ end
@@ -0,0 +1,81 @@
1
+ module MailSafe
2
+ class AddressReplacer
3
+ require 'json'
4
+ class << self
5
+
6
+ @@replaced_addresses = {}
7
+ @@address_types = ADDRESS_TYPES.dup
8
+
9
+ def add_body_postscript_with_mail_header(part, replaced_addresses, call_super = false)
10
+ # we don't want to call add_body_postscript until after we've added the SendGrid SMTPAPI
11
+ # replaced addresses to the list of all addresses replaced by Mail Safe
12
+ @@replaced_addresses.reverse_merge! replaced_addresses
13
+ if call_super or replaced_addresses[:X_SMTPAPI]
14
+ add_xsmtpapi_to_address_types
15
+ add_body_postscript_without_mail_header(part, @@replaced_addresses)
16
+ remove_xsmtpapi_from_address_types
17
+ end
18
+ end
19
+ alias_method_chain :add_body_postscript, :mail_header
20
+
21
+
22
+ def replace_external_addresses_with_mail_header(mail)
23
+ replace_external_addresses_without_mail_header(mail)
24
+ # load X-SMTPAPI headers (json)
25
+ x_smtpapi = JSON.parse mail.header['X-SMTPAPI'].to_s
26
+
27
+ external_indices = []
28
+ # get a list of indices for external addresses
29
+ x_smtpapi['to'].each_with_index do |address, index|
30
+ external_indices << index if !MailSafe::Config.is_internal_address?(address)
31
+ end
32
+ deleted_cnt = 0
33
+ deleted_addresses = []
34
+ external_indices.each do |i|
35
+ # remove any external address from :to
36
+ deleted_addresses << x_smtpapi['to'].delete_at(i - deleted_cnt)
37
+ # remove the related tokens for every array in :sub
38
+ x_smtpapi['sub'].each do |k, v|
39
+ v.delete_at(i-deleted_cnt)
40
+ x_smtpapi['sub'][k] = v
41
+ end
42
+ # the indices decrement as we remove elements, deleted_cnt accounts for this
43
+ deleted_cnt += 1
44
+ end
45
+ # save the headers back to X-SMTPAPI
46
+ mail.header['X-SMTPAPI'].value = x_smtpapi.to_json.gsub(/(["\]}])([,:])(["\[{])/, '\\1\\2 \\3')
47
+
48
+ add_body_postscript(mail,{:X_SMTPAPI=>deleted_addresses}, true)
49
+ # we need to override add_text_postscript to include sendgrid x-smtpapi and not ADDRESS_TYPES only
50
+
51
+ end
52
+ alias_method_chain :replace_external_addresses, :mail_header
53
+
54
+ # ADDRESS_TYPES is frozen but we want to add :X_SMTPAPI to it
55
+ # so the original add_[text|html]_postscript functions have
56
+ # the SendGrid specific addresses that MailSafe removed as well
57
+ # when generating their message. Otherwise we would have to
58
+ # override these functions entirely.
59
+ def add_xsmtpapi_to_address_types
60
+ modified_address_types = @@address_types.dup
61
+ modified_address_types << :X_SMTPAPI
62
+ # silence already initialized constant ADDRESS_TYPES
63
+ silence_warnings do
64
+ MailSafe::AddressReplacer.singleton_class.const_set(:ADDRESS_TYPES,modified_address_types.uniq)
65
+ end
66
+ end
67
+
68
+ # We then need to reset ADDRESS_TYPES back to the frozen value
69
+ # for MailSafe to be able to process the next message properly
70
+ def remove_xsmtpapi_from_address_types
71
+
72
+ # silence already initialized constant ADDRESS_TYPES
73
+ silence_warnings do
74
+ MailSafe::AddressReplacer.singleton_class.const_set(:ADDRESS_TYPES,@@address_types)
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ end
81
+ end
@@ -0,0 +1,23 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'mail_safe-sendgrid'
3
+ s.version = '0.0.1'
4
+ s.date = '2012-03-13'
5
+ s.summary = 'Sendgrid support for Mail Safe'
6
+ s.description = 'Extends Mail Safe to look for and sanitize Sendgrid specific X-SMTPAPI headers'
7
+ s.authors = ['Ed Shadi', 'Vijay Ramesh']
8
+ s.email = ['ed@change.org', 'vijay@change.org']
9
+
10
+ s.files = `git ls-files`.split("\n")
11
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
12
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
13
+ s.require_paths = ["lib"]
14
+
15
+ s.add_runtime_dependency 'json'
16
+ s.add_runtime_dependency 'mail_safe'
17
+ s.add_runtime_dependency 'sendgrid'
18
+
19
+ s.add_development_dependency 'actionmailer'
20
+ s.add_development_dependency 'rake'
21
+ s.add_development_dependency 'rspec'
22
+
23
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe MailSafe::AddressReplacer do
4
+ before do
5
+ default_internal_address = /.*@internal\.com/i
6
+
7
+ if defined?(MailSafe::Config)
8
+ MailSafe::Config.internal_address_definition = lambda { |addr|
9
+ addr =~ default_internal_address
10
+ }
11
+ MailSafe::Config.replacement_address = "replacement@internal.com"
12
+ end
13
+ end
14
+ describe '#replace_external_addresses' do
15
+ before(:each) do
16
+ @mail = TestMailer.create_test
17
+ MailSafe::AddressReplacer.replace_external_addresses(@mail)
18
+ end
19
+
20
+ it "should generate one email using the content's template, and with Sendgrid SMTP headers for each user's info" do
21
+
22
+ sendgrid_header = JSON.parse(@mail['X-SMTPAPI'].to_s)
23
+ sendgrid_header['sub']['{username}'].should == ['internal_1','internal_2']
24
+ sendgrid_header['sub']['{email_address}'].should == ['internal_1@internal.com', 'internal_2@internal.com']
25
+
26
+ end
27
+
28
+ it "should create the appropriate postscript including X-SMTPAPI addresses that were removed" do
29
+ postscript = %r(The original recipients were:\s*- to:\s*- donotreply@foobar.com\s*- X_SMTPAPI:\s*- external_1@external.com\s*- external_2@external.com)
30
+ @mail.parts[0].body.should =~ postscript
31
+ end
32
+ end
33
+
34
+
35
+
36
+ end
@@ -0,0 +1,41 @@
1
+ $:.unshift(File.expand_path("../../lib", __FILE__))
2
+ require 'rubygems'
3
+ require 'mail_safe'
4
+ require 'sendgrid'
5
+ require 'mail_safe-sendgrid'
6
+ require 'action_mailer'
7
+ require 'json'
8
+
9
+ class TestMailer < ActionMailer::Base
10
+ include SendGrid
11
+ public
12
+ def create_test
13
+ user_data = [
14
+ {:email_address =>'external_1@external.com', :name =>'external_1'},
15
+ {:email_address =>'external_2@external.com', :name =>'external_2'},
16
+ {:email_address =>'internal_1@internal.com', :name =>'internal_1'},
17
+ {:email_address =>'internal_2@internal.com', :name =>'internal_2'}
18
+ ]
19
+ subject = 'Test'
20
+ content = 'This is a test email.'
21
+
22
+ email_addresses, usernames = transpose_user_data(user_data)
23
+
24
+ sendgrid_recipients email_addresses
25
+ sendgrid_substitute '{username}', usernames
26
+ sendgrid_substitute '{email_address}', email_addresses
27
+ sendgrid_category 'Test Email'
28
+
29
+ mail(:to => 'donotreply@foobar.com', :from => 'donotreply@foobar.com', :subject => subject) do |format|
30
+ format.text { render :text => content }
31
+ format.html { render :text => content }
32
+ end
33
+ end
34
+
35
+ def transpose_user_data(user_data)
36
+ user_data.collect { |u| [ u[:email_address], u[:name]] }.transpose
37
+ end
38
+
39
+ end
40
+
41
+
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mail_safe-sendgrid
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ed Shadi
9
+ - Vijay Ramesh
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-03-13 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ requirement: &70275505733960 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *70275505733960
26
+ - !ruby/object:Gem::Dependency
27
+ name: mail_safe
28
+ requirement: &70275505733020 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *70275505733020
37
+ - !ruby/object:Gem::Dependency
38
+ name: sendgrid
39
+ requirement: &70275505732220 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *70275505732220
48
+ - !ruby/object:Gem::Dependency
49
+ name: actionmailer
50
+ requirement: &70275505731220 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *70275505731220
59
+ - !ruby/object:Gem::Dependency
60
+ name: rake
61
+ requirement: &70275505749140 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: *70275505749140
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: &70275505747520 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: *70275505747520
81
+ description: Extends Mail Safe to look for and sanitize Sendgrid specific X-SMTPAPI
82
+ headers
83
+ email:
84
+ - ed@change.org
85
+ - vijay@change.org
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - Rakefile
93
+ - lib/core_ext/kernel.rb
94
+ - lib/mail_safe-sendgrid.rb
95
+ - mail_safe-sendgrid.gemspec
96
+ - spec/mail_safe-sendgrid_spec.rb
97
+ - spec/spec_helper.rb
98
+ homepage:
99
+ licenses: []
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 1.8.15
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Sendgrid support for Mail Safe
122
+ test_files:
123
+ - spec/mail_safe-sendgrid_spec.rb
124
+ - spec/spec_helper.rb