postmark 0.9.1 → 0.9.2
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 +4 -0
- data/VERSION +1 -1
- data/lib/postmark.rb +42 -79
- data/postmark.gemspec +2 -2
- data/spec/bounce_spec.rb +1 -1
- data/spec/postmark_spec.rb +8 -8
- data/spec/spec_helper.rb +1 -1
- metadata +4 -4
data/CHANGELOG.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.9.
|
1
|
+
0.9.2
|
data/lib/postmark.rb
CHANGED
@@ -16,11 +16,11 @@ require_local 'attachments_fix_for_mail'
|
|
16
16
|
|
17
17
|
module Postmark
|
18
18
|
|
19
|
-
class
|
20
|
-
class
|
19
|
+
class UnknownError < StandardError; end
|
20
|
+
class InvalidApiKeyError < StandardError; end
|
21
21
|
class InvalidMessageError < StandardError; end
|
22
22
|
class InternalServerError < StandardError; end
|
23
|
-
class UnknownMessageType
|
23
|
+
class UnknownMessageType < StandardError; end
|
24
24
|
|
25
25
|
module ResponseParsers
|
26
26
|
autoload :Json, 'postmark/response_parsers/json'
|
@@ -83,7 +83,7 @@ module Postmark
|
|
83
83
|
def send_through_postmark(message) #:nodoc:
|
84
84
|
@retries = 0
|
85
85
|
begin
|
86
|
-
HttpClient.post("email", Postmark::Json.encode(
|
86
|
+
HttpClient.post("email", Postmark::Json.encode(convert_message_to_options_hash(message)))
|
87
87
|
rescue Exception => e
|
88
88
|
if @retries < max_retries
|
89
89
|
@retries += 1
|
@@ -94,42 +94,25 @@ module Postmark
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
def
|
98
|
-
|
99
|
-
|
100
|
-
else
|
101
|
-
convert_mail(message)
|
102
|
-
end
|
103
|
-
end
|
97
|
+
def convert_message_to_options_hash(message)
|
98
|
+
options = Hash.new
|
99
|
+
headers = extract_headers_according_to_message_format(message)
|
104
100
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
options
|
113
|
-
|
114
|
-
headers = extract_mail_headers(message)
|
115
|
-
options["Headers"] = headers unless headers.length == 0
|
116
|
-
|
117
|
-
options["To"] = message.to.join(", ")
|
118
|
-
|
119
|
-
options["Tag"] = message.tag.to_s unless message.tag.nil?
|
120
|
-
|
121
|
-
options["Cc"] = message.cc.join(", ").to_s unless message.cc.nil?
|
122
|
-
|
123
|
-
options["Bcc"] = message.bcc.join(", ").to_s unless message.bcc.nil?
|
124
|
-
|
125
|
-
options["Attachments"] = message.postmark_attachments unless message.postmark_attachments.nil?
|
126
|
-
|
127
|
-
if reply_to = message['reply-to']
|
128
|
-
options["ReplyTo"] = reply_to.to_s
|
129
|
-
end
|
101
|
+
options["From"] = message.from.try(:first)
|
102
|
+
options["ReplyTo"] = message.reply_to.try(:join, ", ")
|
103
|
+
options["To"] = message.to.try(:join, ", ")
|
104
|
+
options["Cc"] = message.cc.try(:join, ", ")
|
105
|
+
options["Bcc"] = message.bcc.try(:join, ", ")
|
106
|
+
options["Subject"] = message.subject
|
107
|
+
options["Attachments"] = message.postmark_attachments
|
108
|
+
options["Tag"] = message.tag.to_s if message.tag
|
109
|
+
options["Headers"] = headers if headers.size > 0
|
130
110
|
|
111
|
+
options = options.delete_if{|k,v| v.nil?}
|
112
|
+
|
131
113
|
html = message.body_html
|
132
114
|
text = message.body_text
|
115
|
+
|
133
116
|
if message.multipart?
|
134
117
|
options["HtmlBody"] = html
|
135
118
|
options["TextBody"] = text
|
@@ -138,9 +121,26 @@ module Postmark
|
|
138
121
|
else
|
139
122
|
options["TextBody"] = text
|
140
123
|
end
|
124
|
+
|
141
125
|
options
|
142
126
|
end
|
143
127
|
|
128
|
+
def delivery_stats
|
129
|
+
HttpClient.get("deliverystats")
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
|
134
|
+
def extract_headers_according_to_message_format(message)
|
135
|
+
if defined?(TMail) && message.is_a?(TMail::Mail)
|
136
|
+
headers = extract_tmail_headers(message)
|
137
|
+
elsif defined?(Mail) && message.kind_of?(Mail::Message)
|
138
|
+
headers = extract_mail_headers(message)
|
139
|
+
else
|
140
|
+
raise "Can't convert message to a valid hash of API options. Unknown message format."
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
144
|
def extract_mail_headers(message)
|
145
145
|
headers = []
|
146
146
|
message.header.fields.each do |field|
|
@@ -153,37 +153,6 @@ module Postmark
|
|
153
153
|
headers
|
154
154
|
end
|
155
155
|
|
156
|
-
def convert_tmail(message)
|
157
|
-
options = { "From" => message['from'].to_s, "To" => message['to'].to_s, "Subject" => message.subject }
|
158
|
-
|
159
|
-
headers = extract_tmail_headers(message)
|
160
|
-
options["Headers"] = headers unless headers.length == 0
|
161
|
-
|
162
|
-
options["Tag"] = message.tag.to_s unless message.tag.nil?
|
163
|
-
|
164
|
-
options["Cc"] = message['cc'].to_s unless message.cc.nil?
|
165
|
-
|
166
|
-
options["Bcc"] = message['bcc'].to_s unless message.bcc.nil?
|
167
|
-
|
168
|
-
options["Attachments"] = message.postmark_attachments unless message.postmark_attachments.nil?
|
169
|
-
|
170
|
-
if reply_to = message['reply-to']
|
171
|
-
options["ReplyTo"] = reply_to.to_s
|
172
|
-
end
|
173
|
-
|
174
|
-
html = message.body_html
|
175
|
-
text = message.body_text
|
176
|
-
if message.multipart?
|
177
|
-
options["HtmlBody"] = html
|
178
|
-
options["TextBody"] = text
|
179
|
-
elsif html
|
180
|
-
options["HtmlBody"] = message.body_html
|
181
|
-
else
|
182
|
-
options["TextBody"] = text
|
183
|
-
end
|
184
|
-
options
|
185
|
-
end
|
186
|
-
|
187
156
|
def extract_tmail_headers(message)
|
188
157
|
headers = []
|
189
158
|
message.each_header do |key, value|
|
@@ -196,18 +165,12 @@ module Postmark
|
|
196
165
|
|
197
166
|
def bogus_headers
|
198
167
|
%q[
|
199
|
-
return-path
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
date
|
206
|
-
content-type
|
207
|
-
cc
|
208
|
-
bcc
|
209
|
-
subject
|
210
|
-
tag
|
168
|
+
return-path x-pm-rcpt
|
169
|
+
from reply-to
|
170
|
+
sender received
|
171
|
+
date content-type
|
172
|
+
cc bcc
|
173
|
+
subject tag
|
211
174
|
attachment
|
212
175
|
]
|
213
176
|
end
|
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.9.
|
8
|
+
s.version = "0.9.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Petyo Ivanov", "Ilya Sabanin"]
|
12
|
-
s.date = %q{2010-09-
|
12
|
+
s.date = %q{2010-09-29}
|
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 = [
|
data/spec/bounce_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe "Bounce" do
|
4
4
|
let(:bounce_json) { %{{"Type":"HardBounce","TypeCode":1,"Details":"test bounce","Email":"jim@test.com","BouncedAt":"#{Time.now.to_s}","DumpAvailable":true,"Inactive":false,"CanActivate":true,"ID":12}} }
|
5
|
-
let(:bounces_json) { "[#{bounce_json},#{bounce_json}]
|
5
|
+
let(:bounces_json) { %{{"Bounces": [#{bounce_json},#{bounce_json}]}} }
|
6
6
|
|
7
7
|
context "single bounce" do
|
8
8
|
let(:bounce) { Postmark::Bounce.find(12) }
|
data/spec/postmark_spec.rb
CHANGED
@@ -113,16 +113,16 @@ describe "Postmark" do
|
|
113
113
|
context "tmail parse" do
|
114
114
|
def be_serialized_to(json)
|
115
115
|
simple_matcher "be serialized to #{json}" do |message|
|
116
|
-
Postmark.send(:
|
116
|
+
Postmark.send(:convert_message_to_options_hash, tmail_message).should == JSON.parse(json)
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should set text body for plain message" do
|
121
|
-
Postmark.send(:
|
121
|
+
Postmark.send(:convert_message_to_options_hash, tmail_message)['TextBody'].should_not be_nil
|
122
122
|
end
|
123
123
|
|
124
124
|
it "should set html body for html message" do
|
125
|
-
Postmark.send(:
|
125
|
+
Postmark.send(:convert_message_to_options_hash, tmail_html_message)['HtmlBody'].should_not be_nil
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should encode custom headers headers properly" do
|
@@ -159,21 +159,21 @@ describe "Postmark" do
|
|
159
159
|
context "mail parse" do
|
160
160
|
def be_serialized_to(json)
|
161
161
|
simple_matcher "be serialized to #{json}" do |message|
|
162
|
-
Postmark.send(:
|
162
|
+
Postmark.send(:convert_message_to_options_hash, mail_message).should == JSON.parse(json)
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
166
166
|
it "should set text body for plain message" do
|
167
|
-
Postmark.send(:
|
167
|
+
Postmark.send(:convert_message_to_options_hash, mail_message)['TextBody'].should_not be_nil
|
168
168
|
end
|
169
169
|
|
170
170
|
it "should set html body for html message" do
|
171
|
-
Postmark.send(:
|
171
|
+
Postmark.send(:convert_message_to_options_hash, mail_html_message)['HtmlBody'].should_not be_nil
|
172
172
|
end
|
173
173
|
|
174
174
|
it "should set html and text body for multipart message" do
|
175
|
-
Postmark.send(:
|
176
|
-
Postmark.send(:
|
175
|
+
Postmark.send(:convert_message_to_options_hash, mail_multipart_message)['HtmlBody'].should_not be_nil
|
176
|
+
Postmark.send(:convert_message_to_options_hash, mail_multipart_message)['TextBody'].should_not be_nil
|
177
177
|
end
|
178
178
|
|
179
179
|
it "should encode custom headers properly" do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
3
4
|
require 'mail'
|
4
5
|
require 'tmail'
|
5
6
|
require 'postmark'
|
6
|
-
require 'rubygems'
|
7
7
|
require 'active_support'
|
8
8
|
require 'json'
|
9
9
|
require 'ruby-debug'
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postmark
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Petyo Ivanov
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-09-
|
19
|
+
date: 2010-09-29 00:00:00 +08:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|