postmark-rails 0.18.0 → 0.19.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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +48 -8
- data/.travis/setup.sh +14 -0
- data/CHANGELOG.rdoc +7 -0
- data/CONTRIBUTING.md +18 -0
- data/README.md +43 -201
- data/gemfiles/Gemfile.actionmailer-3.0.x +1 -1
- data/gemfiles/Gemfile.actionmailer-3.2.x +1 -1
- data/gemfiles/Gemfile.actionmailer-4.0.x +1 -1
- data/gemfiles/Gemfile.actionmailer-4.1.x +1 -1
- data/gemfiles/Gemfile.actionmailer-4.2.x +1 -1
- data/gemfiles/Gemfile.actionmailer-5.0.x +11 -0
- data/gemfiles/Gemfile.actionmailer-5.1.x +11 -0
- data/lib/postmark-rails.rb +2 -0
- data/lib/postmark-rails/preview_interceptor.rb +10 -0
- data/lib/postmark-rails/templated_mailer.rb +68 -0
- data/lib/postmark-rails/version.rb +1 -1
- data/postmark-rails.gemspec +5 -1
- data/postmark.png +0 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/{postmark-rails_spec.rb → unit/postmark-rails_spec.rb} +0 -0
- data/spec/unit/preview_interceptor_spec.rb +40 -0
- data/spec/unit/templated_mailer_spec.rb +110 -0
- metadata +19 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f2df5ed989cb277bb16b071ca354702e6b99f87d
|
|
4
|
+
data.tar.gz: 14347b26486e2dfd1be2da601904fc4614f641dd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 65cd3fb9c9044c5fe718683f2ddcfae18965d65a7412d7edd894ef5e12755b64624b6fa64550a15302f18d30e12240773c7ddbbb4b0a618980df4568168066ed
|
|
7
|
+
data.tar.gz: 323747a71a0331865a32b9200817b101e94b13e89d8a534fcc4697ad0488db0f5c384f457bfc75b4e7adae6701370bff58a1624634a3a9890a5e361cbbaaf90a
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
|
@@ -3,8 +3,12 @@ rvm:
|
|
|
3
3
|
- 1.8.7
|
|
4
4
|
- 1.9.3
|
|
5
5
|
- 2.0.0
|
|
6
|
-
- 2.1.
|
|
7
|
-
- 2.2.
|
|
6
|
+
- 2.1.10
|
|
7
|
+
- 2.2.10
|
|
8
|
+
- 2.3.8
|
|
9
|
+
- 2.4.5
|
|
10
|
+
- 2.5.3
|
|
11
|
+
- 2.6.0
|
|
8
12
|
script: bundle exec rake spec
|
|
9
13
|
gemfile:
|
|
10
14
|
- Gemfile
|
|
@@ -13,22 +17,58 @@ gemfile:
|
|
|
13
17
|
- gemfiles/Gemfile.actionmailer-4.0.x
|
|
14
18
|
- gemfiles/Gemfile.actionmailer-4.1.x
|
|
15
19
|
- gemfiles/Gemfile.actionmailer-4.2.x
|
|
20
|
+
- gemfiles/Gemfile.actionmailer-5.0.x
|
|
21
|
+
- gemfiles/Gemfile.actionmailer-5.1.x
|
|
16
22
|
matrix:
|
|
17
23
|
exclude:
|
|
18
24
|
- rvm: 1.8.7
|
|
19
25
|
gemfile: Gemfile
|
|
26
|
+
- rvm: 1.8.7
|
|
27
|
+
gemfile: gemfiles/Gemfile.actionmailer-4.0.x
|
|
28
|
+
- rvm: 1.8.7
|
|
29
|
+
gemfile: gemfiles/Gemfile.actionmailer-4.1.x
|
|
30
|
+
- rvm: 1.8.7
|
|
31
|
+
gemfile: gemfiles/Gemfile.actionmailer-4.2.x
|
|
32
|
+
- rvm: 1.8.7
|
|
33
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.0.x
|
|
34
|
+
- rvm: 1.8.7
|
|
35
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.1.x
|
|
36
|
+
|
|
20
37
|
- rvm: 1.9.3
|
|
21
38
|
gemfile: Gemfile
|
|
39
|
+
- rvm: 1.9.3
|
|
40
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.0.x
|
|
41
|
+
- rvm: 1.9.3
|
|
42
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.1.x
|
|
43
|
+
|
|
22
44
|
- rvm: 2.0.0
|
|
23
45
|
gemfile: Gemfile
|
|
24
|
-
- rvm: 2.
|
|
46
|
+
- rvm: 2.0.0
|
|
47
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.0.x
|
|
48
|
+
- rvm: 2.0.0
|
|
49
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.1.x
|
|
50
|
+
|
|
51
|
+
- rvm: 2.1.10
|
|
25
52
|
gemfile: Gemfile
|
|
26
|
-
- rvm: 1.
|
|
53
|
+
- rvm: 2.1.10
|
|
54
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.0.x
|
|
55
|
+
- rvm: 2.1.10
|
|
56
|
+
gemfile: gemfiles/Gemfile.actionmailer-5.1.x
|
|
57
|
+
|
|
58
|
+
- rvm: 2.5.3
|
|
59
|
+
gemfile: gemfiles/Gemfile.actionmailer-3.0.x
|
|
60
|
+
- rvm: 2.5.3
|
|
61
|
+
gemfile: gemfiles/Gemfile.actionmailer-3.2.x
|
|
62
|
+
|
|
63
|
+
- rvm: 2.6.0
|
|
64
|
+
gemfile: gemfiles/Gemfile.actionmailer-3.0.x
|
|
65
|
+
- rvm: 2.6.0
|
|
66
|
+
gemfile: gemfiles/Gemfile.actionmailer-3.2.x
|
|
67
|
+
- rvm: 2.6.0
|
|
27
68
|
gemfile: gemfiles/Gemfile.actionmailer-4.0.x
|
|
28
|
-
- rvm:
|
|
69
|
+
- rvm: 2.6.0
|
|
29
70
|
gemfile: gemfiles/Gemfile.actionmailer-4.1.x
|
|
30
|
-
- rvm:
|
|
71
|
+
- rvm: 2.6.0
|
|
31
72
|
gemfile: gemfiles/Gemfile.actionmailer-4.2.x
|
|
32
73
|
before_install:
|
|
33
|
-
-
|
|
34
|
-
- gem install bundler
|
|
74
|
+
- .travis/setup.sh
|
data/.travis/setup.sh
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -eax
|
|
4
|
+
|
|
5
|
+
echo "Configuring Ruby and Bundler..."
|
|
6
|
+
echo "TRAVIS_RUBY_VERSION=${TRAVIS_RUBY_VERSION}"
|
|
7
|
+
|
|
8
|
+
if [[ "$TRAVIS_RUBY_VERSION" < "2.3" ]];
|
|
9
|
+
then
|
|
10
|
+
gem install bundler -v '< 2'
|
|
11
|
+
else
|
|
12
|
+
gem update --system
|
|
13
|
+
gem install bundler
|
|
14
|
+
fi
|
data/CHANGELOG.rdoc
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
= Changelog
|
|
2
2
|
|
|
3
|
+
== 0.19.0
|
|
4
|
+
|
|
5
|
+
* Update the postmark gem dependency to 1.15.x.
|
|
6
|
+
* Added support for templated mailers.
|
|
7
|
+
* Added source_code_uri to the gemspec.
|
|
8
|
+
* Tested against all stable versions of ActionMailer 3.0-5.2 and Ruby 1.8.7-2.6.0.
|
|
9
|
+
|
|
3
10
|
== 0.18.0
|
|
4
11
|
|
|
5
12
|
* Update the postmark gem dependency to 1.14.x.
|
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/README.md
CHANGED
|
@@ -1,18 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
<a href="https://postmarkapp.com">
|
|
2
|
+
<img src="postmark.png" alt="Postmark Logo" title="Postmark" width="120" height="120" align="right">
|
|
3
|
+
</a>
|
|
4
|
+
|
|
5
|
+
# Postmark Rails Gem
|
|
2
6
|
|
|
3
7
|
[](https://travis-ci.org/wildbit/postmark-rails) [](https://codeclimate.com/github/wildbit/postmark-rails)
|
|
8
|
+
[](http://www.opensource.org/licenses/MIT)
|
|
9
|
+
[](https://badge.fury.io/rb/postmark-rails)
|
|
10
|
+
|
|
11
|
+
[Postmark](https://postmarkapp.com) allows you to send your emails with high delivery rates.
|
|
12
|
+
It also includes detailed statistics. In addition, Postmark can parse incoming emails which are forwarded back to your application.
|
|
13
|
+
|
|
14
|
+
The Postmark Rails Gem is a drop-in plug-in for ActionMailer to send emails via [Postmark](https://postmarkapp.com).
|
|
15
|
+
The gem has been created for fast implementation and fully supports all of [Postmark’s features](https://postmarkapp.com/why).
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
Please see the [wiki](https://github.com/wildbit/postmark-rails/wiki) for detailed instructions about library features.
|
|
20
|
+
For details about Postmark API in general, please check out [Postmark developer docs](https://postmarkapp.com/developer).
|
|
21
|
+
|
|
22
|
+
## Requirements
|
|
23
|
+
|
|
24
|
+
You will need a Postmark account, server and sender signature (or verified domain) set up to use it.
|
|
25
|
+
For details about setup, check out [wiki pages](https://github.com/wildbit/postmark-rails/wiki/Getting-Started).
|
|
4
26
|
|
|
5
|
-
|
|
27
|
+
Also you will need a [postmark gem](https://github.com/wildbit/postmark-gem) version 1.0 and higher is required.
|
|
6
28
|
|
|
7
|
-
|
|
29
|
+
### Supported Rails Versions
|
|
8
30
|
|
|
9
31
|
* Rails 5.0
|
|
10
32
|
* Rails 4.x
|
|
11
33
|
* Rails 3.x
|
|
12
34
|
|
|
13
|
-
For Rails 2.3 please take a look at [version 0.4](https://github.com/wildbit/postmark-rails/tree/v0.4.2).
|
|
35
|
+
For Rails 2.3 please take a look at [version 0.4](https://github.com/wildbit/postmark-rails/tree/v0.4.2).
|
|
36
|
+
It may miss some new features, but receives all required bug fixes and other support if needed.
|
|
14
37
|
|
|
15
|
-
##
|
|
38
|
+
## Installation
|
|
16
39
|
|
|
17
40
|
Add `postmark-rails` to your Gemfile and run `bundle install`.
|
|
18
41
|
|
|
@@ -35,206 +58,15 @@ config.action_mailer.postmark_settings = { :api_token => Rails.application.secre
|
|
|
35
58
|
|
|
36
59
|
**Note**: The `postmark_settings` hash can contain [any options](https://github.com/wildbit/postmark-gem#communicating-with-the-api) supported by `Postmark::ApiClient`.
|
|
37
60
|
|
|
38
|
-
## Tracking opens and tagging your deliveries
|
|
39
|
-
|
|
40
|
-
You can use tags to categorize outgoing messages and attach application-specific information. Tagging the different types of email that you send lets you [review statistics and bounce reports separately](http://developer.postmarkapp.com/developer-build.html#message-format).
|
|
41
|
-
|
|
42
|
-
Pass `:track_opens => 'true'` to enable/disable open tracking on per-message basis. Check out the [Triggers API](https://github.com/wildbit/postmark-gem/wiki/The-Triggers-API-Support) to see how Postmark can help you control this with tags. **Note that we pass a string here, since it becomes a header value. Passing a boolean may or may not work depending on your Rails version.**
|
|
43
|
-
|
|
44
|
-
``` ruby
|
|
45
|
-
class TestMailer < ActionMailer::Base
|
|
46
|
-
|
|
47
|
-
def tagged_message
|
|
48
|
-
mail(
|
|
49
|
-
:subject => 'hello',
|
|
50
|
-
:to => 'sheldon@bigbangtheory.com',
|
|
51
|
-
:from => 'leonard@bigbangtheory.com',
|
|
52
|
-
:tag => 'my-tag',
|
|
53
|
-
:track_opens => 'true'
|
|
54
|
-
)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
end
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Sending attachments
|
|
61
|
-
|
|
62
|
-
You can also send file attachments with Postmark. Read our Developer docs for [additional information](http://developer.postmarkapp.com/developer-build.html#attachments).
|
|
63
|
-
|
|
64
|
-
The Postmark gem is compatible with [ActionMailer attachments API](http://api.rubyonrails.org/classes/ActionMailer/Base.html#method-i-attachments). It allows you to specify the name, content-type and other attributes for your attachments.
|
|
65
|
-
|
|
66
|
-
The legacy `:postmark_attachments` attribute is *no longer supported* on Rails 3.2.13 and above.
|
|
67
|
-
|
|
68
|
-
``` ruby
|
|
69
|
-
class TestMailer < ActionMailer::Base
|
|
70
|
-
|
|
71
|
-
def message_with_attachment
|
|
72
|
-
attachments.inline['logo.png'] = File.read("/path/to/image") # Inline image
|
|
73
|
-
attachments['42.jpg'] = File.read("/path/to/file") # Attached file
|
|
74
|
-
mail(
|
|
75
|
-
:subject => 'hello',
|
|
76
|
-
:to => 'sheldon@bigbangtheory.com',
|
|
77
|
-
:from => 'leonard@bigbangtheory.com'
|
|
78
|
-
)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
end
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Attaching metadata to messages
|
|
85
|
-
|
|
86
|
-
Postmark supports [attaching metadata to messages](https://postmarkapp.com/support/article/1125-custom-metadata-faq-1). All metadata field values will be interpreted and returned in webhook payloads as strings.
|
|
87
|
-
|
|
88
|
-
``` ruby
|
|
89
|
-
class TestMailer < ActionMailer::Base
|
|
90
|
-
|
|
91
|
-
def message_with_metadata
|
|
92
|
-
metadata['foo'] = 'bar'
|
|
93
|
-
mail(
|
|
94
|
-
:subject => 'meta hello',
|
|
95
|
-
:to => 'sheldon@bigbangtheory.com',
|
|
96
|
-
:from => 'leonard@bigbangtheory.com'
|
|
97
|
-
)
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
end
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Sending in batches
|
|
104
|
-
|
|
105
|
-
While Postmark is focused on transactional email, we understand that developers
|
|
106
|
-
with higher volumes or processing time constraints need to send their messages
|
|
107
|
-
in batches. To facilitate this we provide a batching endpoint that permits you
|
|
108
|
-
to send up to 500 well-formed Postmark messages in a single API call.
|
|
109
|
-
|
|
110
|
-
``` ruby
|
|
111
|
-
client = Postmark::ApiClient.new('your-api-token')
|
|
112
61
|
|
|
113
|
-
|
|
114
|
-
messages << DigestMailer.weekly_digest(@user1)
|
|
115
|
-
messages << DigestMailer.weekly_digest(@user2)
|
|
116
|
-
|
|
117
|
-
client.deliver_messages(messages)
|
|
118
|
-
|
|
119
|
-
messages.first.delivered?
|
|
120
|
-
# => true
|
|
121
|
-
|
|
122
|
-
messages.all?(&:delivered)
|
|
123
|
-
# => true
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Error handling
|
|
127
|
-
|
|
128
|
-
The gem respects the `ActionMailer::Base.raise_delivery_errors` setting and will surpress any exceptions
|
|
129
|
-
if it’s set to `false`. When delivery errors are enabled, the gem can raise any one of the exceptions
|
|
130
|
-
listed in the [postmark](https://github.com/wildbit/postmark-gem#error-handling) gem docs.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
### ActionMailer 5
|
|
134
|
-
|
|
135
|
-
For ActionMailer 5 and above, use `ActionMailer::Base.rescue_from` to define handlers for
|
|
136
|
-
each error you care about.
|
|
137
|
-
|
|
138
|
-
#### Example
|
|
139
|
-
|
|
140
|
-
``` ruby
|
|
141
|
-
class ApplicationMailer < ActionMailer::Base
|
|
142
|
-
default from: 'user@example.org'
|
|
143
|
-
layout 'mailer'
|
|
144
|
-
|
|
145
|
-
rescue_from Postmark::InactiveRecipientError, with: :reactivate_and_retry
|
|
146
|
-
|
|
147
|
-
private
|
|
148
|
-
|
|
149
|
-
def postmark_client
|
|
150
|
-
::Postmark::ApiClient.new(ActionMailer::Base.postmark_settings[:api_token],
|
|
151
|
-
ActionMailer::Base.postmark_settings.except(:api_token))
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
# This is just an example. Sometimes you might not want to reactivate
|
|
156
|
-
# an address that hard bounced.
|
|
157
|
-
# Warning: Having too many bounces can affect your delivery reputation
|
|
158
|
-
# with email providers
|
|
159
|
-
def reactivate_and_retry(error)
|
|
160
|
-
Rails.logger.info("Error when sending #{message} to #{error.recipients.join(', ')}")
|
|
161
|
-
Rails.logger.info(error)
|
|
162
|
-
|
|
163
|
-
error.recipients.each do |recipient|
|
|
164
|
-
bounce = postmark_client.bounces(emailFilter: recipient).first
|
|
165
|
-
next unless bounce
|
|
166
|
-
postmark_client.activate_bounce(bounce[:id])
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
# Try again immediately
|
|
170
|
-
message.deliver
|
|
171
|
-
end
|
|
172
|
-
end
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### ActionMailer 4 and below
|
|
176
|
-
|
|
177
|
-
Wrap any calls to `#deliver_now` in error handlers like the one described
|
|
178
|
-
in the [postmark](https://github.com/wildbit/postmark-gem#error-handling) gem
|
|
179
|
-
docs.
|
|
180
|
-
|
|
181
|
-
Rails 4.2 introduces `#deliver_later` but doesn’t support `rescue_from` for
|
|
182
|
-
mailer classes. Instead, use the following monkey patch for
|
|
183
|
-
`ActionMailer::DeliveryJob`.
|
|
184
|
-
|
|
185
|
-
``` ruby
|
|
186
|
-
# app/mailers/application_mailer.rb
|
|
187
|
-
|
|
188
|
-
class ApplicationMailer < ActionMailer::Base
|
|
189
|
-
default from: 'user@example.org'
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
class ActionMailer::DeliveryJob
|
|
193
|
-
rescue_from Postmark::InactiveRecipientError, with: :reactivate_and_retry
|
|
194
|
-
|
|
195
|
-
def postmark_client
|
|
196
|
-
::Postmark::ApiClient.new(ActionMailer::Base.postmark_settings[:api_token],
|
|
197
|
-
ActionMailer::Base.postmark_settings.except(:api_token))
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
# This is just an example. Sometimes you might not want to reactivate
|
|
202
|
-
# an address that hard bounced.
|
|
203
|
-
# Warning: Having too many bounces can affect your delivery reputation
|
|
204
|
-
# with email providers
|
|
205
|
-
def reactivate_and_retry(error)
|
|
206
|
-
Rails.logger.info("Error when sending a message to #{error.recipients.join(', ')}")
|
|
207
|
-
Rails.logger.info(error)
|
|
208
|
-
|
|
209
|
-
error.recipients.each do |recipient|
|
|
210
|
-
bounce = postmark_client.bounces(emailFilter: recipient).first
|
|
211
|
-
next unless bounce
|
|
212
|
-
postmark_client.activate_bounce(bounce[:id])
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
# Try again immediately
|
|
216
|
-
perform(*arguments)
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
```
|
|
220
|
-
|
|
221
|
-
## Additional information
|
|
222
|
-
|
|
223
|
-
Looking for the advanced usage examples? Check out [the documentation](https://github.com/wildbit/postmark-gem/blob/master/README.md) for the `postmark` gem. The `postmark-rails` gem is built on top of it, so you can benefit from all its features.
|
|
224
|
-
|
|
225
|
-
## Requirements
|
|
226
|
-
|
|
227
|
-
* `postmark` gem version 1.0 and higher is required.
|
|
228
|
-
* You will also need a Postmark account, a server and at least one sender signature set up to use it. To get an account, [sign up](https://postmarkapp.com/sign_up)!
|
|
62
|
+
### Additional information
|
|
229
63
|
|
|
64
|
+
Looking for the advanced usage examples? Check out [the documentation](https://github.com/wildbit/postmark-gem/blob/master/README.md) for the [postmark gem](https://github.com/wildbit/postmark-gem).
|
|
65
|
+
The `postmark-rails` gem is built on top of it, so you can benefit from all it's features.
|
|
230
66
|
|
|
231
67
|
## Note on Patches/Pull Requests
|
|
232
68
|
|
|
233
|
-
|
|
234
|
-
* Make your feature addition or bug fix.
|
|
235
|
-
* Add tests for it. This is important so we don’t break it in a future version unintentionally.
|
|
236
|
-
* Commit, do not mess with rakefile, version, or history.
|
|
237
|
-
* Send a pull request. Bonus points for topic branches.
|
|
69
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) file for details.
|
|
238
70
|
|
|
239
71
|
## Authors & Contributors
|
|
240
72
|
|
|
@@ -247,6 +79,16 @@ Looking for the advanced usage examples? Check out [the documentation](https://g
|
|
|
247
79
|
* Nicolás Sanguinetti
|
|
248
80
|
* Laust Rud Jacobsen (rud)
|
|
249
81
|
|
|
82
|
+
## Issues & Comments
|
|
83
|
+
|
|
84
|
+
Feel free to contact us if you encounter any issues with the library or Postmark API.
|
|
85
|
+
Please leave all comments, bugs, requests and issues on the Issues page.
|
|
86
|
+
|
|
87
|
+
## License
|
|
88
|
+
|
|
89
|
+
The Postmark Rails gem is licensed under the [MIT](http://www.opensource.org/licenses/mit-license.php) license.
|
|
90
|
+
Refer to the [LICENSE](https://github.com/wildbit/postmark-rails/blob/master/LICENSE) file for more information.
|
|
91
|
+
|
|
250
92
|
## Copyright
|
|
251
93
|
|
|
252
|
-
Copyright ©
|
|
94
|
+
Copyright © 2018 Wildbit LLC.
|
|
@@ -4,7 +4,7 @@ gemspec :path => '../'
|
|
|
4
4
|
|
|
5
5
|
gem 'json', '< 2.0.0'
|
|
6
6
|
gem 'rake', '< 11.0.0'
|
|
7
|
-
gem 'postmark', '~> 1.
|
|
7
|
+
gem 'postmark', '~> 1.15.0', :path => ENV['POSTMARK_GEM_PATH']
|
|
8
8
|
gem 'actionmailer', '~> 3.0.0'
|
|
9
9
|
gem 'rack-cache', '~> 1.2.0'
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ gemspec :path => '../'
|
|
|
4
4
|
|
|
5
5
|
gem 'json', '< 2.0.0'
|
|
6
6
|
gem 'rake', '< 11.0.0'
|
|
7
|
-
gem 'postmark', '~> 1.
|
|
7
|
+
gem 'postmark', '~> 1.15.0', :path => ENV['POSTMARK_GEM_PATH']
|
|
8
8
|
gem 'actionmailer', :github => 'rails', :branch => '3-2-stable'
|
|
9
9
|
gem 'i18n', '~> 0.6.0'
|
|
10
10
|
gem 'rack-cache', '~> 1.2.0'
|
data/lib/postmark-rails.rb
CHANGED
|
@@ -14,6 +14,8 @@ module PostmarkRails
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def self.install
|
|
17
|
+
require 'postmark-rails/preview_interceptor'
|
|
18
|
+
require 'postmark-rails/templated_mailer'
|
|
17
19
|
ActionMailer::Base.add_delivery_method :postmark, Mail::Postmark
|
|
18
20
|
ActionMailer::Base.send(:include, ActionMailerExtensions)
|
|
19
21
|
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require 'active_support/hash_with_indifferent_access'
|
|
2
|
+
|
|
3
|
+
module PostmarkRails
|
|
4
|
+
module TemplatedMailerMixin
|
|
5
|
+
READ_ONLY_HEADERS = %w(body content_type subject).freeze
|
|
6
|
+
BODY_STUB = 'Temporary Postmark Template Body'.freeze
|
|
7
|
+
SUBJECT_STUB = 'Temporary Postmark Template Subject'.freeze
|
|
8
|
+
ALIAS_STUB = proc { action_name }
|
|
9
|
+
|
|
10
|
+
def self.included(mailer)
|
|
11
|
+
mailer.default(
|
|
12
|
+
:body => BODY_STUB,
|
|
13
|
+
:content_type => 'text/plain',
|
|
14
|
+
:subject => SUBJECT_STUB,
|
|
15
|
+
:postmark_template_alias => ALIAS_STUB
|
|
16
|
+
)
|
|
17
|
+
mailer.extend(ClassMethods)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def template_model(*args)
|
|
21
|
+
message.template_model(*args)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def template_model=(model)
|
|
25
|
+
message.template_model = model
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def mail(headers = {})
|
|
29
|
+
super(self.class.safe_headers(headers))
|
|
30
|
+
ensure
|
|
31
|
+
message.body = standard_template_body
|
|
32
|
+
message.subject = standard_template_subject
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
module ClassMethods
|
|
38
|
+
def default(headers = {})
|
|
39
|
+
super(safe_headers(headers))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def safe_headers(headers = {})
|
|
43
|
+
headers = ActiveSupport::HashWithIndifferentAccess.new(headers)
|
|
44
|
+
violation = READ_ONLY_HEADERS.find { |h| headers.key?(h) }
|
|
45
|
+
raise ArgumentError, "Overriding '#{violation}' header in a templated mailer is not allowed." if violation
|
|
46
|
+
headers
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def standard_template_body
|
|
51
|
+
"This message is using a Postmark template.\n\n" \
|
|
52
|
+
"Alias: #{message.template_alias.inspect}\n" \
|
|
53
|
+
"Model:\n#{JSON.pretty_generate(message.template_model || {})}\n\n" \
|
|
54
|
+
'Use the #prerender method on this object to contact the Postmark API ' \
|
|
55
|
+
"to pre-render the template.\n\n" \
|
|
56
|
+
"Cheers,\n" \
|
|
57
|
+
'Your friends at Postmark'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def standard_template_subject
|
|
61
|
+
"Postmark Template: #{message.template_alias.inspect}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
class TemplatedMailer < ::ActionMailer::Base
|
|
66
|
+
include TemplatedMailerMixin
|
|
67
|
+
end
|
|
68
|
+
end
|
data/postmark-rails.gemspec
CHANGED
|
@@ -10,6 +10,10 @@ Gem::Specification.new do |s|
|
|
|
10
10
|
s.homepage = %q{http://postmarkapp.com}
|
|
11
11
|
s.summary = %q{Postmark adapter for ActionMailer}
|
|
12
12
|
|
|
13
|
+
s.metadata = {
|
|
14
|
+
"source_code_uri" => "https://github.com/wildbit/postmark-rails"
|
|
15
|
+
}
|
|
16
|
+
|
|
13
17
|
s.extra_rdoc_files = [
|
|
14
18
|
"LICENSE",
|
|
15
19
|
"README.md"
|
|
@@ -17,7 +21,7 @@ Gem::Specification.new do |s|
|
|
|
17
21
|
s.rdoc_options = ["--charset=UTF-8"]
|
|
18
22
|
|
|
19
23
|
s.add_dependency('actionmailer', ">= 3.0.0")
|
|
20
|
-
s.add_dependency('postmark', "~> 1.
|
|
24
|
+
s.add_dependency('postmark', "~> 1.15.0")
|
|
21
25
|
|
|
22
26
|
s.add_development_dependency("rake")
|
|
23
27
|
|
data/postmark.png
ADDED
|
Binary file
|
data/spec/spec_helper.rb
CHANGED
|
@@ -10,3 +10,12 @@ ActionMailer::Base.delivery_method = :postmark
|
|
|
10
10
|
ActionMailer::Base.prepend_view_path(File.join(File.dirname(__FILE__), "fixtures", "views"))
|
|
11
11
|
|
|
12
12
|
Dir["#{File.dirname(__FILE__)}/fixtures/models/*.rb"].each { |f| require f }
|
|
13
|
+
|
|
14
|
+
RSpec.configure do |config|
|
|
15
|
+
def make_mailer(base, &block)
|
|
16
|
+
mailer = Class.new(base, &block)
|
|
17
|
+
@mailer_number = 0
|
|
18
|
+
stub_const("Mailer#{@mailer_number += 1}", mailer)
|
|
19
|
+
mailer
|
|
20
|
+
end
|
|
21
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe PostmarkRails::PreviewInterceptor do
|
|
4
|
+
describe '.previewing_email' do
|
|
5
|
+
subject(:preview) { described_class.previewing_email(message) }
|
|
6
|
+
let(:settings) { { :api_token => 'secret' } }
|
|
7
|
+
|
|
8
|
+
before do
|
|
9
|
+
ActionMailer::Base.postmark_settings = settings
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
context 'when given a templated message' do
|
|
13
|
+
let(:message) do
|
|
14
|
+
Mail::Message.new do
|
|
15
|
+
template_alias 'foo'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'changes the message' do
|
|
20
|
+
message.freeze
|
|
21
|
+
expect { preview }.to raise_error(StandardError, /can't modify/)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'changes delivery method to Postmark and prerenders' do
|
|
25
|
+
expect(message).to receive(:prerender).exactly(1)
|
|
26
|
+
expect { preview }.to change { message.delivery_method }.to(Mail::Postmark)
|
|
27
|
+
expect(message.delivery_method.settings).to eq(settings)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'when given a non-templated message' do
|
|
32
|
+
let(:message) { Mail::Message.new }
|
|
33
|
+
|
|
34
|
+
it 'returns the message "as is"' do
|
|
35
|
+
message.freeze
|
|
36
|
+
expect { preview }.to_not raise_error
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
RSpec.describe PostmarkRails::TemplatedMailer do
|
|
4
|
+
subject(:message) { mailer.test_message }
|
|
5
|
+
|
|
6
|
+
shared_examples_for 'templated message' do |template_alias, model|
|
|
7
|
+
it { is_expected.to be_templated }
|
|
8
|
+
specify { expect(message.template_alias).to eq(template_alias) }
|
|
9
|
+
specify { expect(message.template_model).to eq model }
|
|
10
|
+
specify { expect(message.subject).to eq "Postmark Template: #{template_alias.inspect}" }
|
|
11
|
+
specify { expect(message.body_text).to include(template_alias.inspect) }
|
|
12
|
+
specify { expect(message.body_text).to include(JSON.pretty_generate(model || {})) }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context 'when template is not specified' do
|
|
16
|
+
let(:mailer) do
|
|
17
|
+
make_mailer(described_class) do
|
|
18
|
+
def test_message
|
|
19
|
+
mail :from => 'sender@wildbit.com', :to => 'recipient@wildbit.com'
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it_behaves_like 'templated message', 'test_message'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
context 'when template is specified' do
|
|
28
|
+
let(:mailer) do
|
|
29
|
+
make_mailer(described_class) do
|
|
30
|
+
def test_message
|
|
31
|
+
mail :from => 'sender@wildbit.com',
|
|
32
|
+
:to => 'recipient@wildbit.com',
|
|
33
|
+
:postmark_template_alias => 'custom_template'
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it_behaves_like 'templated message', 'custom_template'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
context 'when template model is specified' do
|
|
42
|
+
let(:mailer) do
|
|
43
|
+
make_mailer(described_class) do
|
|
44
|
+
def test_message
|
|
45
|
+
self.template_model = { :foo => 'bar' }
|
|
46
|
+
mail :from => 'sender@wildbit.com',
|
|
47
|
+
:to => 'recipient@wildbit.com'
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it_behaves_like 'templated message', 'test_message', :foo => 'bar'
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
describe '.default' do
|
|
56
|
+
it 'protects sensitive default headers from being overwritten' do
|
|
57
|
+
%w(subject body content_type).each do |header|
|
|
58
|
+
expect { described_class.default(header => 'foo') }.
|
|
59
|
+
to raise_error(ArgumentError, "Overriding '#{header}' header in a templated mailer is not allowed.")
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe '#mail' do
|
|
65
|
+
context "when overriding subject" do
|
|
66
|
+
let(:mailer) do
|
|
67
|
+
make_mailer(described_class) do
|
|
68
|
+
def test_message
|
|
69
|
+
mail :subject => 'Subject'
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'protects it from being overwritten' do
|
|
75
|
+
expect { mailer.test_message.subject }.
|
|
76
|
+
to raise_error(ArgumentError, "Overriding 'subject' header in a templated mailer is not allowed.")
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "when overriding body" do
|
|
81
|
+
let(:mailer) do
|
|
82
|
+
make_mailer(described_class) do
|
|
83
|
+
def test_message
|
|
84
|
+
mail :body => 'body'
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'protects it from being overwritten' do
|
|
90
|
+
expect { mailer.test_message.body }.
|
|
91
|
+
to raise_error(ArgumentError, "Overriding 'body' header in a templated mailer is not allowed.")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
context "when overriding content_type" do
|
|
96
|
+
let(:mailer) do
|
|
97
|
+
make_mailer(described_class) do
|
|
98
|
+
def test_message
|
|
99
|
+
mail :content_type => 'content_type'
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'protects it from being overwritten' do
|
|
105
|
+
expect { mailer.test_message.content_type }.
|
|
106
|
+
to raise_error(ArgumentError, "Overriding 'content_type' header in a templated mailer is not allowed.")
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: postmark-rails
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.19.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Petyo Ivanov
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2019-01-11 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: actionmailer
|
|
@@ -32,14 +32,14 @@ dependencies:
|
|
|
32
32
|
requirements:
|
|
33
33
|
- - "~>"
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
|
-
version: 1.
|
|
35
|
+
version: 1.15.0
|
|
36
36
|
type: :runtime
|
|
37
37
|
prerelease: false
|
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
|
39
39
|
requirements:
|
|
40
40
|
- - "~>"
|
|
41
41
|
- !ruby/object:Gem::Version
|
|
42
|
-
version: 1.
|
|
42
|
+
version: 1.15.0
|
|
43
43
|
- !ruby/object:Gem::Dependency
|
|
44
44
|
name: rake
|
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -66,7 +66,9 @@ files:
|
|
|
66
66
|
- ".document"
|
|
67
67
|
- ".gitignore"
|
|
68
68
|
- ".travis.yml"
|
|
69
|
+
- ".travis/setup.sh"
|
|
69
70
|
- CHANGELOG.rdoc
|
|
71
|
+
- CONTRIBUTING.md
|
|
70
72
|
- Gemfile
|
|
71
73
|
- LICENSE
|
|
72
74
|
- README.md
|
|
@@ -76,10 +78,15 @@ files:
|
|
|
76
78
|
- gemfiles/Gemfile.actionmailer-4.0.x
|
|
77
79
|
- gemfiles/Gemfile.actionmailer-4.1.x
|
|
78
80
|
- gemfiles/Gemfile.actionmailer-4.2.x
|
|
81
|
+
- gemfiles/Gemfile.actionmailer-5.0.x
|
|
82
|
+
- gemfiles/Gemfile.actionmailer-5.1.x
|
|
79
83
|
- lib/postmark-rails.rb
|
|
84
|
+
- lib/postmark-rails/preview_interceptor.rb
|
|
80
85
|
- lib/postmark-rails/railtie.rb
|
|
86
|
+
- lib/postmark-rails/templated_mailer.rb
|
|
81
87
|
- lib/postmark-rails/version.rb
|
|
82
88
|
- postmark-rails.gemspec
|
|
89
|
+
- postmark.png
|
|
83
90
|
- spec/fixtures/empty.gif
|
|
84
91
|
- spec/fixtures/models/test_mailer.rb
|
|
85
92
|
- spec/fixtures/views/test_mailer/message_with_attachment.erb
|
|
@@ -92,12 +99,15 @@ files:
|
|
|
92
99
|
- spec/fixtures/views/test_mailer/tracked_message.html.erb
|
|
93
100
|
- spec/integration/batch_delivery_spec.rb
|
|
94
101
|
- spec/integration/delivery_spec.rb
|
|
95
|
-
- spec/postmark-rails_spec.rb
|
|
96
102
|
- spec/spec.opts
|
|
97
103
|
- spec/spec_helper.rb
|
|
104
|
+
- spec/unit/postmark-rails_spec.rb
|
|
105
|
+
- spec/unit/preview_interceptor_spec.rb
|
|
106
|
+
- spec/unit/templated_mailer_spec.rb
|
|
98
107
|
homepage: http://postmarkapp.com
|
|
99
108
|
licenses: []
|
|
100
|
-
metadata:
|
|
109
|
+
metadata:
|
|
110
|
+
source_code_uri: https://github.com/wildbit/postmark-rails
|
|
101
111
|
post_install_message:
|
|
102
112
|
rdoc_options:
|
|
103
113
|
- "--charset=UTF-8"
|
|
@@ -132,6 +142,8 @@ test_files:
|
|
|
132
142
|
- spec/fixtures/views/test_mailer/tracked_message.html.erb
|
|
133
143
|
- spec/integration/batch_delivery_spec.rb
|
|
134
144
|
- spec/integration/delivery_spec.rb
|
|
135
|
-
- spec/postmark-rails_spec.rb
|
|
136
145
|
- spec/spec.opts
|
|
137
146
|
- spec/spec_helper.rb
|
|
147
|
+
- spec/unit/postmark-rails_spec.rb
|
|
148
|
+
- spec/unit/preview_interceptor_spec.rb
|
|
149
|
+
- spec/unit/templated_mailer_spec.rb
|