mtodd-silverpop_mailer 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/packagetask'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/rdoctask'
6
+ require 'spec/rake/spectask'
7
+ require 'fileutils'
8
+ include FileUtils
9
+
10
+ Spec::Rake::SpecTask.new do |t|
11
+ t.spec_opts = ["--color"]
12
+ t.spec_files = FileList['spec/**/*_spec.rb']
13
+ end
14
+
15
+ require 'rubygems/specification'
16
+ spec_def = File.read('silverpop-mailer.gemspec')
17
+ spec = nil
18
+ Thread.new { spec = eval("$SAFE = 3\n#{spec_def}") }.join
19
+
20
+ Rake::GemPackageTask.new(spec) do |p|
21
+ p.need_zip = true
22
+ p.need_tar = true
23
+ end
24
+
25
+ desc "Package and Install halcyon"
26
+ task :install do
27
+ name = "#{project[:name]}-#{project[:version]}.gem"
28
+ sh %{rake package}
29
+ sh %{sudo gem install pkg/#{name}}
30
+ end
31
+
32
+ desc "Uninstall the halcyon gem"
33
+ task :uninstall => [:clean] do
34
+ sh %{sudo gem uninstall #{project[:name]}}
35
+ end
36
+
37
+ desc "Generate RDoc documentation"
38
+ Rake::RDocTask.new(:rdoc) do |rdoc|
39
+ rdoc.options << '--line-numbers' << '--inline-source' <<
40
+ '--main' << 'README' <<
41
+ '--title' << 'Halcyon Documentation' <<
42
+ '--charset' << 'utf-8'
43
+ rdoc.rdoc_dir = "doc"
44
+ rdoc.rdoc_files.include 'README'
45
+ rdoc.rdoc_files.include('lib/halcyon.rb')
46
+ rdoc.rdoc_files.include('lib/halcyon/*.rb')
47
+ rdoc.rdoc_files.include('lib/halcyon/*/*.rb')
48
+ end
49
+
50
+ task :default => Rake::Task['spec']
data/init.rb ADDED
@@ -0,0 +1,3 @@
1
+ # Integrate the SilverPop Mailer into ActionMailer
2
+ require 'silverpop'
3
+ ActionMailer::Base.send :include, Silverpop::ActionMailer
@@ -0,0 +1,29 @@
1
+ module Silverpop
2
+
3
+ module ActionMailer
4
+
5
+ def perform_delivery_silverpop(mail)
6
+ @mailer ||= Silverpop::Mailer.new(self.class.options)
7
+ response = @mailer.mail(self.class.options[:campaign_id], mail, self.class.options)
8
+ raise response.errors.first[:message] unless response.errors.empty?
9
+ end
10
+
11
+ def self.included(target) # :nodoc:
12
+ target.extend ClassMethods
13
+ end
14
+
15
+ module ClassMethods
16
+
17
+ def set_silverpop_delivery_options(options = {})
18
+ cattr_accessor :options
19
+ self.options = options
20
+
21
+ raise ArgumentError.new("Missing required option :server") unless self.options[:server]
22
+ raise ArgumentError.new("Missing required option :campaign_id") unless self.options[:campaign_id]
23
+ end
24
+
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,33 @@
1
+ module Silverpop
2
+
3
+ class Mailer
4
+
5
+ attr_accessor :config, :request, :response
6
+
7
+ def initialize(options = {})
8
+ # config
9
+ self.config = options
10
+
11
+ # logger
12
+ Silverpop.logger.level = self.config[:log_level] || Logger::ERROR
13
+
14
+ # logging
15
+ Silverpop.logger.debug "Mailer init: #{self.config[:server]}"
16
+ end
17
+
18
+ def mail(campaign_id, email, options = {})
19
+ self.request = Silverpop::Request.new(campaign_id, email, options)
20
+ self.response = Silverpop::Response.new(self.send(self.request.generate))
21
+ end
22
+
23
+ # Submits the request.
24
+ #
25
+ def send(request)
26
+ # TODO: implement into Silverpop::Transact
27
+ res = Net::HTTP.post_form(URI.parse(self.config[:server]), :xml => request)
28
+ res.body
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,99 @@
1
+ module Silverpop
2
+
3
+ class Request
4
+
5
+ attr_accessor :campaign_id, :email, :options
6
+
7
+ def initialize(campaign_id, email, options = {})
8
+ self.campaign_id = campaign_id
9
+ self.email = email
10
+ self.options = options
11
+ end
12
+
13
+ def generate
14
+ result = ""
15
+ builder = Builder::XmlMarkup.new(:target => result, :indent => 2)
16
+ builder.XTMAILING do |xml|
17
+ xml.CAMPAIGN_ID(self.campaign_id)
18
+ xml.TRANSACTION_ID(self.options[:transaction_id]) if self.options[:transaction_id]
19
+ self.email.to.each do |recipient|
20
+ xml.RECIPIENT do |rec|
21
+ rec.EMAIL(recipient)
22
+ rec.BODY_TYPE("HTML")
23
+ rec.PERSONALIZATION do |per|
24
+ per.TAG_NAME("HTML_BODY")
25
+ per.VALUE do |per_val|
26
+ per_val.cdata! self.email.body
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ Silverpop.logger.debug "*** REQUEST:\n#{result}\n"
33
+ result
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
40
+ # Sample Request
41
+ #
42
+ # <?xml version="1.0"?>
43
+ # <XTMAILING>
44
+ # <CAMPAIGN_ID>300401</CAMPAIGN_ID>
45
+ # <TRANSACTION_ID>trans-1234</TRANSACTION_ID>
46
+ # <SHOW_ALL_SEND_DETAIL>false</SHOW_ALL_SEND_DETAIL>
47
+ # <SEND_AS_BATCH>false</SEND_AS_BATCH>
48
+ # <NO_RETRY_ON_FAILURE>false</NO_RETRY_ON_FAILURE>
49
+ # <SAVE_COLUMNS>
50
+ # <COLUMN_NAME>NAME</COLUMN_NAME>
51
+ # <COLUMN_NAME>ADDRESS</COLUMN_NAME>
52
+ # </SAVE_COLUMNS>
53
+ # <RECIPIENT>
54
+ # <EMAIL>person@domain.com</EMAIL>
55
+ # <BODY_TYPE>HTML</BODY_TYPE>
56
+ # <PERSONALIZATION>
57
+ # <TAG_NAME>FLIGHT-NUMBER</TAG_NAME>
58
+ # <VALUE>Flight 807 </VALUE>
59
+ # </PERSONALIZATION>
60
+ # <PERSONALIZATION>
61
+ # <TAG_NAME>FLIGHT-INFORMATION</TAG_NAME>
62
+ # <VALUE><![CDATA[
63
+ # <HTML><span style="color:#000000;”>No meals on this flight</span></HTML>
64
+ # ]]></VALUE>
65
+ # </PERSONALIZATION>
66
+ # </RECIPIENT>
67
+ # </XTMAILING>
68
+
69
+ # Another example, specificying TRANSACT_MAIL_BODY
70
+ #
71
+ # <?xml version="1.0"?>
72
+ # <XTMAILING>
73
+ # <CAMPAIGN_ID>numeric campaign id</CAMPAIGN_ID>
74
+ # <TRANSACTION_ID>TRANS-1234</TRANSACTION_ID>
75
+ # <SHOW_ALL_SEND_DETAIL>false</SHOW_ALL_SEND_DETAIL>
76
+ # <SEND_AS_BATCH>false</SEND_AS_BATCH>
77
+ # <NO_RETRY_ON_FAILURE>false</NO_RETRY_ON_FAILURE>
78
+ # <SAVE_COLUMNS>
79
+ # <COLUMN_NAME>ACCOUNT_ID</COLUMN_NAME>
80
+ # </SAVE_COLUMNS>
81
+ # <RECIPIENT>
82
+ # <EMAIL>person@domain.com</EMAIL>
83
+ # <BODY_TYPE>HTML</BODY_TYPE>
84
+ # <PERSONALIZATION>
85
+ # <TAG_NAME>ACCOUNT_ID</TAG_NAME>
86
+ # <VALUE>807</VALUE>
87
+ # </PERSONALIZATION>
88
+ # <PERSONALIZATION>
89
+ # <TAG_NAME>TRANSACT_MAIL_BODY</TAG_NAME>
90
+ # <VALUE><![CDATA[
91
+ # <p>Here is a link, click it: <a
92
+ # href="http://recp.mkt32.net/ctt?m=%%MAILING_ID%%&r=%%RECIPIENT_ID%%&b=0&j=%%JOB_ID%%&k
93
+ # =The_Only_Link&kt=12&kd=http://www.spopdemo.com%3FAccountID%3D%25%25Account_ID%25%25">
94
+ # link</a><p>
95
+ # ]]></VALUE>
96
+ # </PERSONALIZATION>
97
+ # </RECIPIENT>
98
+ # </XTMAILING>
99
+
@@ -0,0 +1,44 @@
1
+ module Silverpop
2
+
3
+ class Response
4
+
5
+ attr_accessor :body, :status, :response, :errors
6
+
7
+ def initialize(response)
8
+ self.parse(response)
9
+ end
10
+
11
+ def parse(response)
12
+ Silverpop.logger.debug "*** RESPONSE:\n#{response}\n"
13
+ self.body = REXML::Document.new(response)
14
+ self.response = {
15
+ :status => self.body.root.elements['STATUS'][0].value,
16
+ :error_code => (self.body.root.elements['ERROR_CODE'][0].value rescue nil),
17
+ :error_string => (self.body.root.elements['ERROR_STRING'][0].value rescue nil)
18
+ }
19
+ self.status = self.response[:status].to_i
20
+ self.errors ||= []
21
+ self.errors << {:code => self.response[:error_code], :message => self.response[:error_string]}
22
+ end
23
+
24
+ def inspect
25
+ "#<Silverpop::Response status:#{self.status} response=#{self.response.inspect}>"
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ # Sample Response Document
33
+ #
34
+ # <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
35
+ # <XTMAILING_RESPONSE>
36
+ # <CAMPAIGN_ID>0</CAMPAIGN_ID>
37
+ # <TRANSACTION_ID>unknown</TRANSACTION_ID>
38
+ # <RECIPIENTS_RECEIVED>0</RECIPIENTS_RECEIVED>
39
+ # <EMAILS_SENT>0</EMAILS_SENT>
40
+ # <NUMBER_ERRORS>0</NUMBER_ERRORS>
41
+ # <STATUS>2</STATUS>
42
+ # <ERROR_CODE>5</ERROR_CODE>
43
+ # <ERROR_STRING>Access not allowed to application for this ip 208.52.141.138</ERROR_STRING>
44
+ # </XTMAILING_RESPONSE>
@@ -0,0 +1,9 @@
1
+ module Silverpop
2
+
3
+ class Transact
4
+
5
+ # ...
6
+
7
+ end
8
+
9
+ end
data/lib/silverpop.rb ADDED
@@ -0,0 +1,28 @@
1
+ %w(rubygems builder tmail rexml/document uri net/http net/https logger).each{|dep|require dep}
2
+
3
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__))))
4
+
5
+ module Silverpop
6
+
7
+ VERSION = [0,0,1]
8
+
9
+ autoload :Mailer, "silverpop/mailer"
10
+ autoload :Transact, "silverpop/transact"
11
+ autoload :Request, "silverpop/request"
12
+ autoload :Response, "silverpop/response"
13
+
14
+ autoload :ActionMailer, "silverpop/action_mailer"
15
+
16
+ class << self
17
+
18
+ def logger
19
+ @logger ||= Logger.new(STDOUT)
20
+ end
21
+
22
+ def version
23
+ VERSION.join('.')
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "silverpop_mailer"
3
+ s.version = "0.0.1"
4
+ s.date = "2008-08-27"
5
+ s.summary = "SilverPOP Mailer Gem/Plugin for ActionMailer"
6
+ s.email = "mtodd@highgroove.com"
7
+ s.homepage = "http://github.com/mtodd/silverpop_mailer"
8
+ s.description = "A SilverPOP Mailer Gem/Plugin for sending emails with the ability to override ActionMailer"
9
+ s.has_rdoc = true
10
+ s.authors = ["Matt Todd"]
11
+ s.files = ["init.rb",
12
+ "README",
13
+ "Rakefile",
14
+ "silverpop_mailer.gemspec",
15
+ "lib/silverpop/action_mailer.rb",
16
+ "lib/silverpop/mailer.rb",
17
+ "lib/silverpop/request.rb",
18
+ "lib/silverpop/response.rb",
19
+ "lib/silverpop/transact.rb",
20
+ "lib/silverpop.rb"]
21
+ s.rdoc_options = ["--main", "README"]
22
+ s.add_dependency("action_mailer", [">= 2.0.0"])
23
+ s.add_dependency("builder", [">= 2.1.2"])
24
+ s.add_dependency("tmail", [">= 1.2.3.1"])
25
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mtodd-silverpop_mailer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Matt Todd
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-08-27 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: action_mailer
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.0
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: builder
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 2.1.2
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: tmail
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.3.1
41
+ version:
42
+ description: A SilverPOP Mailer Gem/Plugin for sending emails with the ability to override ActionMailer
43
+ email: mtodd@highgroove.com
44
+ executables: []
45
+
46
+ extensions: []
47
+
48
+ extra_rdoc_files: []
49
+
50
+ files:
51
+ - init.rb
52
+ - README
53
+ - Rakefile
54
+ - silverpop_mailer.gemspec
55
+ - lib/silverpop/action_mailer.rb
56
+ - lib/silverpop/mailer.rb
57
+ - lib/silverpop/request.rb
58
+ - lib/silverpop/response.rb
59
+ - lib/silverpop/transact.rb
60
+ - lib/silverpop.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/mtodd/silverpop_mailer
63
+ post_install_message:
64
+ rdoc_options:
65
+ - --main
66
+ - README
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ requirements: []
82
+
83
+ rubyforge_project:
84
+ rubygems_version: 1.2.0
85
+ signing_key:
86
+ specification_version: 2
87
+ summary: SilverPOP Mailer Gem/Plugin for ActionMailer
88
+ test_files: []
89
+