sendgrid_smtpapi 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,5 @@
1
+ *.gem
2
+ .bundle
3
+ .rvmrc
4
+ Gemfile.lock
5
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format nested
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ rvm:
2
+ - 1.9.3
3
+ - ree
4
+
5
+ script: rake spec
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in send_grid.gemspec
4
+ gemspec
data/README.rdoc ADDED
@@ -0,0 +1,111 @@
1
+ = SendGrid SMTP API gem for Rails {<img src="https://secure.travis-ci.org/kylejginavan/sendgrid_smtpapi.png"/>}[http://travis-ci.org/kylejginavan/sendgrid_smtpapi]
2
+
3
+ SendGrid SMTP API gem provides ActionMailer::Base extensions to use SendGrid API features in you emails.
4
+ It extends ActionMailer with next methods:
5
+
6
+ substitute(patters_string, array_of_substitunion_strings)
7
+ uniq_args(hash_of_unique_args)
8
+ category(category_string)
9
+ open_tracking(enabled = true)
10
+ add_filter_setting(filter_name, setting_name, value)
11
+ standard_smtp(enabled = false)
12
+
13
+ == Rails 3 configuration
14
+
15
+ In your Gemfile:
16
+
17
+ gem 'sendgrid_smtpapi'
18
+
19
+ In your config/environment.rb:
20
+
21
+ ActionMailer::Base.register_interceptor(SendGridSmtpApi::MailInterceptor)
22
+
23
+ ActionMailer::Base.smtp_settings = {
24
+ :address => 'smtp.sendgrid.net',
25
+ :port => '25',
26
+ :domain => 'example.com',
27
+ :authentication => :plain,
28
+ :user_name => 'login@example.com',
29
+ :password => 'your password'
30
+ }
31
+
32
+ == Usage examples
33
+
34
+ === Adding multiple recipients:
35
+
36
+ class Mailer < ActionMailer::Base
37
+ default :from => 'no-reply@example.com',
38
+ :subject => 'An email sent via SendGridSmtpApi'
39
+
40
+ def email_with_multiple_recipients
41
+ mail :to => %w(email1@email.com email2@email.com)
42
+ end
43
+ end
44
+
45
+ === Adding substitution vars
46
+
47
+ Mailer class definition:
48
+
49
+ class Mailer < ActionMailer::Base
50
+ default :from => 'no-reply@example.com',
51
+ :subject => 'An email sent via SendGridSmtpApi with substitutions'
52
+
53
+ def email_with_substitutions
54
+ substitute '-user_name-', %w(User1 User2)
55
+
56
+ mail :to => %w(email1@email.com email2@email.com), :body => "Hello, -user_name-!"
57
+ end
58
+ end
59
+
60
+ === Adding category
61
+
62
+ Mailer class definition:
63
+
64
+ class Mailer < ActionMailer::Base
65
+ default :from => 'no-reply@example.com',
66
+ :subject => 'An email sent via SendGridSmtpApi with substitutions'
67
+
68
+ def email_with_category
69
+ category 'SendGridSmtpApiRocks'
70
+ mail :to => 'email1@email.com'
71
+ end
72
+ end
73
+
74
+ == Apps (formerly called Filters)
75
+
76
+ Apps can be applied to any of your email messages and can be configured through SendGridSmtpApi gem.
77
+
78
+ === Open Tracking
79
+
80
+ Add an invisible image at the end of the email to track e-mail opens. If the email recipient has images enabled on the email client, a request to server for the invisible image is executed and an open is logged.
81
+
82
+ class Mailer < ActionMailer::Base
83
+ default :from => 'no-reply@example.com',
84
+ :subject => 'An email sent via SendGridSmtpApi'
85
+
86
+ def email_with_open_tracking_enabled
87
+ open_tracking true
88
+ mail :to => 'email@email.com'
89
+ end
90
+ end
91
+
92
+
93
+ === Use Standard SMTP
94
+
95
+ if you want to customize the header for sendgrids api but you need keep standard SMTP see below:
96
+
97
+ class Mailer < ActionMailer::Base
98
+ default :from => 'no-reply@example.com',
99
+ :subject => 'An email sent via SendGridSmtpApi'
100
+
101
+ def email_standard_smtp
102
+ standard_smtp true
103
+ open_tracking true
104
+ mail :to => 'email@email.com'
105
+ end
106
+ end
107
+
108
+ == CONTRIBUTORS:
109
+
110
+ * Kyle J. Ginavan.
111
+ * Mauro Torres - http://github.com/chebyte
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+ Bundler::GemHelper.install_tasks
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
data/lib/send_grid.rb ADDED
@@ -0,0 +1,30 @@
1
+ module SendGridSmtpApi
2
+ autoload :ApiHeader, 'send_grid/api_header'
3
+ autoload :MailInterceptor, 'send_grid/mail_interceptor'
4
+ autoload :VERSION, 'send_grid/version'
5
+
6
+ def self.included(base)
7
+ base.class_eval do
8
+ include InstanceMethods
9
+ delegate :substitute, :uniq_args, :category, :add_filter_setting, :standard_smtp, :to => :sendgrid_header
10
+ alias_method_chain :mail, :sendgrid
11
+ alias_method :sendgrid_header, :send_grid_header
12
+ end
13
+ end
14
+
15
+ module InstanceMethods
16
+ def send_grid_header
17
+ @send_grid_header ||= SendGridSmtpApi::ApiHeader.new
18
+ end
19
+
20
+ def mail_with_sendgrid(headers={}, &block)
21
+ mail_without_sendgrid(headers, &block).tap do |message|
22
+ message.instance_variable_set :@sendgrid_header, sendgrid_header
23
+ end
24
+ end
25
+
26
+ def open_tracking(enabled = true)
27
+ add_filter_setting(:opentrack, :enabled, enabled ? 1 : 0) unless enabled.nil?
28
+ end
29
+ end
30
+ end
Binary file
@@ -0,0 +1,37 @@
1
+ class SendGridSmtpApi::ApiHeader
2
+ attr_reader :data
3
+
4
+ def initialize
5
+ @data = Hash.new { |h,k| h[k] = Hash.new(&h.default_proc) }
6
+ end
7
+
8
+ def add_recipients(recipients)
9
+ @data[:to] = [] unless @data[:to].instance_of?(Array)
10
+ @data[:to] |= Array.wrap(recipients)
11
+ end
12
+
13
+ def substitute(var, val)
14
+ @data[:sub][var] = Array.wrap(val)
15
+ end
16
+
17
+ def uniq_args(val)
18
+ @data[:unique_args] = val if val.instance_of?(Hash)
19
+ end
20
+
21
+ def category(cat)
22
+ @data[:category] = cat
23
+ end
24
+
25
+ def add_filter_setting(fltr, setting, val)
26
+ @data[:filters][fltr][:settings][setting] = val
27
+ end
28
+
29
+ def to_json
30
+ @data.to_json
31
+ end
32
+
33
+ def standard_smtp(enabled = false)
34
+ @standard_smtp = enabled
35
+ end
36
+
37
+ end
@@ -0,0 +1,14 @@
1
+ module SendGridSmtpApi
2
+ class MailInterceptor
3
+ def self.delivering_email(mail)
4
+ sendgrid_header = mail.instance_variable_get(:@sendgrid_header)
5
+ standard_smtp = sendgrid_header.instance_variable_get(:@standard_smtp)
6
+
7
+ unless standard_smtp
8
+ sendgrid_header.add_recipients(mail.to)
9
+ mail.header['to'] = 'dummy@email.com'
10
+ end
11
+ mail.header['X-SMTPAPI'] = sendgrid_header.to_json if sendgrid_header.data.present?
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ module SendGridSmtpApi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,8 @@
1
+ require 'send_grid'
2
+ require 'active_support'
3
+ require 'active_support/core_ext'
4
+ require 'action_mailer'
5
+
6
+ autoload :ActionMailer, 'action_mailer'
7
+
8
+ ActionMailer::Base.send :include, SendGridSmtpApi
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "send_grid/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "sendgrid_smtpapi"
7
+ s.version = SendGridSmtpApi::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["kylejginavan", "chebyte"]
10
+ s.email = ["kylejginavan@gmail.com", "maurotorres@gmail.com"]
11
+ s.homepage = "https://github.com/kylejginavan/sendgrid_smtpapi"
12
+ s.summary = %q{SendGrid SMTP API gem fo Rails 3}
13
+ s.description = %q{Gem to extend ActionMailer with SendGrid SMTP API support}
14
+
15
+ s.rubyforge_project = "sendgrid_smtpapi"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ s.add_development_dependency "rspec", "~> 2.5.0"
22
+ s.add_dependency "actionmailer", ">= 3.0.0"
23
+ s.add_dependency "activesupport", ">= 2.1.0"
24
+ end
@@ -0,0 +1,40 @@
1
+ require 'spec_helper'
2
+
3
+ describe SendGridSmtpApi::ApiHeader do
4
+ let(:header) { SendGridSmtpApi::ApiHeader.new }
5
+ describe "#to_json" do
6
+ it "returns valid json if no data was set" do
7
+ header.to_json.should eql "{}"
8
+ end
9
+
10
+ it "contains 1 recipient (as array)" do
11
+ header.add_recipients 'email@email.com'
12
+ header.to_json.should eql '{"to":["email@email.com"]}'
13
+ end
14
+
15
+ it "contaions an array of recipients" do
16
+ header.add_recipients %w(email1@email.com email2@email.com)
17
+ header.to_json.should eql '{"to":["email1@email.com","email2@email.com"]}'
18
+ end
19
+
20
+ it "contains substitution" do
21
+ header.substitute :var1, 'Hello'
22
+ header.to_json.should eql '{"sub":{"var1":["Hello"]}}'
23
+ end
24
+
25
+ it "contains uniq args" do
26
+ header.uniq_args :arg1 => 'val1'
27
+ header.to_json.should eql '{"unique_args":{"arg1":"val1"}}'
28
+ end
29
+
30
+ it "contains category" do
31
+ header.category 'category_name'
32
+ header.to_json.should eql '{"category":"category_name"}'
33
+ end
34
+
35
+ it "contains filter settings" do
36
+ header.add_filter_setting :filter1, :setting1, 'val1'
37
+ header.to_json.should eql '{"filters":{"filter1":{"settings":{"setting1":"val1"}}}}'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,19 @@
1
+ class Mailer < ActionMailer::Base
2
+ default :from => 'no-reply@sendgrid.com',
3
+ :subject => 'Test email'
4
+
5
+ def email_with_multiple_recipients(recipients)
6
+ mail :to => recipients, :body => "Hello!"
7
+ end
8
+
9
+ def email_open_tracking(opentrack_enabled = true)
10
+ open_tracking opentrack_enabled
11
+ mail :to => 'email@email.com', :body => 'Hello!'
12
+ end
13
+
14
+ def email_standard_smtp(enabled = false)
15
+ standard_smtp enabled
16
+ mail :to => 'email@email.com', :body => 'Hello!'
17
+ end
18
+
19
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mailer do
4
+ describe 'email with multiple recipients' do
5
+ it 'set correct recipients in X-SMTAPI header' do
6
+ Mailer.email_with_multiple_recipients(%w(em1@email.com em2@email.com)).deliver.header.to_s.
7
+ should include('X-SMTPAPI: {"to":["em1@email.com","em2@email.com"]}')
8
+ end
9
+
10
+ it 'removes original TO header part' do
11
+ Mailer.email_with_multiple_recipients(%w(em1@email.com em2@email.com)).deliver.header.to_s.
12
+ should_not include("To: em1@email.com")
13
+ end
14
+ end
15
+
16
+ describe '#open_tracking' do
17
+ it 'set correct open tracking enabled X-SMTAPI header' do
18
+ Mailer.email_open_tracking.deliver.header.to_s.
19
+ should include('"filters":{"opentrack":{"settings":{"enabled":1}}}')
20
+ end
21
+
22
+ it 'set correct open tracking disabled X-SMTAPI header' do
23
+ Mailer.email_open_tracking(false).deliver.header.to_s.
24
+ should include('"filters":{"opentrack":{"settings":{"enabled":0}}}')
25
+ end
26
+
27
+ it 'set correct open tracking nil X-SMTAPI header' do
28
+ Mailer.email_open_tracking(nil).deliver.header.to_s.
29
+ should_not include('"filters":{"opentrack')
30
+ end
31
+ end
32
+
33
+ describe '#standard_smtp' do
34
+ it 'enable standard smpt to' do
35
+ Mailer.email_standard_smtp(true).deliver.header.to_s.
36
+ should include('To: email@email.com')
37
+ end
38
+
39
+ it 'disable standard smtp to' do
40
+ Mailer.email_standard_smtp(false).deliver.header.to_s.
41
+ should include('To: dummy@email.com')
42
+ end
43
+
44
+ it 'disable by default standard smtp to' do
45
+ Mailer.email_standard_smtp.deliver.header.to_s.
46
+ should include('To: dummy@email.com')
47
+ end
48
+ end
49
+
50
+ end
@@ -0,0 +1,7 @@
1
+ require 'sendgrid_smtpapi'
2
+
3
+ ActionMailer::Base.register_interceptor(SendGridSmtpApi::MailInterceptor)
4
+ ActionMailer::Base.delivery_method = :test
5
+ ActionMailer::Base.prepend_view_path File.join(File.dirname(__FILE__), "fixtures", "views")
6
+
7
+ Dir["#{File.dirname(__FILE__)}/fixtures/mailers/*.rb"].each { |f| require f }
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SendGridSmtpApi::VERSION' do
4
+ it "returns string" do
5
+ SendGridSmtpApi::VERSION.should be_an_instance_of(String)
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sendgrid_smtpapi
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - kylejginavan
9
+ - chebyte
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+
14
+ date: 2012-12-17 00:00:00 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rspec
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 2.5.0
25
+ type: :development
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: actionmailer
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 3.0.0
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: activesupport
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 2.1.0
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ description: Gem to extend ActionMailer with SendGrid SMTP API support
50
+ email:
51
+ - kylejginavan@gmail.com
52
+ - maurotorres@gmail.com
53
+ executables: []
54
+
55
+ extensions: []
56
+
57
+ extra_rdoc_files: []
58
+
59
+ files:
60
+ - .gitignore
61
+ - .rspec
62
+ - .travis.yml
63
+ - Gemfile
64
+ - README.rdoc
65
+ - Rakefile
66
+ - lib/send_grid.rb
67
+ - lib/send_grid/.DS_Store
68
+ - lib/send_grid/api_header.rb
69
+ - lib/send_grid/mail_interceptor.rb
70
+ - lib/send_grid/version.rb
71
+ - lib/sendgrid_smtpapi.rb
72
+ - sendgrid_smtpapi.gemspec
73
+ - spec/api_header_spec.rb
74
+ - spec/fixtures/mailers/mailer.rb
75
+ - spec/mailer_spec.rb
76
+ - spec/spec_helper.rb
77
+ - spec/version_spec.rb
78
+ homepage: https://github.com/kylejginavan/sendgrid_smtpapi
79
+ licenses: []
80
+
81
+ post_install_message:
82
+ rdoc_options: []
83
+
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
98
+ requirements: []
99
+
100
+ rubyforge_project: sendgrid_smtpapi
101
+ rubygems_version: 1.8.15
102
+ signing_key:
103
+ specification_version: 3
104
+ summary: SendGrid SMTP API gem fo Rails 3
105
+ test_files:
106
+ - spec/api_header_spec.rb
107
+ - spec/fixtures/mailers/mailer.rb
108
+ - spec/mailer_spec.rb
109
+ - spec/spec_helper.rb
110
+ - spec/version_spec.rb