postmark 1.8.1 → 1.21.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.travis.yml +8 -5
  4. data/CHANGELOG.rdoc +86 -0
  5. data/CONTRIBUTING.md +18 -0
  6. data/Gemfile +6 -5
  7. data/LICENSE +1 -1
  8. data/README.md +34 -607
  9. data/RELEASE.md +12 -0
  10. data/VERSION +1 -1
  11. data/gemfiles/Gemfile.legacy +5 -4
  12. data/lib/postmark.rb +1 -18
  13. data/lib/postmark/account_api_client.rb +55 -1
  14. data/lib/postmark/api_client.rb +145 -17
  15. data/lib/postmark/bounce.rb +0 -4
  16. data/lib/postmark/client.rb +12 -4
  17. data/lib/postmark/error.rb +127 -0
  18. data/lib/postmark/handlers/mail.rb +10 -4
  19. data/lib/postmark/helpers/message_helper.rb +4 -0
  20. data/lib/postmark/http_client.rb +20 -32
  21. data/lib/postmark/mail_message_converter.rb +18 -5
  22. data/lib/postmark/message_extensions/mail.rb +83 -8
  23. data/lib/postmark/version.rb +1 -1
  24. data/postmark.gemspec +1 -1
  25. data/postmark.png +0 -0
  26. data/spec/integration/account_api_client_spec.rb +42 -10
  27. data/spec/integration/api_client_hashes_spec.rb +32 -49
  28. data/spec/integration/api_client_messages_spec.rb +33 -52
  29. data/spec/integration/api_client_resources_spec.rb +12 -44
  30. data/spec/integration/mail_delivery_method_spec.rb +21 -23
  31. data/spec/spec_helper.rb +4 -7
  32. data/spec/support/custom_matchers.rb +44 -0
  33. data/spec/support/shared_examples.rb +16 -16
  34. data/spec/unit/postmark/account_api_client_spec.rb +239 -45
  35. data/spec/unit/postmark/api_client_spec.rb +792 -406
  36. data/spec/unit/postmark/bounce_spec.rb +40 -62
  37. data/spec/unit/postmark/client_spec.rb +0 -6
  38. data/spec/unit/postmark/error_spec.rb +231 -0
  39. data/spec/unit/postmark/handlers/mail_spec.rb +59 -27
  40. data/spec/unit/postmark/helpers/hash_helper_spec.rb +5 -6
  41. data/spec/unit/postmark/helpers/message_helper_spec.rb +60 -11
  42. data/spec/unit/postmark/http_client_spec.rb +76 -61
  43. data/spec/unit/postmark/inbound_spec.rb +34 -34
  44. data/spec/unit/postmark/inflector_spec.rb +11 -13
  45. data/spec/unit/postmark/json_spec.rb +2 -2
  46. data/spec/unit/postmark/mail_message_converter_spec.rb +250 -81
  47. data/spec/unit/postmark/message_extensions/mail_spec.rb +249 -38
  48. data/spec/unit/postmark_spec.rb +37 -37
  49. metadata +41 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 04bb2d6b28c097935401c0bef37ca1ea75114d12
4
- data.tar.gz: ab9fb06aea0112f5ac0a7ab94902592a0ed7bfab
2
+ SHA256:
3
+ metadata.gz: fb0f51e437e4831ac7fe011e089ac51c00984a614f48f31e94cce6233331f3bd
4
+ data.tar.gz: 599f2b99b5a8bca7a5761c560feddac36cd252a2232431008c3eabc1ef3375b0
5
5
  SHA512:
6
- metadata.gz: 324a336fbf5d24aa554e4d8aba8fd55ed4785cd4bb0b42bc1241bfdb6230e6d59ab8da5165e08343b084c9eed68f11dd2a7d2aa0a7e4ff0761c8a7cf2723215b
7
- data.tar.gz: 96c991acef4077c05af52f7f0bda6084e6777e6d3bc3e4c08ae75c0f421b03d8ff943a13d89b5e8ceab732f83432023ad0f58f4f1f22342fc57b2aa9752e0473
6
+ metadata.gz: 7f16405603d847f6e8b4124a7da3c478db38555196016d59cb743c4d63f154e512ffac6d9db74702340e19cfa2afdb04965fdcb3436ab92c62f031d2d2b7ba0b
7
+ data.tar.gz: 6429f12e770e5a305f2bcb705cff501c48ebeb45be85dbd78f44e32cc4b5312abd0d6d9789c5c29e7cb3fca411a4e1a748a34fdc35e703862202e7c72851a0be
data/.gitignore CHANGED
@@ -6,3 +6,5 @@ pkg/*
6
6
  .rvmrc
7
7
  .idea
8
8
  bin/*
9
+ *.swp
10
+ .DS_Store
data/.travis.yml CHANGED
@@ -5,24 +5,27 @@ env:
5
5
  # POSTMARK_ACCOUNT_API_KEY=?
6
6
  - secure: "lau1m+ws6T5LBiRXwd+Q0b20Wjh62W/nHnCmzOSZc2+V97XTldl3MCJdXNV7J6X7O9CzFabcAG8FSbGGwPRiyhY/qhxkYSc/9pWE8RUjyCjbw5q2RzZQelMKizyKU92eOjd6jQw/wDSZcww1OceW/pgdRjqEo21Pk6XH2yzLAd8="
7
7
  # POSTMARK_CI_RECIPIENT=?
8
- - secure: "V5GeJn1rch72qcAz/YI9tSEnZ2Zb4utWzq9ntr9gojRVFGpocgIbULmeslTKyIN7s5kF23qnhsGmPA9Olwz1ZqV9zhdWcsm4PUhUU/n3tVAnLWpUDjeneD5P+IOO6S+bCzVZX+Gk5/agBt2bQeAbVe+lVh5RZQJc3lsEvkVv7QM="
8
+ - secure: "XJkpUbAC1N6vcL/bUvqX2Mx8OKXpr/3zwqhjGiWhrSGKmQJUNnK4TEGFjnb1TBncZvW5cBRD0oX1Tt7gAu4o8C6sldVf35hB5FQsEyQrgSN4s95uLHuTW9EQisiQS6kzPLbkUmsMIQhIlfNGKQ5tRzRQstip81E8a0Emth3Y9EQ="
9
9
  # POSTMARK_CI_SENDER=?
10
- - secure: "BjCKS4oNN1n2pQx31tA9kmfcim4BkAsO2Rg1clezEu1kEbsGzn6sjoVVeXZSHhfkZ0Gk6qW8y1fQm0gnyMQyugh8wlz8UfIS7m5CIR7ZwrWroToisbF6sHPVtoBuY8+hvtB89PXyoKKv9TBjnLEPTZFKnxP9vcYsbi45Sm06MOg="
10
+ - secure: "bOoU3WEFur/SqwTY0m0aGqy8v8AZfZtFFHNYsU/BtAppZXj378CiktvJGj+cz/KMqFEWyJKNzchFOfZa45Q9Xor/QbTqkBriTOz3Ff7gQpmuPfLSvWRQSLRmbRFgr0Dk8QCTTtfnNtnajxMUyGfxwCiMo+l3EEAqjtLpN+Gja20="
11
11
  language: ruby
12
12
  rvm:
13
13
  - 2.0.0
14
14
  - 2.1.9
15
15
  - 2.2.5
16
16
  - 2.3.1
17
+ - 2.5.7
18
+ - 2.6.5
19
+ - 2.7.0
17
20
  matrix:
18
21
  include:
19
22
  - rvm: 1.8.7
23
+ dist: precise
20
24
  gemfile: gemfiles/Gemfile.legacy
21
25
  - rvm: 1.9.3
22
26
  gemfile: gemfiles/Gemfile.legacy
23
27
  - rvm: jruby-19mode
28
+ jdk: oraclejdk8
29
+ dist: trusty
24
30
  gemfile: gemfiles/Gemfile.legacy
25
31
  script: bundle exec rake spec
26
- before_install:
27
- - gem update --system
28
- - gem install bundler
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,91 @@
1
1
  = Changelog
2
2
 
3
+ == 1.21.3
4
+
5
+ * Remove default SSL version setting and rely on Net::HTTP/OpenSSL default.
6
+
7
+ == 1.21.2
8
+
9
+ * Ensure sending via message stream uses the correct message stream
10
+
11
+ == 1.21.1
12
+
13
+ * Fixed Postmark::ApiClient#get_message_streams
14
+
15
+ == 1.21.0
16
+
17
+ * Added support for message streams and suppressions
18
+
19
+ == 1.20.0
20
+
21
+ * Removed deprecated trigger endpoints
22
+
23
+ == 1.19.2
24
+
25
+ Allow possibility to change TLS version for HTTP client.
26
+
27
+ == 1.19.1
28
+
29
+ Bounce tags endoint removed, since it's no longer supported by API.
30
+
31
+ == 1.19.0
32
+
33
+ Webhooks management support is added.
34
+
35
+ == 1.18.0
36
+
37
+ Custom headers with any type of character casing is supported now.
38
+
39
+ == 1.17.0
40
+
41
+ * Update sent email message properly and not altering it's Message-ID with Postmark unique message id.
42
+
43
+ == 1.16.0
44
+
45
+ * Added support for template pushes.
46
+
47
+ == 1.15.0
48
+
49
+ * Extended Mail::Message objects with support for Postmark templates.
50
+ * Added ApiClient#deliver_message_with_template and ApiClient#deliver_messages_with_templates
51
+ * Removed Rake from dependencies.
52
+
53
+ == 1.14.0
54
+
55
+ * Added support for verifying DKIM/Return-Path.
56
+ * Added support for searching inbound rules.
57
+ * Updated README.
58
+
59
+ == 1.13.0
60
+
61
+ * Changed default value returned by Mail::Message#metadata to a mutable hash (makes things easier for postmark-rails).
62
+ * All message JSON payloads now include an empty metadata object even if metadata is unset.
63
+
64
+ == 1.12.0
65
+
66
+ * Added support for attaching metadata to messages.
67
+
68
+ == 1.11.0
69
+
70
+ * New, improved, and backwards-compatible gem errors (see README).
71
+ * Added support for retrieving message clicks using the Messages API.
72
+ * Added support for sending templated message in batches.
73
+ * Added support for assigning link tracking mode via `Mail::Message` headers.
74
+
75
+ == 1.10.0
76
+
77
+ * Fix a bug when open tracking flag is set to false by default, when open tracking flag is not set by a user.
78
+ * Added support for link tracking
79
+
80
+ == 1.9.1
81
+
82
+ * Fix a bug when port setting is not respected.
83
+ * Made `Postmark::HttpClient#protocol` method public.
84
+
85
+ == 1.9.0
86
+
87
+ * Added methods to access domains API endoints.
88
+
3
89
  == 1.8.1
4
90
 
5
91
  * Technical release. Fixed gemspec.
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,18 @@
1
+ # Before you report an issue or submit a pull request
2
+
3
+ *If you are blocked or need help with Postmark, please [contact
4
+ Postmark Support](https://postmarkapp.com/contact)*. For other, non-urgent
5
+ cases you’re welcome to report a bug and/or contribute to this project. We will
6
+ make our best effort to review your contributions and triage any bug reports in
7
+ a timely fashion.
8
+
9
+ If you’d like to submit a pull request:
10
+
11
+ * Fork the project.
12
+ * Make your feature addition or bug fix.
13
+ * Add tests for it. This is important to prevent future regressions.
14
+ * Do not mess with rakefile, version, or history.
15
+ * Update the CHANGELOG, list your changes under Unreleased.
16
+ * Update the README if necessary.
17
+ * Write short, descriptive commit messages, following the format used in therepo.
18
+ * Send a pull request. Bonus points for topic branches.
data/Gemfile CHANGED
@@ -4,11 +4,12 @@ source "http://rubygems.org"
4
4
  gemspec
5
5
 
6
6
  group :test do
7
- gem 'rspec', '~> 2.14.0'
8
- gem 'fakeweb'
7
+ gem 'rspec', '~> 3.7'
8
+ gem 'rspec-its', '~> 1.2'
9
+ gem 'fakeweb', :git => 'https://github.com/chrisk/fakeweb.git'
9
10
  gem 'fakeweb-matcher'
10
- gem 'mime-types', '~> 1.25.1'
11
- gem 'activesupport', '~> 3.2.0'
11
+ gem 'mime-types'
12
+ gem 'activesupport'
12
13
  gem 'i18n', '~> 0.6.0'
13
14
  gem 'yajl-ruby', '~> 1.0', :platforms => [:mingw, :mswin, :ruby]
14
- end
15
+ end
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Petyo Ivanov
1
+ Copyright (c) 2018 Wildbit LLC.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,638 +1,65 @@
1
- # Postmark Gem
2
- [![Build Status](https://travis-ci.org/wildbit/postmark-gem.svg?branch=master)](https://travis-ci.org/wildbit/postmark-gem) [![Code Climate](https://codeclimate.com/github/wildbit/postmark-gem/badges/gpa.svg)](https://codeclimate.com/github/wildbit/postmark-gem)
3
-
4
- This gem is the official wrapper for the [Postmark HTTP API](http://postmarkapp.com). Postmark allows you to send your application's emails with high delivery rates, including bounce/spam processing and detailed statistics. In addition, Postmark can parse incoming emails which are forwarded back to your application.
5
-
6
- ## Install the gem
7
-
8
- With Bundler:
9
-
10
- ``` ruby
11
- gem 'postmark'
12
- ```
13
-
14
- Without Bundler:
15
-
16
- ``` bash
17
- gem install postmark
18
- ```
19
-
20
- ## Get a Postmark API token
21
-
22
- In order to send emails using Postmark ruby gem, you will need a
23
- [Postmark](http://postmarkapp.com) account. If you don't have one please
24
- register at https://postmarkapp.com/sign_up.
25
-
26
- If you didn’t create any servers yet, please create one, proceed to the
27
- `Credentials` tab and copy an API token. API tokens should be frequently rotated for
28
- security reasons.
29
-
30
- ## Communicating with the API
31
-
32
- Make sure you have a [sender signature](https://postmarkapp.com/signatures) for
33
- every From email address you specify.
34
-
35
- Create an instance of `Postmark::ApiClient` to start sending emails.
36
-
37
- ``` ruby
38
- your_api_token = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
39
- client = Postmark::ApiClient.new(your_api_token)
40
- ```
41
-
42
- `Postmark::ApiClient` accepts various options:
43
-
44
- ``` ruby
45
- client = Postmark::ApiClient.new(your_api_token, http_open_timeout: 15)
46
- ```
47
-
48
- Some useful options are:
49
-
50
- * `secure` (`true` or `false`): set to false to disable SSL connection.
51
- * `http_read_timeout` (positive number): limit HTTP read time to `n` seconds.
52
- * `http_open_timeout` (positive number): limit HTTP open time to `n` seconds.
53
- * `proxy_host` (string): proxy address to use.
54
- * `proxy_port` (positive number): proxy port to use.
55
- * `proxy_user` (string): proxy user.
56
- * `proxy_pass` (string): proxy password.
57
-
58
- ## Sending a plain text message
59
-
60
- ``` ruby
61
- client.deliver(from: 'sheldon@bigbangtheory.com',
62
- to: 'Leonard Hofstadter <leonard@bigbangtheory.com>',
63
- subject: 'Re: Come on, Sheldon. It will be fun.',
64
- text_body: 'That\'s what you said about the Green Lantern ' \
65
- 'movie. You were 114 minutes of wrong.')
66
- # => {:to=>"Leonard Hofstadter <leonard@bigbangtheory.com>", :submitted_at=>"2013-05-09T02:45:16.2059023-04:00", :message_id=>"b2b268e3-6a70-xxxx-b897-49c9eb8b1d2e", :error_code=>0, :message=>"OK"}
67
- ```
68
-
69
- ## Sending an HTML message (with open tracking!)
70
-
71
- Simply pass an HTML document as html_body parameter to `#deliver`. You can also enable open tracking by setting `track_opens` to `true`.
72
-
73
- ``` ruby
74
- client.deliver(from: 'sheldon@bigbangtheory.com',
75
- to: 'Leonard Hofstadter <leonard@bigbangtheory.com>',
76
- subject: 'Re: What, to you, is a large crowd?',
77
- html_body: '<p>Any group big enough to trample me to death. ' \
78
- 'General rule of thumb is 36 adults or 70 ' \
79
- 'children.</p>',
80
- track_opens: true)
81
- # => {:to=>"Leonard Hofstadter <leonard@bigbangtheory.com>", :submitted_at=>"2013-05-09T02:51:08.8789433-04:00", :message_id=>"75c28987-564e-xxxx-b6eb-e8071873ac06", :error_code=>0, :message=>"OK"}
82
- ```
83
-
84
- ## Sending a message with attachments
85
-
86
- You can add
87
- [attachments](http://developer.postmarkapp.com/developer-build.html#attachments)
88
- to your messages. Keep in mind message size limit (contents and attachment) is currently 10 MB. For inline attachments it is possible to specify content IDs via the `content_id` attribute.
89
-
90
- ``` ruby
91
- client.deliver(from: 'leonard@bigbangtheory.com',
92
- to: 'Dr. Sheldon Cooper <sheldon@bigbangtheory.com>',
93
- subject: 'Have you seen these pictures of yours?',
94
- text_body: 'You look like a real geek!',
95
- html_body: '<p>You look like a real geek!</p><center><img src="cid:42"></center>',
96
- attachments: [File.open('1.jpeg'),
97
- {name: 'sheldon.jpeg',
98
- content: [File.read('2.jpeg')].pack('m'),
99
- content_type: 'image/jpeg'},
100
- {name: 'logo.png',
101
- content: [File.read('1.png')].pack('m'),
102
- content_type: 'image/png',
103
- content_id: 'cid:42'}])
104
-
105
- # => {:to=>"Dr. Sheldon Cooper <sheldon@bigbangtheory.com>", :submitted_at=>"2013-05-09T02:56:12.2828813-04:00", :message_id=>"8ec0d283-8b93-xxxx-9d65-241d1777cf0f", :error_code=>0, :message=>"OK"}
106
- ```
107
-
108
- ## Sending a multipart message
109
-
110
- ``` ruby
111
- client.deliver(from: 'sheldon@bigbangtheory.com',
112
- to: 'Leonard Hofstadter <leonard@bigbangtheory.com>',
113
- subject: 'Re: Anything Can Happen Thursday',
114
- text_body: 'Apparently the news didn\'t reach my digestive ' \
115
- 'system, which when startled has it\'s own version ' \
116
- 'of "Anything Can Happen Thursday"',
117
- html_body: '<p>Apparently the news didn&rsquo;t reach my ' \
118
- 'digestive system, which when startled has ' \
119
- 'it&rsquo;s own version of &ldquo;Anything Can '\
120
- 'Happen Thursday&rdquo;</p>')
121
- # => {:to=>"Leonard Hofstadter <leonard@bigbangtheory.com>", :submitted_at=>"2013-05-09T02:58:00.089828-04:00", :message_id=>"bc973458-1315-xxxx-b295-6aa0a2b631ac", :error_code=>0, :message=>"OK"}
122
- ```
123
-
124
- ## Tagging messages
125
-
126
- You can categorize outgoing email using the optional `:tag` property. If you use
127
- different tags for the different types of emails your application generates,
128
- you will be able to get detailed statistics for them through the Postmark user
129
- interface.
130
-
131
- ``` ruby
132
- client.deliver(from: 'sheldon@bigbangtheory.com',
133
- to: 'Penny <penny@bigbangtheory.com>',
134
- subject: 'Re: You cleaned my apartment???',
135
- text_body: 'I couldn\'t sleep knowing that just outside my ' \
136
- 'bedroom is our living room and just outside our ' \
137
- 'living room is that hallway and immediately adjacent ' \
138
- 'to that hallway is this!',
139
- tag: 'confidential')
140
-
141
- # => {:to=>"Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T03:00:55.4454938-04:00", :message_id=>"34aed4b3-3a95-xxxx-bd1d-88064909cc93", :error_code=>0, :message=>"OK"}
142
- ```
143
-
144
- ## Sending to multiple recipients
145
-
146
- You can pass multiple recipient addresses in the `:to` field and the optional
147
- `:cc` and `:bcc` fields. Note that Postmark has a limit of 50 recipients
148
- per message in total. You need to take care not to exceed that limit.
149
- Otherwise, you will get an error.
1
+ <a href="https://postmarkapp.com">
2
+ <img src="postmark.png" alt="Postmark Logo" title="Postmark" width="120" height="120" align="right">
3
+ </a>
150
4
 
151
- ``` ruby
152
- client.deliver(from: 'sheldon@bigbangtheory.com',
153
- to: ['Leonard Hofstadter <leonard@bigbangtheory.com>',
154
- 'Penny <penny@bigbangtheory.com>'],
155
- cc: ['Dr. Koothrappali <raj@bigbangtheory.com>'],
156
- bcc: 'secretsheldonstorage@bigbangtheory.com',
157
- subject: 'Re: Come on, Sheldon. It will be fun.',
158
- text_body: 'That\'s what you said about the Green Lantern ' \
159
- 'movie. You were 114 minutes of wrong.')
160
- # => {:to=>"Leonard Hofstadter <leonard@bigbangtheory.com>, Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T05:04:16.3247488-04:00", :message_id=>"d647c5d6-xxxx-466d-9411-557dcd5c2297", :error_code=>0, :message=>"OK"}
161
- ```
162
-
163
- ## Sending a templated email
164
-
165
- If you have a [template created](https://github.com/wildbit/postmark-gem/wiki/The-Templates-API-support) in Postmark you can send an email using that template.
166
-
167
- ``` ruby
168
- client.deliver_with_template(from: 'sheldon@bigbangtheory.com',
169
- to: 'Penny <penny@bigbangtheory.com>',
170
- template_id: 123,
171
- template_model: {
172
- name: 'Penny',
173
- message: 'Bazinga!'
174
- })
175
-
176
- # => {:to=>"Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T03:00:55.4454938-04:00", :message_id=>"34aed4b3-3a95-xxxx-bd1d-88064909cc93", :error_code=>0, :message=>"OK"}
177
- ```
178
-
179
- ## Sending in batches
180
-
181
- While Postmark is focused on transactional email, we understand that developers
182
- with higher volumes or processing time constraints need to send their messages
183
- in batches. To facilitate this we provide a batching endpoint that permits you
184
- to send up to 500 well-formed Postmark messages in a single API call.
185
-
186
- ``` ruby
187
- messages = []
188
-
189
- messages << {from: 'sheldon@bigbangtheory.com',
190
- to: 'Leonard Hofstadter <leonard@bigbangtheory.com>',
191
- subject: 'Re: Come on, Sheldon. It will be fun.',
192
- text_body: 'That\'s what you said about the Green Lantern ' \
193
- 'movie. You were 114 minutes of wrong.'}
194
-
195
- messages << {from: 'sheldon@bigbangtheory.com',
196
- to: 'Penny <penny@bigbangtheory.com>',
197
- subject: 'Re: You cleaned my apartment???',
198
- text_body: 'I couldn\'t sleep knowing that just outside my ' \
199
- 'bedroom is our living room and just outside our ' \
200
- 'living room is that hallway and immediately ' \
201
- 'adjacent to that hallway is this!',
202
- tag: 'confidential'}
203
-
204
- client.deliver_in_batches(messages)
205
- # => [{:to=>"Leonard Hofstadter <leonard@bigbangtheory.com>", :submitted_at=>"2013-05-09T05:19:16.3361118-04:00", :message_id=>"247e43a9-6b0d-4914-a87f-7b74bf76b5cb", :error_code=>0, :message=>"OK"}, {:to=>"Penny <penny@bigbangtheory.com>", :submitted_at=>"2013-05-09T05:19:16.3517099-04:00", :message_id=>"26467642-f169-4da8-87a8-b89154067dfb", :error_code=>0, :message=>"OK"}]
206
- ```
207
-
208
- ## Parsing inbound
209
-
210
- Inbound processing allows you (or your users) to send emails to Postmark, which we then
211
- process and deliver to you via a web hook in a nicely formatted JSON document.
212
-
213
- Here is a simple Ruby/Sinatra application that does basic inbound processing.
214
-
215
- ``` ruby
216
- logger = Logger.new(STDOUT)
217
-
218
- class Comment
219
- attr_accessor :attributes
220
-
221
- def self.create_from_inbound_hook(message)
222
- self.new(:text => message["TextBody"],
223
- :user_email => message["From"],
224
- :discussion_id => message["MailboxHash"])
225
- end
226
-
227
- def initialize(attributes={})
228
- @attributes = attributes
229
- end
230
- end
231
-
232
- post '/inbound' do
233
- request.body.rewind
234
- comment = Comment.create_from_inbound_hook(Postmark::Json.decode(request.body.read))
235
- logger.info comment.inspect
236
- end
237
- ```
238
-
239
- If you don’t like that the fields of the Inbound JSON document are all in CamelCase, you
240
- can use the `Postmark::Inbound.to_ruby_hash` method to give it some Ruby flavor.
241
-
242
- ```
243
- postmark_hash = Postmark::Json.decode(request.body.read)
244
- ruby_hash = Postmark::Inbound.to_ruby_hash(postmark_hash)
245
- # => {:from=>"myUser@theirDomain.com", :from_full=>{:email=>"myUser@theirDomain.com", :name=>"John Doe"}, :to=>"451d9b70cf9364d23ff6f9d51d870251569e+ahoy@inbound.postmarkapp.com", :to_full=>[{:email=>"451d9b70cf9364d23ff6f9d51d870251569e+ahoy@inbound.postmarkapp.com", :name=>""}], :cc=>"\"Full name\" <sample.cc@emailDomain.com>, \"Another Cc\" <another.cc@emailDomain.com>", :cc_full=>[{:email=>"sample.cc@emailDomain.com", :name=>"Full name"}, {:email=>"another.cc@emailDomain.com", :name=>"Another Cc"}], :reply_to=>"myUsersReplyAddress@theirDomain.com", :subject=>"This is an inbound message", :message_id=>"22c74902-a0c1-4511-804f2-341342852c90", :date=>"Thu, 5 Apr 2012 16:59:01 +0200", :mailbox_hash=>"ahoy", :text_body=>"[ASCII]", :html_body=>"[HTML(encoded)]", :tag=>"", :headers=>[{:name=>"X-Spam-Checker-Version", :value=>"SpamAssassin 3.3.1 (2010-03-16) onrs-ord-pm-inbound1.wildbit.com"}, {:name=>"X-Spam-Status", :value=>"No"}, {:name=>"X-Spam-Score", :value=>"-0.1"}, {:name=>"X-Spam-Tests", :value=>"DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,SPF_PASS"}, {:name=>"Received-SPF", :value=>"Pass (sender SPF authorized) identity=mailfrom; client-ip=209.85.160.180; helo=mail-gy0-f180.google.com; envelope-from=myUser@theirDomain.com; receiver=451d9b70cf9364d23ff6f9d51d870251569e+ahoy@inbound.postmarkapp.com"}, {:name=>"DKIM-Signature", :value=>"v=1; a=rsa-sha256; c=relaxed/relaxed; d=wildbit.com; s=google; h=mime-version:reply-to:date:message-id:subject:from:to:cc :content-type; bh=cYr/+oQiklaYbBJOQU3CdAnyhCTuvemrU36WT7cPNt0=; b=QsegXXbTbC4CMirl7A3VjDHyXbEsbCUTPL5vEHa7hNkkUTxXOK+dQA0JwgBHq5C+1u iuAJMz+SNBoTqEDqte2ckDvG2SeFR+Edip10p80TFGLp5RucaYvkwJTyuwsA7xd78NKT Q9ou6L1hgy/MbKChnp2kxHOtYNOrrszY3JfQM="}, {:name=>"MIME-Version", :value=>"1.0"}, {:name=>"Message-ID", :value=>"<CAGXpo2WKfxHWZ5UFYCR3H_J9SNMG+5AXUovfEFL6DjWBJSyZaA@mail.gmail.com>"}], :attachments=>[{:name=>"myimage.png", :content=>"[BASE64-ENCODED CONTENT]", :content_type=>"image/png", :content_length=>4096}, {:name=>"mypaper.doc", :content=>"[BASE64-ENCODED CONTENT]", :content_type=>"application/msword", :content_length=>16384}]}
246
- ```
247
-
248
- ## Working with bounces
249
-
250
- Use `#get_bounces` to retrieve a list of bounces (use `:count` and `:offset`
251
- parameters to control pagination).
252
-
253
- ``` ruby
254
- client.get_bounces(count: 1, offset: 0)
255
- # => [{:id=>654714902, :type=>"Transient", :type_code=>2, :name=>"Message delayed", :message_id=>"1fdf3729-xxxx-4d5c-8a7b-96da7a23268b", :description=>"The server could not temporarily deliver your message (ex: Message is delayed due to network troubles).", :details=>"action: failed\r\n", :email=>"tema@wildbit.org", :bounced_at=>"2013-04-10T01:01:35.0965184-04:00", :dump_available=>true, :inactive=>false, :can_activate=>true, :subject=>"bounce test"}]
256
- ```
257
-
258
- Use `#get_bounced_tags` to retrieve a list of tags used for bounced emails.
259
-
260
- ``` ruby
261
- client.get_bounced_tags
262
- # => ["confidential"]
263
- ```
264
-
265
- Use `#get_bounce` to get info for a specific bounce using ID:
266
-
267
- ``` ruby
268
- client.get_bounce(654714902)
269
- # => {:id=>654714902, :type=>"Transient", :type_code=>2, :name=>"Message delayed", :message_id=>"1fdf3729-xxxx-xxxx-8a7b-96da7a23268b", :description=>"The server could not temporarily deliver your message (ex: Message is delayed due to network troubles).", :details=>"action: failed\r\n", :email=>"tema@wildbit.com", :bounced_at=>"2013-04-10T01:01:35.0965184-04:00", :dump_available=>true, :inactive=>false, :can_activate=>true, :subject=>"bounce test", :content=>"..."}
270
- ```
5
+ # Postmark Ruby Gem
6
+ [![Build Status](https://travis-ci.org/wildbit/postmark-gem.svg?branch=master)](https://travis-ci.org/wildbit/postmark-gem) [![Code Climate](https://codeclimate.com/github/wildbit/postmark-gem/badges/gpa.svg)](https://codeclimate.com/github/wildbit/postmark-gem)
7
+ [![License](http://img.shields.io/badge/license-MIT-blue.svg?style=flat)](http://www.opensource.org/licenses/MIT)
8
+ [![Gem Version](https://badge.fury.io/rb/postmark.svg)](https://badge.fury.io/rb/postmark)
271
9
 
272
- Use `#dump_bounce` to get the full bounce body:
10
+ Postmark allows you to send your emails with high delivery rates. It also includes detailed statistics. In addition, Postmark can parse incoming emails which are forwarded back to your application.
273
11
 
274
- ``` ruby
275
- client.dump_bounce(654714902)
276
- # => {:body=>"Return-Path: <>\r\nReceived: from m1.mtasv.net (74.205.19.136) by sc-ord-mail2.mtasv.net id hcjov61jk5ko for <pm_bounces@pm.mtasv.net>; Wed, 10 Apr 2013 01:00:35 -0400 (envelope-from <>)\r\nDate: Wed, 10 Apr 2013 01:00:48 -0400\r\nFrom: postmaster@m1.mtasv.net\r\n..."}
277
- ```
12
+ This gem is the official wrapper for the [Postmark HTTP API](http://postmarkapp.com).
278
13
 
279
- There is a `#bounces` enumerator to take the underlying complexity off of your shoulders. Use it to iterate over all of your bounces.
14
+ ## Usage
280
15
 
281
- ``` ruby
282
- client.bounces.first(5)
283
- # => [{...}, {...}]
284
- ```
16
+ Please see the [wiki](https://github.com/wildbit/postmark-gem/wiki) for detailed instructions about sending email, using the bounce api and other Postmark API features.
17
+ For details about Postmark API in general, please check out [Postmark developer docs](https://postmarkapp.com/developer).
285
18
 
286
- You can activate email addresses that were disabled due to a hard bounce by using `#activate_bounce`:
19
+ ## Requirements
287
20
 
288
- ``` ruby
289
- client.activate_bounce(654714902)
290
- # => {:id=>654714902, :type=>"Transient", :type_code=>2, :name=>"Message delayed", :message_id=>"1fdf3729-xxxx-xxxx-xxxx-96da7a23268b", :description=>"The server could not temporarily deliver your message (ex: Message is delayed due to network troubles).", :details=>"action: failed\r\n", :email=>"tema@wildbit.com", :bounced_at=>"2013-04-10T01:01:35.0965184-04:00", :dump_available=>true, :inactive=>false, :can_activate=>true, :subject=>"bounce test"}
291
- ```
21
+ You will need a Postmark account, server and sender signature (or verified domain) set up to use it. For details about setup, check out [wiki pages](https://github.com/wildbit/postmark-gem/wiki/Getting-Started).
292
22
 
293
- ## Getting delivery stats
23
+ If you plan using the library in a Rails project, check out the [postmark-rails](https://github.com/wildbit/postmark-rails/) gem, which
24
+ is meant to integrate with ActionMailer. The plugin will try to use ActiveSupport JSon if it is already included. If not,
25
+ it will attempt to use the built-in Ruby JSon library.
294
26
 
295
- Currently delivery stats only include a summary of inactive emails and bounces
296
- by type.
27
+ You can also explicitly specify which one to be used, using following code:
297
28
 
298
29
  ``` ruby
299
- stats = client.delivery_stats
300
- # => {:inactive_mails=>1, :bounces=>[{:name=>"All", :count=>3}, {:type=>"HardBounce", :name=>"Hard bounce", :count=>2}, {:type=>"Transient", :name=>"Message delayed", :count=>1}]}
30
+ Postmark.response_parser_class = :Json # :ActiveSupport or :Yajl are also supported.
301
31
  ```
302
32
 
303
- ## Server Info
33
+ ## Installation
304
34
 
305
- The gem also allows you to read and update the server info:
35
+ You can use the library with or without a Bundler.
306
36
 
307
- ``` ruby
308
- client.server_info
309
- # => {:name=>"Testing", :color=>"blue", :bounce_hook_url=>"", :inbound_hash=>"c2ffffff74f8643e5f6086c81", :inbound_hook_url=>"", :smtp_api_activated=>true}
310
- ```
311
-
312
- For example, you can use `#update_server_info` to set inbound hook URL:
37
+ With Bundler:
313
38
 
314
39
  ``` ruby
315
- client.update_server_info inbound_hook_url: 'http://example.org/bounces'
40
+ gem 'postmark'
316
41
  ```
317
42
 
318
- # Using Postmark with the [Mail](http://rubygems.org/gems/mail) library
319
-
320
- You can use Postmark with the `mail` gem.
43
+ Without Bundler:
321
44
 
322
45
  ``` bash
323
- gem install mail
324
- ```
325
-
326
- Make sure you have a [sender signature](https://postmarkapp.com/signatures) for
327
- every `From` email address you specify.
328
-
329
- To send a `Mail::Message` via Postmark you’ll need to specify `Mail::Postmark` as
330
- a delivery method for the message:
331
-
332
- ``` ruby
333
- message = Mail.new do
334
- # ...
335
- delivery_method Mail::Postmark, api_token: 'your-postmark-api-token'
336
- end
337
- ```
338
-
339
- Delivery method accepts all options supported by `Postmark::ApiClient`
340
- documented above. A new instance of `Postmark::ApiClient` is created every time
341
- you deliver a message to preserve thread safety.
342
-
343
- If you would prefer to use Postmark as the default delivery method for all
344
- `Mail::Message` instances, you can call `Mail.defaults` method during the initialization
345
- step of your app:
346
-
347
- ``` ruby
348
- Mail.defaults do
349
- delivery_method Mail::Postmark, api_token: 'your-postmark-api-token'
350
- end
351
- ```
352
-
353
- ## Plain text message
354
-
355
- ``` ruby
356
- require 'rubygems'
357
- require 'postmark'
358
- require 'mail'
359
- require 'json'
360
-
361
- message = Mail.new do
362
- from 'sheldon@bigbangtheory.com'
363
- to 'Leonard Hofstadter <leonard@bigbangtheory.com>'
364
- subject 'Re: Come on, Sheldon. It will be fun.'
365
- body 'That\'s what you said about the Green Lantern movie. You' \
366
- 'were 114 minutes of wrong.'
367
-
368
- delivery_method Mail::Postmark, :api_token => 'your-postmark-api-token'
369
- end
370
-
371
- message.deliver
372
- # => #<Mail::Message:70355890541720, Multipart: false, Headers: <From: sheldon@bigbangtheory.com>, <To: leonard@bigbangtheory.com>, <Message-ID: e439fec0-4c89-475b-b3fc-eb446249a051>, <Subject: Re: Come on, Sheldon. It will be fun.>>
373
- ```
374
-
375
- ## HTML message (with open tracking)
376
-
377
- Notice that we set `track_opens` field to `true`, to enable open tracking for this message.
378
-
379
- ``` ruby
380
- require 'rubygems'
381
- require 'postmark'
382
- require 'mail'
383
- require 'json'
384
-
385
- message = Mail.new do
386
- from 'sheldon@bigbangtheory.com'
387
- to 'Leonard Hofstadter <leonard@bigbangtheory.com>'
388
- subject 'Re: What, to you, is a large crowd?'
389
-
390
- content_type 'text/html; charset=UTF-8'
391
- body '<p>Any group big enough to trample me to death. General ' \
392
- 'rule of thumb is 36 adults or 70 children.</p>'
393
-
394
- track_opens "true" # Feel free to use boolean values on mail >= 2.3.0
395
-
396
- delivery_method Mail::Postmark, :api_token => 'your-postmark-api-token'
397
- end
398
-
399
- message.deliver
400
- # => #<Mail::Message:70355902117460, Multipart: false, Headers: <From: sheldon@bigbangtheory.com>, <To: leonard@bigbangtheory.com>, <Message-ID: 3a9370a2-6c24-4304-a03c-320a54cc59f7>, <Subject: Re: What, to you, is a large crowd?>, <Content-Type: text/html; charset=UTF-8>>
401
- ```
402
-
403
- ## Message with attachments
404
-
405
- ``` ruby
406
- message = Mail.new do
407
- from 'leonard@bigbangtheory.com'
408
- to 'Dr. Sheldon Cooper <sheldon@bigbangtheory.com>'
409
- subject 'Have you seen these pictures of yours?'
410
- body 'You look like a real geek!'
411
- add_file '1.jpeg'
412
-
413
- delivery_method Mail::Postmark, :api_token => 'your-postmark-api-token'
414
- end
415
-
416
- message.attachments['sheldon.jpeg'] = File.read('2.jpeg')
417
-
418
- message.deliver
419
- # => #<Mail::Message:70185826686240, Multipart: true, Headers: <From: leonard@bigbangtheory.com>, <To: sheldon@bigbangtheory.com>, <Message-ID: ba644cc1-b5b1-4bcb-aaf8-2f290b5aad80>, <Subject: Have you seen these pictures of yours?>, <Content-Type: multipart/mixed; boundary=--==_mimepart_5121f9f1ec653_12c53fd569035ad817726>>
420
- ```
421
-
422
- You can also make an attachment inline:
423
-
424
- ``` ruby
425
- message.attachments.inline['sheldon.jpeg'] = File.read('2.jpeg')
426
- ```
427
-
428
- Then simply use `Mail::Part#url` method to reference it from your email body.
429
-
430
- ``` erb
431
- <p><img src="<%= message.attachments['sheldon.jpeg'].url %>" alt="Dr. Sheldon Cooper"></p>
432
- ```
433
-
434
- ## Multipart message
435
-
436
- You can send multipart messages containing both text and HTML using the Postmark gem.
437
-
438
- ``` ruby
439
- require 'rubygems'
440
- require 'postmark'
441
- require 'mail'
442
- require 'json'
443
-
444
- message = Mail.new do
445
- from 'sheldon@bigbangtheory.com'
446
- to 'Leonard Hofstadter <leonard@bigbangtheory.com>'
447
- subject 'Re: Anything Can Happen Thursday'
448
- delivery_method Mail::Postmark, :api_token => 'your-postmark-api-token'
449
-
450
- text_part do
451
- body 'Apparently the news didn\'t reach my digestive system,' \
452
- ' which when startled has it\'s own version of "Anything' \
453
- ' Can Happen Thursday"'
454
- end
455
-
456
- html_part do
457
- content_type 'text/html; charset=UTF-8'
458
- body '<p>Apparently the news didn&rsquo;t reach my digestive ' \
459
- 'system, which when startled has it&rsquo;s own version ' \
460
- 'of &ldquo;Anything Can Happen Thursday&rdquo;</p>'
461
- end
462
- end
463
-
464
- message.deliver
465
- # => #<Mail::Message:70355901588620, Multipart: true, Headers: <From: sheldon@bigbangtheory.com>, <To: leonard@bigbangtheory.com>, <Message-ID: cadba131-f6d6-4cfc-9892-16ee738ba54c>, <Subject: Re: Anything Can Happen Thursday>, <Content-Type: multipart/alternative; boundary=--==_mimepart_50ef7a6234a69_a4c73ffd01035adc207b8>>
466
- ```
467
-
468
- ## Tagged message
469
-
470
- Postmark also lets you tag your messages.
471
-
472
- ``` ruby
473
- require 'rubygems'
474
- require 'postmark'
475
- require 'mail'
476
- require 'json'
477
-
478
- message = Mail.new do
479
- from 'sheldon@bigbangtheory.com'
480
- to 'Penny <penny@bigbangtheory.com>'
481
- subject 'Re: You cleaned my apartment???'
482
- body 'I couldn\'t sleep knowing that just outside my bedroom is ' \
483
- 'our living room and just outside our living room is that ' \
484
- 'hallway and immediately adjacent to that hallway is this!'
485
- tag 'confidential'
486
-
487
- delivery_method Mail::Postmark, :api_token => 'your-postmark-api-token'
488
- end
489
-
490
- message.deliver
491
- # => #<Mail::Message:70168327829580, Multipart: false, Headers: <From: sheldon@bigbangtheory.com>, <To: penny@bigbangtheory.com>, <Message-ID: af2570fd-3481-4b45-8b27-a249806d891a>, <Subject: Re: You cleaned my apartment???>, <TAG: confidential>>
492
- ```
493
-
494
- ## Sending in batches
495
-
496
- You can also send `Mail::Message` objects in batches. Create an instance of
497
- `Postmark::ApiClient` as described in "Communicating with the API" section.
498
-
499
- ``` ruby
500
- messages = []
501
-
502
- messages << Mail.new do
503
- from 'sheldon@bigbangtheory.com'
504
- to 'Leonard Hofstadter <leonard@bigbangtheory.com>'
505
- subject 'Re: Come on, Sheldon. It will be fun.'
506
- body 'That\'s what you said about the Green Lantern movie. You' \
507
- 'were 114 minutes of wrong.'
508
- end
509
-
510
- messages << Mail.new do
511
- from 'sheldon@bigbangtheory.com'
512
- to 'Penny <penny@bigbangtheory.com>'
513
- subject 'Re: You cleaned my apartment???'
514
- body 'I couldn\'t sleep knowing that just outside my bedroom is ' \
515
- 'our living room and just outside our living room is that ' \
516
- 'hallway and immediately adjacent to that hallway is this!'
517
- tag 'confidential'
518
- end
519
-
520
- client.deliver_messages(messages)
521
- # => [{:to=>"leonard@bigbangtheory.com", :submitted_at=>"2013-05-10T01:59:29.830486-04:00", :message_id=>"8ad0e8b0-xxxx-xxxx-951d-223c581bb467", :error_code=>0, :message=>"OK"}, {:to=>"penny@bigbangtheory.com", :submitted_at=>"2013-05-10T01:59:29.830486-04:00", :message_id=>"33c6240c-xxxx-xxxx-b0df-40bdfcf4e0f7", :error_code=>0, :message=>"OK"}]
522
- ```
523
-
524
- After delivering a batch you can check on each message’s delivery status:
525
-
526
- ``` ruby
527
- messages.first.delivered?
528
- # => true
529
-
530
- messages.all?(&:delivered)
531
- # => true
532
- ```
533
-
534
- Or even get a related Postmark response:
535
-
536
- ``` ruby
537
- messages.first.postmark_response
538
- # => {"To"=>"leonard@bigbangtheory.com", "SubmittedAt"=>"2013-05-10T01:59:29.830486-04:00", "MessageID"=>"8ad0e8b0-xxxx-xxxx-951d-223c581bb467", "ErrorCode"=>0, "Message"=>"OK"}
539
- ```
540
-
541
- ## Accessing Postmark Message-ID
542
-
543
- You might want to save identifiers of messages you send. Postmark provides you
544
- with a unique Message-ID, which you can
545
- [use to retrieve bounces](http://blog.postmarkapp.com/post/24970994681/using-messageid-to-retrieve-bounces)
546
- later. This example shows you how to access the Message-ID of a sent email message.
547
-
548
- ``` ruby
549
- message = Mail.new
550
- # ...
551
- message.deliver
552
-
553
- message['Message-ID']
554
- # => cadba131-f6d6-4cfc-9892-16ee738ba54c
555
- message.message_id
556
- # => "cadba131-f6d6-4cfc-9892-16ee738ba54c"
557
- ```
558
-
559
- # Exploring Other Gem Features
560
-
561
- ## The Account API Support
562
-
563
- Postmark allows you to automatically scale your sending infrastructure with the Account API. Learn how in the [Account API Support](https://github.com/wildbit/postmark-gem/wiki/The-Account-API-Support) guide.
564
-
565
- ## The Triggers API Support
566
-
567
- [The Triggers API](https://github.com/wildbit/postmark-gem/wiki/The-Triggers-API-Support) can be used to tell Postmark to automatically track opens for all messages with a certain tag.
568
-
569
- ## The Messages API Support
570
-
571
- If you ever need to access your messages or their metadata (i.e. open tracking info), [the Messages API](https://github.com/wildbit/postmark-gem/wiki/The-Messages-API-support) is a great place to start.
572
-
573
- ## The Templates API Support
574
-
575
- [The Templates API](https://github.com/wildbit/postmark-gem/wiki/The-Templates-API-support) can be used to fully manage your templates.
576
-
577
- ## The Stats API Support
578
-
579
- [The Stats API](https://github.com/wildbit/postmark-gem/wiki/The-Stats-API-support) can be used to access statistics on your emails sent by date and tag.
580
-
581
-
582
- ## ActiveModel-like Interface For Bounces
583
-
584
- To provide an interface similar to ActiveModel for bounces, the Postmark gem adds
585
- `Postmark::Bounce` class. This class uses the shared `Postmark::ApiClient` instance
586
- configured through the Postmark module.
587
-
588
- ``` ruby
589
- require 'rubygems'
590
- require 'postmark'
591
- require 'mail'
592
- require 'json'
593
-
594
- Postmark.response_parser_class = :Json
595
- Postmark.api_token = 'your-postmark-api-token'
596
-
597
- # Get bounces information: (array of bounce objects)
598
- Postmark::Bounce.all
599
- # => [#<Postmark::Bounce:0x007ff09c04ae18 @id=580516117, @email="sheldon@bigbangtheory.com", @bounced_at=2012-10-21 00:01:56 +0800, @type="HardBounce", @name=nil, @details="smtp;550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http://support.google.com/mail/bin/answer.py?answer=6596 c13si5382730vcw.23", @tag=nil, @dump_available=false, @inactive=true, @can_activate=true, @message_id="876d40fe-ab2a-4925-9d6f-8d5e4f4926f5", @subject="Re: What, to you, is a large crowd?">]
600
-
601
- # Find specific bounce by id:
602
- bounce = Postmark::Bounce.find(5)
603
- # => #<Postmark::Bounce:0x007ff09c04ae18 @id=580516117, @email="sheldon@bigbangtheory.com", @bounced_at=2012-10-21 00:01:56 +0800, @type="HardBounce", @name=nil, @details="smtp;550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http://support.google.com/mail/bin/answer.py?answer=6596 c13si5382730vcw.23", @tag=nil, @dump_available=false, @inactive=true, @can_activate=true, @message_id="876d40fe-ab2a-4925-9d6f-8d5e4f4926f5", @subject="Re: What, to you, is a large crowd?">
604
-
605
- bounce.dump # string, containing raw SMTP data
606
- # => "Return-Path: <>\r\nDate: Sun, 21 Oct 2012 01:00:04 -0400\r\nFrom: postmaster@p1.mtasv.net\r\n..."
607
-
608
- bounce.activate # reactivate hard bounce
609
- # => #<Postmark::Bounce:0x007ff09c04ae18 @id=580516117, @email="sheldon@bigbangtheory.com", @bounced_at=2012-10-21 00:01:56 +0800, @type="HardBounce", @name=nil, @details="smtp;550 5.1.1 The email account that you tried to reach does not exist. Please try double-checking the recipient's email address for typos or unnecessary spaces. Learn more at http://support.google.com/mail/bin/answer.py?answer=6596 c13si5382730vcw.23", @tag=nil, @dump_available=false, @inactive=true, @can_activate=true, @message_id="876d40fe-ab2a-4925-9d6f-8d5e4f4926f5", @subject="Re: What, to you, is a large crowd?">
46
+ gem install postmark
610
47
  ```
611
48
 
612
- ## Requirements
49
+ ## Note on Patches/Pull Requests
613
50
 
614
- You will need a Postmark account, server and sender signature set up to use it.
615
- If you plan using it in a Rails project, check out the
616
- [postmark-rails](https://github.com/wildbit/postmark-rails/) gem, which
617
- is meant to integrate with ActionMailer.
51
+ See [CONTRIBUTING.md](CONTRIBUTING.md) file for details.
618
52
 
619
- The plugin will try to use ActiveSupport Json if it is already included. If not,
620
- it will attempt using the built-in Ruby Json library.
53
+ ## Issues & Comments
621
54
 
622
- You can also explicitly specify which one to be used, using
55
+ Feel free to contact us if you encounter any issues with the library or Postmark API.
56
+ Please leave all comments, bugs, requests and issues on the Issues page.
623
57
 
624
- ``` ruby
625
- Postmark.response_parser_class = :Json # :ActiveSupport or :Yajl are also supported.
626
- ```
627
-
628
- ## Note on Patches/Pull Requests
58
+ ## License
629
59
 
630
- * Fork the project.
631
- * Make your feature addition or bug fix.
632
- * Add tests for it. This is important so I don't break it in a future version unintentionally.
633
- * Commit, do not mess with rakefile, version, or history.
634
- * Send me a pull request. Bonus points for topic branches.
60
+ The Postmark Ruby library is licensed under the [MIT](http://www.opensource.org/licenses/mit-license.php) license.
61
+ Refer to the [LICENSE](https://github.com/wildbit/postmark-gem/blob/master/LICENSE) file for more information.
635
62
 
636
63
  ## Copyright
637
64
 
638
- Copyright © 2014 Wildbit LLC. See LICENSE for details.
65
+ Copyright © 2020 Wildbit LLC.