multi_mail 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +57 -34
- data/bin/multi_mail_post +71 -0
- data/lib/mail_ext/message.rb +11 -0
- data/lib/multi_mail.rb +25 -8
- data/lib/multi_mail/cloudmailin/receiver.rb +24 -3
- data/lib/multi_mail/mailgun/message.rb +6 -1
- data/lib/multi_mail/mailgun/sender.rb +4 -4
- data/lib/multi_mail/mandrill/message.rb +4 -3
- data/lib/multi_mail/mandrill/sender.rb +9 -2
- data/lib/multi_mail/message/base.rb +14 -0
- data/lib/multi_mail/postmark/message.rb +74 -0
- data/lib/multi_mail/postmark/receiver.rb +2 -1
- data/lib/multi_mail/postmark/sender.rb +54 -24
- data/lib/multi_mail/sendgrid/message.rb +4 -4
- data/lib/multi_mail/sendgrid/sender.rb +2 -2
- data/lib/multi_mail/simple/receiver.rb +31 -1
- data/lib/multi_mail/version.rb +1 -1
- data/multi_mail.gemspec +2 -1
- data/spec/cloudmailin/receiver_spec.rb +89 -84
- data/spec/fixtures/cloudmailin/json/attachment_store.txt +65 -0
- data/spec/fixtures/cloudmailin/multipart/attachment_store.txt +174 -0
- data/spec/fixtures/cloudmailin/raw/attachment_store.txt +162 -0
- data/spec/fixtures/mailgun/parsed/valid.txt +107 -101
- data/spec/fixtures/simple/invalid.txt +4 -0
- data/spec/fixtures/simple/missing.txt +4 -0
- data/spec/fixtures/simple/valid.txt +1 -1
- data/spec/mail_ext/message_spec.rb +45 -0
- data/spec/mailgun/message_spec.rb +38 -8
- data/spec/mailgun/receiver_spec.rb +104 -110
- data/spec/mailgun/sender_spec.rb +13 -7
- data/spec/mandrill/message_spec.rb +25 -1
- data/spec/mandrill/receiver_spec.rb +81 -83
- data/spec/mandrill/sender_spec.rb +13 -6
- data/spec/message/base_spec.rb +33 -1
- data/spec/postmark/message_spec.rb +292 -0
- data/spec/postmark/receiver_spec.rb +46 -48
- data/spec/postmark/sender_spec.rb +10 -10
- data/spec/sendgrid/message_spec.rb +6 -1
- data/spec/sendgrid/receiver_spec.rb +56 -58
- data/spec/sendgrid/sender_spec.rb +9 -7
- data/spec/service_spec.rb +1 -1
- data/spec/simple/receiver_spec.rb +38 -25
- data/spec/spec_helper.rb +6 -8
- metadata +185 -203
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 10a52d2bbde07c200870939a097077677734ec7f
|
4
|
+
data.tar.gz: 41aeb775d3c1cf6b1fefb20799756a78297eecbb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ea709588481915a7bc64e7402eb1dffc43ddfc470f0f79e7417f17c594fb29b73721953c1d1364117e5e3ac2201a8526fb3cf168ecb58e60a3c4529a33cc33af
|
7
|
+
data.tar.gz: 2a2bf5311c4098c2255ab698fcd5c6498350d2adb601b1d8aff2de79dcc5683b45ea2d9a157961b3f5153ad729cf61c1d5b4b100a0204ca3b62fbb1f07242c43
|
data/README.md
CHANGED
@@ -12,6 +12,7 @@ Many providers offer APIs to send, receive, and parse email. MultiMail lets you
|
|
12
12
|
* [Mandrill](http://mandrill.com/): [Example](#mandrill)
|
13
13
|
* [Postmark](http://postmarkapp.com/): [Example](#postmark)
|
14
14
|
* [SendGrid](http://sendgrid.com/): [Example](#sendgrid)
|
15
|
+
* MTA like [Postfix](http://en.wikipedia.org/wiki/Postfix_\(software\)) or [qmail](http://en.wikipedia.org/wiki/Qmail): [Example](#mta)
|
15
16
|
|
16
17
|
## Usage
|
17
18
|
|
@@ -37,7 +38,6 @@ With MultiMail, you send a message the same way you do with the [Mail](https://g
|
|
37
38
|
|
38
39
|
```ruby
|
39
40
|
require 'multi_mail'
|
40
|
-
require 'multi_mail/postmark/sender'
|
41
41
|
|
42
42
|
message = Mail.new do
|
43
43
|
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
@@ -67,39 +67,38 @@ Mail.defaults do
|
|
67
67
|
end
|
68
68
|
```
|
69
69
|
|
70
|
-
####
|
70
|
+
#### Tagging
|
71
71
|
|
72
|
-
Mailgun and
|
72
|
+
Mailgun, Mandrill and Postmark allow you to tag messages in order to accumulate statistics by tag, which will be accessible through their user interface:
|
73
73
|
|
74
74
|
```ruby
|
75
75
|
require 'multi_mail'
|
76
|
-
require 'multi_mail/mailgun/sender'
|
77
76
|
|
78
77
|
message = Mail.new do
|
79
|
-
delivery_method MultiMail::Sender::
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
:clicks => false,
|
85
|
-
}
|
78
|
+
delivery_method MultiMail::Sender::Mandrill, :api_key => 'your-api-key'
|
79
|
+
|
80
|
+
tag 'signup'
|
81
|
+
tag 'promotion'
|
82
|
+
|
86
83
|
...
|
87
84
|
end
|
88
85
|
|
89
86
|
message.deliver
|
90
87
|
```
|
91
88
|
|
92
|
-
[
|
89
|
+
Mailgun accepts at most [3 tags](http://documentation.mailgun.com/user_manual.html#tagging) and Postmark at most one tag.
|
93
90
|
|
94
|
-
|
91
|
+
#### Track opens and clicks
|
92
|
+
|
93
|
+
Mailgun and Mandrill allow you to set open tracking and click tracking on a per-message basis:
|
95
94
|
|
96
95
|
```ruby
|
97
96
|
require 'multi_mail'
|
98
|
-
require 'multi_mail/mandrill/sender'
|
99
97
|
|
100
98
|
message = Mail.new do
|
101
|
-
delivery_method MultiMail::Sender::
|
99
|
+
delivery_method MultiMail::Sender::Mailgun,
|
102
100
|
:api_key => 'your-api-key',
|
101
|
+
:domain => 'your-domain.mailgun.org',
|
103
102
|
:track => {
|
104
103
|
:opens => true,
|
105
104
|
:clicks => false,
|
@@ -110,6 +109,8 @@ end
|
|
110
109
|
message.deliver
|
111
110
|
```
|
112
111
|
|
112
|
+
[Mailgun](http://documentation.mailgun.com/user_manual.html#tracking-clicks) and [Mandrill](http://help.mandrill.com/entries/21721852-Why-aren-t-clicks-being-tracked-) track whether a recipient has clicked a link in a message by rewriting its URL. If want to rewrite URLs in HTML parts only (leaving URLs as-is in text parts) use `:clicks => 'htmlonly'` if you are using Mailgun; if you are using Mandrill, do not set `:clicks` and instead configure click tracking globally in your [Mandrill sending options](https://mandrillapp.com/settings/sending-options).
|
113
|
+
|
113
114
|
#### Inspect the API response
|
114
115
|
|
115
116
|
Pass `:return_response => true` to `delivery_method` and use the `deliver!` method to send the message:
|
@@ -144,13 +145,21 @@ service = MultiMail::Receiver.new({
|
|
144
145
|
})
|
145
146
|
```
|
146
147
|
|
148
|
+
If you are using an [Amazon S3 attachment store](http://docs.cloudmailin.com/receiving_email/attachments/), add a `:attachment_store => true` option. You must set the attachment store's permission setting to "Public Read".
|
149
|
+
|
150
|
+
```ruby
|
151
|
+
service = MultiMail::Receiver.new({
|
152
|
+
:provider => 'cloudmailin',
|
153
|
+
:http_post_format => 'multipart',
|
154
|
+
:attachment_store => true,
|
155
|
+
})
|
156
|
+
```
|
157
|
+
|
147
158
|
See [Cloudmailin's documentation](http://docs.cloudmailin.com/http_post_formats/) for these additional parameters provided by the API:
|
148
159
|
|
149
160
|
* `reply_plain`
|
150
161
|
* `spf-result`
|
151
162
|
|
152
|
-
**Note:** [MultiMail doesn't yet support Cloudmailin's URL attachments (attachment stores).](https://github.com/opennorth/multi_mail/issues/11) Please use regular attachments (always the case if you use the default `raw` format).
|
153
|
-
|
154
163
|
## Mailgun
|
155
164
|
|
156
165
|
### Incoming
|
@@ -189,8 +198,6 @@ See [Mailgun's documentation](http://documentation.mailgun.net/user_manual.html#
|
|
189
198
|
### Outgoing
|
190
199
|
|
191
200
|
```ruby
|
192
|
-
require 'multi_mail/mailgun/sender'
|
193
|
-
|
194
201
|
Mail.deliver do
|
195
202
|
delivery_method MultiMail::Sender::Mailgun, :api_key => 'your-api-key', :domain => 'your-domain.mailgun.org'
|
196
203
|
...
|
@@ -199,7 +206,6 @@ end
|
|
199
206
|
|
200
207
|
You may pass additional arguments to `delivery_method` to use Mailgun-specific features ([see docs](http://documentation.mailgun.com/api-sending.html)):
|
201
208
|
|
202
|
-
* `o:tag`
|
203
209
|
* `o:campaign`
|
204
210
|
* `o:dkim`
|
205
211
|
* `o:deliverytime`
|
@@ -217,7 +223,7 @@ service = MultiMail::Receiver.new({
|
|
217
223
|
})
|
218
224
|
```
|
219
225
|
|
220
|
-
To check that a request originates from Mandrill, add `:mandrill_webhook_key` and `:mandrill_webhook_url` options:
|
226
|
+
To check that a request originates from Mandrill, add `:mandrill_webhook_key` and `:mandrill_webhook_url` options (you can get your webhook key from [Mandrill's Webhooks Settings](https://mandrillapp.com/settings/webhooks)):
|
221
227
|
|
222
228
|
```ruby
|
223
229
|
service = MultiMail::Receiver.new({
|
@@ -226,7 +232,6 @@ service = MultiMail::Receiver.new({
|
|
226
232
|
:mandrill_webhook_url => 'http://example.com/post',
|
227
233
|
})
|
228
234
|
```
|
229
|
-
You can get your webhook key from [Mandrill's Webhooks Settings](https://mandrillapp.com/settings/webhooks).
|
230
235
|
|
231
236
|
The default SpamAssassin score needed to flag an email as spam is `5`. Add a `:spamassassin_threshold` option to increase or decrease it:
|
232
237
|
|
@@ -249,8 +254,6 @@ See [Mandrill's documentation](http://help.mandrill.com/entries/22092308-What-is
|
|
249
254
|
### Outgoing
|
250
255
|
|
251
256
|
```ruby
|
252
|
-
require 'multi_mail/mandrill/sender'
|
253
|
-
|
254
257
|
Mail.deliver do
|
255
258
|
delivery_method MultiMail::Sender::Mandrill, :api_key => 'your-api-key'
|
256
259
|
...
|
@@ -267,7 +270,6 @@ You may pass additional arguments to `delivery_method` to use Mandrill-specific
|
|
267
270
|
* `bcc_address`
|
268
271
|
* `tracking_domain` and `signing_domain`
|
269
272
|
* `merge`, `global_merge_vars` and `merge_vars`
|
270
|
-
* `tags`
|
271
273
|
* `google_analytics_domains` and `google_analytics_campaign`
|
272
274
|
* `metadata` and `recipient_metadata`
|
273
275
|
* `async`
|
@@ -287,24 +289,17 @@ service = MultiMail::Receiver.new({
|
|
287
289
|
See [Postmark's documentation](http://developer.postmarkapp.com/developer-inbound-parse.html#mailboxhash) for these additional parameters provided by the API:
|
288
290
|
|
289
291
|
* `MailboxHash`
|
290
|
-
* `MessageID`
|
291
292
|
* `Tag`
|
292
293
|
|
293
294
|
### Outgoing
|
294
295
|
|
295
296
|
```ruby
|
296
|
-
require 'multi_mail/postmark/sender'
|
297
|
-
|
298
297
|
Mail.deliver do
|
299
298
|
delivery_method MultiMail::Sender::Postmark, :api_key => 'your-api-key'
|
300
299
|
...
|
301
300
|
end
|
302
301
|
```
|
303
302
|
|
304
|
-
MultiMail depends on the `postmark` gem for its Postmark integration.
|
305
|
-
|
306
|
-
You may also pass a `Tag` option to `delivery_method` ([see Postmark's documentation](http://developer.postmarkapp.com/developer-build.html#message-format)).
|
307
|
-
|
308
303
|
## SendGrid
|
309
304
|
|
310
305
|
### Incoming
|
@@ -334,8 +329,6 @@ See [SendGrid's documentation](http://sendgrid.com/docs/API_Reference/Webhooks/p
|
|
334
329
|
### Outgoing
|
335
330
|
|
336
331
|
```ruby
|
337
|
-
require 'multi_mail/sendgrid/sender'
|
338
|
-
|
339
332
|
Mail.deliver do
|
340
333
|
delivery_method MultiMail::Sender::SendGrid, :api_user => 'username', :api_key => 'password'
|
341
334
|
...
|
@@ -344,6 +337,36 @@ end
|
|
344
337
|
|
345
338
|
You may also pass a `x-smtpapi` option to `delivery_method` ([see SendGrid's documentation](http://sendgrid.com/docs/API_Reference/Web_API/mail.html)).
|
346
339
|
|
340
|
+
## MTA
|
341
|
+
|
342
|
+
### Incoming
|
343
|
+
|
344
|
+
If you are switching from an email API to Postfix or qmail, the simplest option is to continue sending messages to your application's webhook URL.
|
345
|
+
|
346
|
+
Your Postfix configuration may look like:
|
347
|
+
|
348
|
+
# /etc/postfix/virtual
|
349
|
+
incoming@myapp.com myappalias
|
350
|
+
|
351
|
+
# /etc/mail/aliases
|
352
|
+
myappalias: "| multi_mail_post --secret my-secret-string http://www.myapp.com/post"
|
353
|
+
|
354
|
+
Your qmail configuration may look like:
|
355
|
+
|
356
|
+
# /var/qmail/mailnames/myapp.com/.qmail-incoming
|
357
|
+
| multi_mail_post --secret my-secret-string http://www.myapp.com/post
|
358
|
+
|
359
|
+
In your application, you would use the `simple` provider:
|
360
|
+
|
361
|
+
```ruby
|
362
|
+
service = MultiMail::Receiver.new({
|
363
|
+
:provider => 'simple',
|
364
|
+
:secret => 'my-secret-string',
|
365
|
+
})
|
366
|
+
```
|
367
|
+
|
368
|
+
It's recommended to use a secret key, to ensure that the requests are sent by Postfix and qmail and not by other sources on the internet.
|
369
|
+
|
347
370
|
## Bugs? Questions?
|
348
371
|
|
349
372
|
This gem's main repository is on GitHub: [http://github.com/opennorth/multi_mail](http://github.com/opennorth/multi_mail), where your contributions, forks, bug reports, feature requests, and feedback are greatly welcomed.
|
data/bin/multi_mail_post
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
require 'multi_mail'
|
7
|
+
require 'multi_mail/version'
|
8
|
+
|
9
|
+
secret = nil
|
10
|
+
|
11
|
+
opts = OptionParser.new do |opts|
|
12
|
+
opts.banner = "Usage: #{opts.program_name} [options] URL < INPUT"
|
13
|
+
opts.on('-s', '--secret SECRET', 'A secret key to ensure that requests are authentic') do |v|
|
14
|
+
secret = v
|
15
|
+
end
|
16
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
17
|
+
puts opts
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
opts.on_tail('-v', '--version', 'Show version') do
|
21
|
+
puts MultiMail::VERSION
|
22
|
+
exit
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
rest = opts.parse!(ARGV)
|
27
|
+
|
28
|
+
if rest.empty?
|
29
|
+
puts opts.banner
|
30
|
+
exit
|
31
|
+
end
|
32
|
+
|
33
|
+
url = rest.shift
|
34
|
+
|
35
|
+
begin
|
36
|
+
url = URI.parse(url)
|
37
|
+
rescue URI::InvalidURIError
|
38
|
+
abort "#{url} is not a valid URI"
|
39
|
+
end
|
40
|
+
|
41
|
+
unless url.scheme && url.host
|
42
|
+
abort "#{url} is not a valid URI"
|
43
|
+
end
|
44
|
+
|
45
|
+
service = MultiMail::Receiver.new({
|
46
|
+
:provider => :simple,
|
47
|
+
:secret => secret,
|
48
|
+
})
|
49
|
+
|
50
|
+
params = {
|
51
|
+
'message' => STDIN.read,
|
52
|
+
'timestamp' => Time.now.to_i,
|
53
|
+
'token' => SecureRandom.hash,
|
54
|
+
}
|
55
|
+
|
56
|
+
params['signature'] = service.signature(params) if secret
|
57
|
+
|
58
|
+
connection = Faraday.new(:url => "#{url.scheme}://#{url.host}:#{url.port}") do |conn|
|
59
|
+
conn.basic_auth url.user, url.password if url.user || url.password
|
60
|
+
conn.request :url_encoded
|
61
|
+
conn.adapter Faraday.default_adapter
|
62
|
+
end
|
63
|
+
|
64
|
+
response = connection.post(url.path, params)
|
65
|
+
|
66
|
+
if response.status != 200
|
67
|
+
headers = response.headers.map do |key,value|
|
68
|
+
"#{key.gsub(/\b([a-z])/) {$1.capitalize}}: #{value}"
|
69
|
+
end
|
70
|
+
abort (headers + ['', response.body]).join("\r\n")
|
71
|
+
end
|
data/lib/multi_mail.rb
CHANGED
@@ -9,24 +9,33 @@ require 'mail'
|
|
9
9
|
require 'multimap'
|
10
10
|
require 'rack'
|
11
11
|
|
12
|
+
require 'mail_ext/message'
|
13
|
+
|
12
14
|
module MultiMail
|
13
15
|
# @see http://rdoc.info/gems/fog/Fog/Errors
|
14
16
|
class Error < StandardError; end
|
17
|
+
|
15
18
|
# Raise if an incoming POST request is forged.
|
16
19
|
class ForgedRequest < MultiMail::Error; end
|
17
|
-
# Raise if an API key is invalid.
|
18
|
-
class InvalidAPIKey < MultiMail::Error; end
|
19
20
|
|
21
|
+
# Raise if an outgoing request is invalid.
|
22
|
+
class InvalidRequest < MultiMail::Error; end
|
23
|
+
# Raise if an API key is invalid.
|
24
|
+
class InvalidAPIKey < InvalidRequest; end
|
20
25
|
# Raise if a message is invalid.
|
21
|
-
class InvalidMessage <
|
26
|
+
class InvalidMessage < InvalidRequest; end
|
27
|
+
|
28
|
+
# Raise if a message header is invalid
|
29
|
+
class InvalidHeader < InvalidMessage; end
|
30
|
+
# Raise if a message has no body.
|
31
|
+
class MissingBody < InvalidMessage; end
|
32
|
+
|
22
33
|
# Raise if a message has no sender.
|
23
|
-
class MissingSender <
|
34
|
+
class MissingSender < InvalidHeader; end
|
24
35
|
# Raise if a message has no recipients.
|
25
|
-
class MissingRecipients <
|
36
|
+
class MissingRecipients < InvalidHeader; end
|
26
37
|
# Raise if a message has no subject.
|
27
|
-
class MissingSubject <
|
28
|
-
# Raise if a message has no body.
|
29
|
-
class MissingBody < InvalidMessage; end
|
38
|
+
class MissingSubject < InvalidHeader; end
|
30
39
|
|
31
40
|
class << self
|
32
41
|
# @return [RegExp] a message whose subject matches this pattern will be
|
@@ -97,3 +106,11 @@ require 'multi_mail/receiver'
|
|
97
106
|
require 'multi_mail/message/base'
|
98
107
|
require 'multi_mail/receiver/base'
|
99
108
|
require 'multi_mail/sender/base'
|
109
|
+
require 'multi_mail/mailgun/message'
|
110
|
+
require 'multi_mail/mailgun/sender'
|
111
|
+
require 'multi_mail/mandrill/message'
|
112
|
+
require 'multi_mail/mandrill/sender'
|
113
|
+
require 'multi_mail/postmark/message'
|
114
|
+
require 'multi_mail/postmark/sender'
|
115
|
+
require 'multi_mail/sendgrid/message'
|
116
|
+
require 'multi_mail/sendgrid/sender'
|
@@ -9,15 +9,18 @@ module MultiMail
|
|
9
9
|
class Cloudmailin
|
10
10
|
include MultiMail::Receiver::Base
|
11
11
|
|
12
|
-
recognizes :http_post_format
|
12
|
+
recognizes :http_post_format, :attachment_store
|
13
13
|
|
14
14
|
# Initializes a Cloudmailin incoming email receiver.
|
15
15
|
#
|
16
16
|
# @param [Hash] options required and optional arguments
|
17
17
|
# @option options [String] :http_post_format "multipart", "json" or "raw"
|
18
|
+
# @option options [Boolean] :attachment_store whether attachments have
|
19
|
+
# been sent to an attachment store
|
18
20
|
def initialize(options = {})
|
19
21
|
super
|
20
22
|
@http_post_format = options[:http_post_format]
|
23
|
+
@attachment_store = options[:attachment_store]
|
21
24
|
end
|
22
25
|
|
23
26
|
# @param [Hash] params the content of Cloudmailin's webhook
|
@@ -33,6 +36,12 @@ module MultiMail
|
|
33
36
|
# Extra Cloudmailin parameters.
|
34
37
|
message['spf-result'] = params['envelope']['spf']['result']
|
35
38
|
|
39
|
+
if @attachment_store
|
40
|
+
params['attachments'].each do |_,attachment|
|
41
|
+
message.add_file(:filename => attachment['file_name'], :content => Faraday.get(attachment['url']).body)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
36
45
|
# Discard rest of `envelope`: `from`, `to`, `recipients`,
|
37
46
|
# `helo_domain` and `remote_ip`.
|
38
47
|
[message]
|
@@ -40,6 +49,7 @@ module MultiMail
|
|
40
49
|
# Mail changes `self`.
|
41
50
|
headers = self.class.multimap(params['headers'])
|
42
51
|
http_post_format = @http_post_format
|
52
|
+
attachment_store = @attachment_store
|
43
53
|
this = self
|
44
54
|
|
45
55
|
message = Mail.new do
|
@@ -57,13 +67,24 @@ module MultiMail
|
|
57
67
|
end
|
58
68
|
|
59
69
|
if params.key?('attachments')
|
70
|
+
# Using something like lazy.rb will not prevent the HTTP request,
|
71
|
+
# because the Mail gem must be able to call #valid_encoding? on
|
72
|
+
# the attachment body (in Ruby 1.9).
|
60
73
|
if http_post_format == 'json'
|
61
74
|
params['attachments'].each do |attachment|
|
62
|
-
|
75
|
+
if attachment_store
|
76
|
+
add_file(:filename => attachment['file_name'], :content => Faraday.get(attachment['url']).body)
|
77
|
+
else
|
78
|
+
add_file(:filename => attachment['file_name'], :content => Base64.decode64(attachment['content']))
|
79
|
+
end
|
63
80
|
end
|
64
81
|
else
|
65
82
|
params['attachments'].each do |_,attachment|
|
66
|
-
|
83
|
+
if attachment_store
|
84
|
+
add_file(:filename => attachment['file_name'], :content => Faraday.get(attachment['url']).body)
|
85
|
+
else
|
86
|
+
add_file(this.class.add_file_arguments(attachment))
|
87
|
+
end
|
67
88
|
end
|
68
89
|
end
|
69
90
|
end
|
@@ -9,7 +9,7 @@ module MultiMail
|
|
9
9
|
hash = Multimap.new
|
10
10
|
header_fields.each do |field|
|
11
11
|
key = field.name.downcase
|
12
|
-
unless %w(from to cc bcc subject
|
12
|
+
unless %w(from to cc bcc subject tag).include?(key)
|
13
13
|
hash["h:#{field.name}"] = field.value
|
14
14
|
end
|
15
15
|
end
|
@@ -32,6 +32,7 @@ module MultiMail
|
|
32
32
|
# Returns the message as parameters to POST to Mailgun.
|
33
33
|
#
|
34
34
|
# @return [Hash] the message as parameters to POST to Mailgun
|
35
|
+
# @see http://documentation.mailgun.com/user_manual.html#tagging
|
35
36
|
def to_mailgun_hash
|
36
37
|
hash = Multimap.new
|
37
38
|
|
@@ -60,6 +61,10 @@ module MultiMail
|
|
60
61
|
hash['html'] = body_html
|
61
62
|
end
|
62
63
|
|
64
|
+
tags.each do |tag|
|
65
|
+
hash['o:tag'] = tag
|
66
|
+
end
|
67
|
+
|
63
68
|
normalize(hash.merge(mailgun_attachments).merge(mailgun_headers).to_hash)
|
64
69
|
end
|
65
70
|
end
|