postmark 0.8.0 → 0.9.0

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/CHANGELOG.rdoc ADDED
@@ -0,0 +1,9 @@
1
+ = Changelog
2
+
3
+ == 0.9.0
4
+
5
+ * Added support for attachments.
6
+
7
+ == 0.8.0
8
+
9
+ * Added support for Rails 3.
data/README.rdoc CHANGED
@@ -4,10 +4,6 @@ Ruby gem for sending emails through http://postmarkapp.com HTTP API
4
4
 
5
5
  == Install
6
6
 
7
- The gem is hosted at gemcutter. If you don't have it, install it first:
8
-
9
- sudo gem install gemcutter
10
- Then
11
7
  sudo gem install postmark
12
8
 
13
9
  == Example
@@ -19,37 +15,48 @@ Then
19
15
  require 'tmail'
20
16
 
21
17
  Postmark.api_key = "your-api-key"
22
-
23
- message = TMail::Mail.new
24
- # make sure you have a sender signature with that email
25
- # from and to also accept arrays of emails.
26
- message.from = "leonard@bigbangtheory.com"
27
- message.to = "Sheldon Cooper <sheldon@bigbangtheory.com>"
28
- message.subject = "Hi Sheldon!"
18
+
19
+ # Make sure you have a sender signature for every From email you specify.
20
+ # From can also accept array of addresses.
21
+
22
+ message = TMail::Mail.new
23
+ message.from = "leonard@bigbangtheory.com"
24
+ message.to = "Sheldon Cooper <sheldon@bigbangtheory.com>"
25
+ message.subject = "Hi Sheldon!"
29
26
  message.content_type = "text/html"
30
- message.body = "Hello my friend!"
31
- # set custom headers at will.
27
+ message.body = "Hello my friend!"
28
+
29
+ # You can set customer headers if you like:
32
30
  message["CUSTOM-HEADER"] = "my custom header value"
33
- # tag message
31
+
32
+ # Added a tag:
34
33
  message.tag = "my-tracking-tag"
35
- # set reply to if you need; also, you can pass array of emails.
34
+
35
+ # Add attachments:
36
+ message.postmark_attachments = [File.open("/path"), File.open("/path")]
37
+
38
+ # Or specify a reply-to address (can also be an array of addresses):
36
39
  message.reply_to = "penny@bigbangtheory.com"
37
40
 
38
41
  Postmark.send_through_postmark(message)
39
42
 
40
43
  If you are using the Mail gem, you can also use Postmark as a delivery method like:
41
44
 
42
- message = Mail.new
43
- message.delivery_method Mail::Postmark, {:api_key => "your-api-key"}
44
- message.deliver
45
+ message = Mail.new
46
+ message.delivery_method Mail::Postmark, {:api_key => "your-api-key"}
47
+ message.deliver
45
48
 
46
49
  You can retrieve various information about your server state using the Public bounces API - http://developer.postmarkapp.com/bounces
47
50
 
48
- # get delivery stats
49
- Postmark.delivery_stats # json
50
- Postmark::Bounce.all # [ bounce, bounce ... ]
51
- bounce = Postmark::Bounce.find(bounce_id) # Bounce
52
- bounce.dump # string, containing raw SMTP data
51
+ # Get delivery stats: (JSON format)
52
+ Postmark.delivery_stats
53
+
54
+ # Get bounces information: (array of bounce objects)
55
+ Postmark::Bounce.all
56
+
57
+ # Find specific bounce by id:
58
+ bounce = Postmark::Bounce.find(bounce_id)
59
+ bounce.dump # string, containing raw SMTP data
53
60
  bounce.reactivate # reactivate hard bounce
54
61
 
55
62
  == Encryption
@@ -68,12 +75,6 @@ You can also explicitly specify which one to be used, using
68
75
 
69
76
  Postmark.response_parser_class = :Json # :ActiveSupport or :Yajl is also supported.
70
77
 
71
- == Limitations
72
-
73
- Currently postmark API does not support attachments. For more information, check the docs at:
74
-
75
- http://developer.postmarkapp.com
76
-
77
78
  == Note on Patches/Pull Requests
78
79
 
79
80
  * Fork the project.
@@ -83,6 +84,14 @@ http://developer.postmarkapp.com
83
84
  * Commit, do not mess with rakefile, version, or history.
84
85
  * Send me a pull request. Bonus points for topic branches.
85
86
 
87
+ == Authors & Contributors
88
+
89
+ * Petyo Ivanov
90
+ * Ilya Sabanin
91
+ * Hristo Deshev
92
+ * Randy Schmidt
93
+ * Chris Williams
94
+
86
95
  == Copyright
87
96
 
88
97
  Copyright (c) 2010 Wildbit LLC. See LICENSE for details.
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ begin
9
9
  gem.description = %Q{Ruby gem for sending emails through http://postmarkapp.com HTTP API. It relieas on TMail::Mail for message construction.}
10
10
  gem.email = "underlog@gmail.com"
11
11
  gem.homepage = "http://postmarkapp.com"
12
- gem.authors = ["Petyo Ivanov"]
12
+ gem.authors = ["Petyo Ivanov", "Ilya Sabanin"]
13
13
  gem.add_development_dependency "rspec"
14
14
  gem.add_development_dependency "cucumber"
15
15
  gem.add_dependency "tmail"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
data/lib/postmark.rb CHANGED
@@ -1,11 +1,18 @@
1
+ def require_local(file)
2
+ require File.join(File.dirname(__FILE__), 'postmark', file)
3
+ end
4
+
1
5
  require 'net/http'
2
6
  require 'net/https'
3
- require 'postmark/bounce'
4
- require 'postmark/json'
5
- require 'postmark/http_client'
6
- require 'postmark/tmail_mail_extension'
7
- require 'postmark/mail_message_extension'
8
- require 'mail/postmark'
7
+
8
+ require_local 'bounce'
9
+ require_local 'json'
10
+ require_local 'http_client'
11
+ require_local 'message_extensions/shared'
12
+ require_local 'message_extensions/tmail'
13
+ require_local 'message_extensions/mail'
14
+ require_local 'handlers/mail'
15
+ require_local 'attachments_fix_for_mail'
9
16
 
10
17
  module Postmark
11
18
 
@@ -98,8 +105,8 @@ module Postmark
98
105
  def delivery_stats
99
106
  HttpClient.get("deliverystats")
100
107
  end
101
-
102
- protected
108
+
109
+ protected
103
110
 
104
111
  def convert_mail(message)
105
112
  options = { "From" => message.from.to_s, "Subject" => message.subject }
@@ -114,6 +121,8 @@ module Postmark
114
121
  options["Cc"] = message.cc.join(", ").to_s unless message.cc.nil?
115
122
 
116
123
  options["Bcc"] = message.bcc.join(", ").to_s unless message.bcc.nil?
124
+
125
+ options["Attachments"] = message.postmark_attachments unless message.postmark_attachments.nil?
117
126
 
118
127
  if reply_to = message['reply-to']
119
128
  options["ReplyTo"] = reply_to.to_s
@@ -155,6 +164,8 @@ module Postmark
155
164
  options["Cc"] = message['cc'].to_s unless message.cc.nil?
156
165
 
157
166
  options["Bcc"] = message['bcc'].to_s unless message.bcc.nil?
167
+
168
+ options["Attachments"] = message.postmark_attachments unless message.postmark_attachments.nil?
158
169
 
159
170
  if reply_to = message['reply-to']
160
171
  options["ReplyTo"] = reply_to.to_s
@@ -197,9 +208,10 @@ module Postmark
197
208
  bcc
198
209
  subject
199
210
  tag
211
+ attachment
200
212
  ]
201
213
  end
202
-
214
+
203
215
  end
204
216
 
205
217
  self.response_parser_class = nil
@@ -0,0 +1,43 @@
1
+ module Postmark
2
+
3
+ #
4
+ # This fix is needed solely to support neat Rails 3 syntax to create emails.
5
+ # That one:
6
+ #
7
+ # def invitation
8
+ # mail(
9
+ # :to => "someone@example.com",
10
+ # :postmark_attachments => [File.open(...)]
11
+ # )
12
+ # end
13
+ #
14
+ # That code will automatically put the file to Mail::OptionalField of the Mail::Message object
15
+ # and will try to encode it before delivery. You are not supposed to store files in
16
+ # such fields, so Mail will raise an exception. That's why before we actually perform a
17
+ # delivery we have to remove the files from OptionalField to a regular @_attachments variable.
18
+ #
19
+ module AttachmentsFixForMail
20
+
21
+ def self.included(base)
22
+ base.class_eval do
23
+ alias_method_chain :deliver, :postmark_hook
24
+ end
25
+ end
26
+
27
+ def deliver_with_postmark_hook
28
+ remove_postmark_attachments_from_standard_fields
29
+ deliver_without_postmark_hook
30
+ end
31
+
32
+ private
33
+
34
+ def remove_postmark_attachments_from_standard_fields
35
+ field = self['POSTMARK-ATTACHMENTS']
36
+ return if field.nil?
37
+ self.postmark_attachments = field.value
38
+ header.fields.delete_if{|f| f.name == 'postmark-attachments'}
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -1,14 +1,16 @@
1
1
  module Mail
2
2
  class Postmark
3
- def initialize(values)
4
- self.settings = {:api_key => nil}.merge(values)
5
- end
6
3
 
7
4
  attr_accessor :settings
8
5
 
6
+ def initialize(values)
7
+ self.settings = { :api_key => nil }.merge(values)
8
+ end
9
+
9
10
  def deliver!(mail)
10
11
  ::Postmark.api_key = settings[:api_key]
11
12
  ::Postmark.send_through_postmark(mail)
12
13
  end
14
+
13
15
  end
14
16
  end
@@ -1,12 +1,7 @@
1
1
  module Mail
2
2
  class Message
3
- def tag
4
- self["TAG"]
5
- end
6
-
7
- def tag=(value)
8
- self["TAG"] = value
9
- end
3
+
4
+ include Postmark::SharedMessageExtensions
10
5
 
11
6
  def body_html
12
7
  unless html_part.nil?
@@ -21,5 +16,6 @@ module Mail
21
16
  text_part.body.to_s
22
17
  end
23
18
  end
19
+
24
20
  end
25
21
  end
@@ -0,0 +1,33 @@
1
+ module Postmark
2
+ module SharedMessageExtensions
3
+
4
+ def tag
5
+ self['TAG']
6
+ end
7
+
8
+ def tag=(value)
9
+ self['TAG'] = value
10
+ end
11
+
12
+ def postmark_attachments=(value)
13
+ @_attachments = value.is_a?(Array) ? value : [value]
14
+ end
15
+
16
+ def postmark_attachments
17
+ return if @_attachments.nil?
18
+
19
+ @_attachments.collect do |item|
20
+ if item.is_a?(Hash)
21
+ item
22
+ elsif item.is_a?(File)
23
+ {
24
+ "Name" => item.path.split("/")[-1],
25
+ "Content" => [ IO.read(item.path) ].pack("m"),
26
+ "ContentType" => "application/octet-stream"
27
+ }
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
@@ -7,20 +7,14 @@
7
7
  #
8
8
  # This is a patch to try to resolve this
9
9
  #
10
- # just require 'tmail_mail_extension'
10
+ # just require 'extensions/tmail'
11
11
  # and every TMail::Mail object will have the .body_html method
12
12
  #
13
13
 
14
14
  module TMail
15
15
  class Mail
16
-
17
- def tag
18
- self["TAG"]
19
- end
20
-
21
- def tag=(value)
22
- self["TAG"] = value
23
- end
16
+
17
+ include Postmark::SharedMessageExtensions
24
18
 
25
19
  #
26
20
  # returs an String with just the html part of the body
@@ -86,7 +80,7 @@ module TMail
86
80
  header = part["content-type"]
87
81
 
88
82
  if part.multipart?
89
- puts " --multipartt--"
83
+ puts " --multipart--"
90
84
  part.parts.each_with_index do |part2, index2|
91
85
  puts " part[#{index}][#{index2}]"
92
86
  puts " content_type: #{part2.content_type}"
data/postmark.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{postmark}
8
- s.version = "0.8.0"
8
+ s.version = "0.9.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Petyo Ivanov"]
12
- s.date = %q{2010-09-16}
11
+ s.authors = ["Petyo Ivanov", "Ilya Sabanin"]
12
+ s.date = %q{2010-09-17}
13
13
  s.description = %q{Ruby gem for sending emails through http://postmarkapp.com HTTP API. It relieas on TMail::Mail for message construction.}
14
14
  s.email = %q{underlog@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
  ".document",
22
22
  ".gitignore",
23
23
  ".rake_tasks",
24
+ "CHANGELOG.rdoc",
24
25
  "Gemfile",
25
26
  "Gemfile.lock",
26
27
  "LICENSE",
@@ -31,16 +32,18 @@ Gem::Specification.new do |s|
31
32
  "features/step_definitions/postmark_steps.rb",
32
33
  "features/support/env.rb",
33
34
  "init.rb",
34
- "lib/mail/postmark.rb",
35
35
  "lib/postmark.rb",
36
+ "lib/postmark/attachments_fix_for_mail.rb",
36
37
  "lib/postmark/bounce.rb",
38
+ "lib/postmark/handlers/mail.rb",
37
39
  "lib/postmark/http_client.rb",
38
40
  "lib/postmark/json.rb",
39
- "lib/postmark/mail_message_extension.rb",
41
+ "lib/postmark/message_extensions/mail.rb",
42
+ "lib/postmark/message_extensions/shared.rb",
43
+ "lib/postmark/message_extensions/tmail.rb",
40
44
  "lib/postmark/response_parsers/active_support.rb",
41
45
  "lib/postmark/response_parsers/json.rb",
42
46
  "lib/postmark/response_parsers/yajl.rb",
43
- "lib/postmark/tmail_mail_extension.rb",
44
47
  "postmark.gemspec",
45
48
  "spec/bounce_spec.rb",
46
49
  "spec/postmark_spec.rb",
metadata CHANGED
@@ -4,17 +4,18 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 8
7
+ - 9
8
8
  - 0
9
- version: 0.8.0
9
+ version: 0.9.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Petyo Ivanov
13
+ - Ilya Sabanin
13
14
  autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-09-16 00:00:00 +02:00
18
+ date: 2010-09-17 00:00:00 +02:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
@@ -67,6 +68,7 @@ files:
67
68
  - .document
68
69
  - .gitignore
69
70
  - .rake_tasks
71
+ - CHANGELOG.rdoc
70
72
  - Gemfile
71
73
  - Gemfile.lock
72
74
  - LICENSE
@@ -77,16 +79,18 @@ files:
77
79
  - features/step_definitions/postmark_steps.rb
78
80
  - features/support/env.rb
79
81
  - init.rb
80
- - lib/mail/postmark.rb
81
82
  - lib/postmark.rb
83
+ - lib/postmark/attachments_fix_for_mail.rb
82
84
  - lib/postmark/bounce.rb
85
+ - lib/postmark/handlers/mail.rb
83
86
  - lib/postmark/http_client.rb
84
87
  - lib/postmark/json.rb
85
- - lib/postmark/mail_message_extension.rb
88
+ - lib/postmark/message_extensions/mail.rb
89
+ - lib/postmark/message_extensions/shared.rb
90
+ - lib/postmark/message_extensions/tmail.rb
86
91
  - lib/postmark/response_parsers/active_support.rb
87
92
  - lib/postmark/response_parsers/json.rb
88
93
  - lib/postmark/response_parsers/yajl.rb
89
- - lib/postmark/tmail_mail_extension.rb
90
94
  - postmark.gemspec
91
95
  - spec/bounce_spec.rb
92
96
  - spec/postmark_spec.rb