multi_mail 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +2 -1
  2. data/.travis.yml +10 -0
  3. data/README.md +283 -59
  4. data/Rakefile +38 -19
  5. data/lib/multi_mail/cloudmailin/receiver.rb +3 -13
  6. data/lib/multi_mail/mailgun/message.rb +67 -0
  7. data/lib/multi_mail/mailgun/receiver.rb +20 -13
  8. data/lib/multi_mail/mailgun/sender.rb +79 -2
  9. data/lib/multi_mail/mandrill/message.rb +74 -0
  10. data/lib/multi_mail/mandrill/receiver.rb +36 -16
  11. data/lib/multi_mail/mandrill/sender.rb +77 -2
  12. data/lib/multi_mail/message/base.rb +40 -0
  13. data/lib/multi_mail/postmark/receiver.rb +1 -1
  14. data/lib/multi_mail/postmark/sender.rb +35 -5
  15. data/lib/multi_mail/receiver/base.rb +31 -2
  16. data/lib/multi_mail/receiver.rb +1 -4
  17. data/lib/multi_mail/sender/base.rb +23 -1
  18. data/lib/multi_mail/sendgrid/message.rb +74 -0
  19. data/lib/multi_mail/sendgrid/receiver.rb +72 -23
  20. data/lib/multi_mail/sendgrid/sender.rb +63 -2
  21. data/lib/multi_mail/service.rb +48 -56
  22. data/lib/multi_mail/simple/receiver.rb +4 -4
  23. data/lib/multi_mail/version.rb +1 -1
  24. data/lib/multi_mail.rb +16 -1
  25. data/multi_mail.gemspec +4 -1
  26. data/spec/fixtures/empty.gif +0 -0
  27. data/spec/fixtures/mailgun/raw/invalid.txt +13 -0
  28. data/spec/fixtures/mailgun/raw/missing.txt +13 -0
  29. data/spec/fixtures/mailgun/raw/spam.txt +13 -0
  30. data/spec/fixtures/mailgun/raw/valid.txt +13 -0
  31. data/spec/fixtures/mandrill/invalid.txt +15 -0
  32. data/spec/fixtures/mandrill/missing.txt +14 -0
  33. data/spec/fixtures/mandrill/multiple.txt +15 -0
  34. data/spec/fixtures/mandrill/valid.txt +10 -5
  35. data/spec/fixtures/postmark/valid.txt +13 -13
  36. data/spec/fixtures/sendgrid/encoding.txt +90 -0
  37. data/spec/fixtures/sendgrid/spam.txt +94 -0
  38. data/spec/fixtures/sendgrid/valid.txt +136 -0
  39. data/spec/mailgun/message_spec.rb +251 -0
  40. data/spec/mailgun/receiver_spec.rb +35 -20
  41. data/spec/mailgun/sender_spec.rb +175 -0
  42. data/spec/mandrill/message_spec.rb +305 -0
  43. data/spec/mandrill/receiver_spec.rb +90 -46
  44. data/spec/mandrill/sender_spec.rb +138 -0
  45. data/spec/message/base_spec.rb +81 -0
  46. data/spec/postmark/receiver_spec.rb +4 -4
  47. data/spec/postmark/sender_spec.rb +118 -0
  48. data/spec/receiver/base_spec.rb +16 -9
  49. data/spec/sender/base_spec.rb +24 -10
  50. data/spec/sendgrid/message_spec.rb +265 -0
  51. data/spec/sendgrid/receiver_spec.rb +77 -0
  52. data/spec/sendgrid/sender_spec.rb +140 -0
  53. data/spec/service_spec.rb +18 -1
  54. data/spec/simple/receiver_spec.rb +1 -1
  55. data/spec/spec_helper.rb +46 -4
  56. metadata +226 -143
  57. data/lib/multi_mail/sender.rb +0 -46
  58. data/lib/multi_mail/simple/sender.rb +0 -14
  59. data/spec/sender_spec.rb +0 -13
  60. data/spec/simple/sender_spec.rb +0 -0
@@ -0,0 +1,74 @@
1
+ module MultiMail
2
+ module Message
3
+ # @see http://sendgrid.com/docs/API_Reference/Web_API/mail.html
4
+ class SendGrid < MultiMail::Message::Base
5
+ # Returns the message headers in SendGrid format.
6
+ #
7
+ # @return [Hash] the message headers in SendGrid format
8
+ def sendgrid_headers
9
+ headers = {}
10
+ header_fields.each do |field|
11
+ key = field.name.downcase
12
+ unless %w(to subject from bcc reply-to date message-id).include?(key)
13
+ # The JSON must not contain integers.
14
+ headers[field.name] = field.value.to_s
15
+ end
16
+ end
17
+ headers
18
+ end
19
+
20
+ # Returns the message's attachments in SendGrid format.
21
+ #
22
+ # @return [Hash] the attachments in SendGrid format
23
+ def sendgrid_files
24
+ hash = {}
25
+ attachments.map do |attachment|
26
+ # File contents must be part of the multipart HTTP POST.
27
+ # @see http://sendgrid.com/docs/API_Reference/Web_API/mail.html
28
+ hash[attachment.filename] = Faraday::UploadIO.new(StringIO.new(attachment.body.decoded), attachment.content_type, attachment.filename)
29
+ end
30
+ hash
31
+ end
32
+
33
+ # Returns the attachments' content IDs in SendGrid format.
34
+ #
35
+ # @return [Hash] the content IDs in SendGrid format
36
+ def sendgrid_content
37
+ hash = {}
38
+ attachments.each do |attachment|
39
+ if attachment.content_type.start_with?('image/')
40
+ # Mirror Mailgun behavior for naming inline attachments.
41
+ # @see http://documentation.mailgun.com/user_manual.html#inline-image
42
+ hash[attachment.filename] = attachment.filename
43
+ end
44
+ end
45
+ hash
46
+ end
47
+
48
+ # Returns the message as parameters to POST to SendGrid.
49
+ #
50
+ # @return [Hash] the message as parameters to POST to SendGrid
51
+ def to_sendgrid_hash
52
+ headers = sendgrid_headers
53
+
54
+ hash = {
55
+ 'to' => to.to_a,
56
+ 'toname' => to && self[:to].display_names.to_a,
57
+ 'subject' => subject,
58
+ 'text' => body_text,
59
+ 'html' => body_html,
60
+ 'from' => from && from.first,
61
+ 'bcc' => bcc.to_a,
62
+ 'fromname' => from && self[:from].display_names.first,
63
+ 'replyto' => reply_to && reply_to.first,
64
+ 'date' => date && Time.parse(date.to_s).rfc2822, # Ruby 1.8.7
65
+ 'files' => sendgrid_files,
66
+ 'content' => sendgrid_content,
67
+ 'headers' => headers.empty? ? nil : JSON.dump(headers),
68
+ }
69
+
70
+ normalize(hash)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,42 +1,91 @@
1
1
  module MultiMail
2
2
  module Receiver
3
- class SendGrid < MultiMail::Service
3
+ # SendGrid's incoming email receiver.
4
+ class SendGrid
4
5
  include MultiMail::Receiver::Base
5
-
6
- requires :sendgrid_username
7
- requires :sendgrid_password
8
- recognizes :http_post_format
9
- attr_reader :http_post_format
10
-
6
+ # Initializes a SendGrid incoming email receiver.
7
+ #
8
+ # @param [Hash] options required and optional arguments
9
+ # @option option [Float] :spamassassin_threshold the Spamassassin score
10
+ # needed to flag a message as spam
11
11
  def initialize(options = {})
12
12
  super
13
- @sendgrid_username = options[:sendgrid_username]
14
- @sendgrid_password = options[:sendgrid_password]
15
- @http_post_format = options[:http_post_format]
13
+ @spamassassin_threshold = options[:spamassassin_threshold] || 5
16
14
  end
17
15
 
16
+ # Transforms the content of SendGrid's webook into a list of messages.
17
+ #
18
+ # @param [Hash] params the content of Mandrill's webhook
19
+ # @return [Array<Mail::Messages>] messages
20
+ # @see http://sendgrid.com/docs/API_Reference/Webhooks/parse.html
18
21
  def transform(params)
19
- attachments = 1.upto(params['attachments'].to_i).map do |num|
20
- attachment_from_params(params["attachment#{num}"])
21
- end
22
+ # Make variables available to the `encode` method.
23
+ @params = params
24
+ @charsets = JSON.load(params['charsets'])
22
25
 
23
- @message = Mail.new do
26
+ # Mail changes `self`.
27
+ this = self
28
+
29
+ message = Mail.new do
30
+ # SendGrid includes a `charsets` parameter, which describes the
31
+ # encodings of the `from`, `to`, `cc` and `subject` parameters, which
32
+ # we don't need because we parse the headers directly.
33
+ # @see http://sendgrid.com/docs/API_Reference/Webhooks/parse.html#-Character-Sets-and-Header-Decoding
24
34
  header params['headers']
25
35
 
26
- body params['text']
36
+ # The following are redundant with `headers`:
37
+ #
38
+ # from params['from']
39
+ # to params['to']
40
+ # cc params['cc']
41
+ # subject params['subject']
42
+
43
+ text_part do
44
+ body this.encode('text')
45
+ end
46
+
47
+ if params.key?('html')
48
+ html_part do
49
+ content_type 'text/html; charset=UTF-8'
50
+ body this.encode('html')
51
+ end
52
+ end
53
+
54
+ 1.upto(params['attachments'].to_i) do |n|
55
+ attachment = params["attachment#{n}"]
56
+ add_file(this.class.add_file_arguments(attachment))
57
+ end
58
+ end
27
59
 
28
- html_part do
29
- content_type 'text/html; charset=UTF-8'
30
- body params['html']
31
- end if params['html']
60
+ # Extra SendGrid parameters. Discard
61
+ %w(dkim SPF spam_report spam_score).each do |key|
62
+ message[key] = params[key]
63
+ end
64
+
65
+ # Discard `envelope`, which contains `to` and `from`, and the
66
+ # undocumented `attachment-info`.
67
+ [message]
68
+ end
32
69
 
33
- attachments.each do |attachment|
34
- add_file(attachment)
70
+ # Returns whether a message is spam.
71
+ #
72
+ # @param [Mail::Message] message a message
73
+ # @return [Boolean] whether the message is spam
74
+ def spam?(message)
75
+ message['spam_score'] && message['spam_score'].value.to_f > @spamassassin_threshold
76
+ end
77
+
78
+ def encode(key)
79
+ if @charsets.key?(key)
80
+ if @params[key].respond_to?(:force_encoding)
81
+ @params[key].force_encoding(@charsets[key]).encode('UTF-8')
82
+ else
83
+ Iconv.conv('UTF-8', @charsets[key], @params[key])
35
84
  end
85
+ else
86
+ @params[key]
36
87
  end
37
88
  end
38
89
  end
39
90
  end
40
91
  end
41
-
42
-
@@ -1,10 +1,71 @@
1
+ require 'multi_mail/sendgrid/message'
2
+
1
3
  module MultiMail
2
4
  module Sender
3
- class SendGrid < MultiMail::Service
4
- include MultiMail::Sender::base
5
+ # SendGrid's outgoing mail sender.
6
+ class SendGrid
7
+ include MultiMail::Sender::Base
8
+
9
+ # @see http://sendgrid.com/docs/API_Reference/Web_API/
10
+ requires :api_user, :api_key
5
11
 
12
+ # Initializes a SendGrid outgoing email sender.
13
+ #
14
+ # @param [Hash] options required and optional arguments
15
+ # @option options [String] :api_user a SendGrid API user
16
+ # @option options [String] :api_key a SendGrid API key
6
17
  def initialize(options = {})
7
18
  super
19
+ if Hash === settings[:'x-smtpapi']
20
+ settings[:'x-smtpapi'] = JSON.dump(settings[:'x-smtpapi'])
21
+ end
22
+ end
23
+
24
+ # Delivers a message via the SendGrid API.
25
+ #
26
+ # @param [Mail::Message] mail a message
27
+ # @see http://sendgrid.com/docs/API_Reference/Web_API/mail.html
28
+ def deliver!(mail)
29
+ parameters = settings.dup
30
+ parameters.delete(:return_response)
31
+ message = MultiMail::Message::SendGrid.new(mail).to_sendgrid_hash.merge(parameters)
32
+
33
+ connection = Faraday.new do |conn|
34
+ conn.request :multipart
35
+ conn.request :url_encoded
36
+ conn.adapter Faraday.default_adapter
37
+ end
38
+
39
+ response = connection.post('https://sendgrid.com/api/mail.send.json', message)
40
+
41
+ body = JSON.load(response.body)
42
+
43
+ unless response.status == 200
44
+ if body['message'] == 'error'
45
+ case body['errors']
46
+ when ['Bad username / password']
47
+ raise InvalidAPIKey, body['errors'].first
48
+ when ['Empty from email address (required)']
49
+ raise MissingSender, body['errors'].first
50
+ when ['Missing destination email']
51
+ raise MissingRecipients, body['errors'].first
52
+ when ['Missing subject']
53
+ raise MissingSubject, body['errors'].first
54
+ when ['Missing email body']
55
+ raise MissingBody, body['errors'].first
56
+ else
57
+ raise body['errors'].join
58
+ end
59
+ else
60
+ raise body['errors'].join
61
+ end
62
+ end
63
+
64
+ if settings[:return_response]
65
+ body
66
+ else
67
+ self
68
+ end
8
69
  end
9
70
  end
10
71
  end
@@ -2,71 +2,63 @@ module MultiMail
2
2
  # Interacts with email APIs to send or receive email.
3
3
  #
4
4
  # @see http://rdoc.info/gems/fog/Fog/Service
5
- class Service
6
- # Initializers an email API service.
5
+ module Service
6
+ # Appends the given arguments to the list of required arguments.
7
7
  #
8
- # @param [Hash] options optional arguments
9
- def initialize(options = {})
10
- self.class.validate_options(options)
8
+ # @param args one or more required arguments
9
+ # @see Fog::Service::requires
10
+ def requires(*args)
11
+ requirements.concat(args)
11
12
  end
12
13
 
13
- class << self
14
- # Appends the given arguments to the list of required arguments.
15
- #
16
- # @param args one or more required arguments
17
- # @see Fog::Service::requires
18
- def requires(*args)
19
- requirements.concat(args)
20
- end
14
+ # Returns the list of required arguments.
15
+ #
16
+ # @return [Array] a list of required arguments
17
+ # @see Fog::Service::requirements
18
+ def requirements
19
+ @requirements ||= []
20
+ end
21
21
 
22
- # Returns the list of required arguments.
23
- #
24
- # @return [Array] a list of required arguments
25
- # @see Fog::Service::requirements
26
- def requirements
27
- @requirements ||= []
28
- end
22
+ # Appends the given arguments to the list of optional arguments.
23
+ #
24
+ # @param args one or more optional arguments
25
+ # @see Fog::Service::recognizes
26
+ def recognizes(*args)
27
+ recognized.concat(args)
28
+ end
29
29
 
30
- # Appends the given arguments to the list of optional arguments.
31
- #
32
- # @param args one or more optional arguments
33
- # @see Fog::Service::recognizes
34
- def recognizes(*args)
35
- recognized.concat(args)
36
- end
30
+ # Returns the list of optional arguments.
31
+ #
32
+ # @return [Array] a list of optional arguments
33
+ # @see Fog::Service::recognized
34
+ def recognized
35
+ @recognized ||= []
36
+ end
37
37
 
38
- # Returns the list of optional arguments.
39
- #
40
- # @return [Array] a list of optional arguments
41
- # @see Fog::Service::recognized
42
- def recognized
43
- @recognized ||= []
38
+ # Ensures that required arguments are present and that optional arguments
39
+ # are recognized.
40
+ #
41
+ # @param [Hash] options arguments
42
+ # @raise [ArgumentError] if it can't find a required argument or can't
43
+ # recognize an optional argument
44
+ # @see Fog::Service::validate_options
45
+ def validate_options(options, raise_error_if_unrecognized = true)
46
+ keys = []
47
+ for key, value in options
48
+ unless value.nil?
49
+ keys << key
50
+ end
44
51
  end
45
52
 
46
- # Ensures that required arguments are present and that optional arguments
47
- # are recognized.
48
- #
49
- # @param [Hash] options arguments
50
- # @raise [ArgumentError] if it can't find a required argument or can't
51
- # recognize an optional argument
52
- # @see Fog::Service::validate_options
53
- def validate_options(options)
54
- keys = []
55
- for key, value in options
56
- unless value.nil?
57
- keys << key
58
- end
59
- end
60
- missing = requirements - keys
61
- unless missing.empty?
62
- raise ArgumentError, "Missing required arguments: #{missing.map(&:to_s).sort.join(', ')}"
63
- end
53
+ missing = requirements - keys
54
+ unless missing.empty?
55
+ raise ArgumentError, "Missing required arguments: #{missing.map(&:to_s).sort.join(', ')}"
56
+ end
64
57
 
65
- unless recognizes.empty?
66
- unrecognized = options.keys - requirements - recognized
67
- unless unrecognized.empty?
68
- raise ArgumentError, "Unrecognized arguments: #{unrecognized.map(&:to_s).sort.join(', ')}"
69
- end
58
+ if !recognizes.empty? && raise_error_if_unrecognized
59
+ unrecognized = options.keys - requirements - recognized
60
+ unless unrecognized.empty?
61
+ raise ArgumentError, "Unrecognized arguments: #{unrecognized.map(&:to_s).sort.join(', ')}"
70
62
  end
71
63
  end
72
64
  end
@@ -1,14 +1,14 @@
1
1
  module MultiMail
2
2
  module Receiver
3
- class Simple < MultiMail::Service
3
+ class Simple
4
4
  include MultiMail::Receiver::Base
5
- # Expects the value of the "message" query string parameter to be a raw
6
- # email message parsable by the Mail gem.
5
+
6
+ # Expects a raw email message parsable by the Mail gem.
7
7
  #
8
8
  # @param [Hash] params the content of the webhook
9
9
  # @return [Array<Mail::Message>] messages
10
10
  def transform(params)
11
- [Mail.new(params['message'])]
11
+ [Mail.new(params)]
12
12
  end
13
13
  end
14
14
  end
@@ -1,3 +1,3 @@
1
1
  module MultiMail
2
- VERSION = "0.0.2"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/multi_mail.rb CHANGED
@@ -2,7 +2,9 @@ require 'base64'
2
2
  require 'cgi'
3
3
  require 'json'
4
4
  require 'openssl'
5
+ require 'iconv' unless RUBY_VERSION >= '1.9'
5
6
 
7
+ require 'faraday'
6
8
  require 'mail'
7
9
  require 'multimap'
8
10
  require 'rack'
@@ -12,6 +14,19 @@ module MultiMail
12
14
  class Error < StandardError; end
13
15
  # Raise if an incoming POST request is forged.
14
16
  class ForgedRequest < MultiMail::Error; end
17
+ # Raise if an API key is invalid.
18
+ class InvalidAPIKey < MultiMail::Error; end
19
+
20
+ # Raise if a message is invalid.
21
+ class InvalidMessage < MultiMail::Error; end
22
+ # Raise if a message has no sender.
23
+ class MissingSender < InvalidMessage; end
24
+ # Raise if a message has no recipients.
25
+ class MissingRecipients < InvalidMessage; end
26
+ # Raise if a message has no subject.
27
+ class MissingSubject < InvalidMessage; end
28
+ # Raise if a message has no body.
29
+ class MissingBody < InvalidMessage; end
15
30
 
16
31
  class << self
17
32
  # @return [RegExp] a message whose subject matches this pattern will be
@@ -79,6 +94,6 @@ end
79
94
 
80
95
  require 'multi_mail/service'
81
96
  require 'multi_mail/receiver'
97
+ require 'multi_mail/message/base'
82
98
  require 'multi_mail/receiver/base'
83
- require 'multi_mail/sender'
84
99
  require 'multi_mail/sender/base'
data/multi_mail.gemspec CHANGED
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
16
  s.require_paths = ["lib"]
17
17
 
18
+ s.add_runtime_dependency 'faraday', '~> 0.8.0'
18
19
  s.add_runtime_dependency 'mail', '~> 2.5.3' # Rails 3.2.13, less buggy than 2.4.x
19
20
  s.add_runtime_dependency 'multimap', '~> 1.1.2'
20
21
  s.add_runtime_dependency 'rack', '~> 1.4'
@@ -24,9 +25,11 @@ Gem::Specification.new do |s|
24
25
  s.add_development_dependency 'json', '~> 1.7.7' # to silence coveralls warning
25
26
  s.add_development_dependency 'rake'
26
27
  s.add_development_dependency 'rspec', '~> 2.10'
28
+ s.add_development_dependency 'vcr', '~> 2.0'
27
29
 
28
30
  # For Rake tasks
29
- s.add_development_dependency 'mandrill-api', '~> 1.0.12'
31
+ s.add_development_dependency 'mandrill-api', '~> 1.0.35'
30
32
  s.add_development_dependency 'postmark'
31
33
  s.add_development_dependency 'rest-client', '~> 1.6.7'
34
+ s.add_development_dependency 'sendgrid_webapi'
32
35
  end
Binary file
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Length: 7575
3
+ Content-Type: application/x-www-form-urlencoded
4
+ X-Request-Start: 1368728762873
5
+ X-Forwarded-Proto: http
6
+ X-Forwarded-Port: 80
7
+ X-Forwarded-For: 198.61.253.119
8
+ User-Agent: Python-urllib/2.7
9
+ Host: rackbin.herokuapp.com
10
+ Connection: close
11
+ Version: HTTP/1.1
12
+
13
+ recipient=foo%2Bbar%40multimail.mailgun.org&sender=james%40opennorth.ca&subject=&from=James+McKinney+%3Cjames%40opennorth.ca%3E&Received=by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013+18%3A26%3A02+%2B0000&X-Envelope-From=%3Cjames%40opennorth.ca%3E&Received=from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29&Received=by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29&X-Google-Dkim-Signature=v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D&X-Received=by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29&Return-Path=%3Cjames%40opennorth.ca%3E&Received=from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29&From=James+McKinney+%3Cjames%40opennorth.ca%3E&Content-Type=text%2Fplain&Content-Transfer-Encoding=7bit&Subject=&Date=Thu%2C+16+May+2013+14%3A25%3A49+-0400&Message-Id=%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E&To=foo%2Bbar%40multimail.mailgun.org&Mime-Version=1.0+%28Apple+Message+framework+v1283%29&X-Mailer=Apple+Mail+%282.1283%29&X-Gm-Message-State=ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM&X-Mailgun-Sflag=No&X-Mailgun-Sscore=0.0&X-Mailgun-Spf=Neutral&X-Mailgun-Incoming=Yes&message-headers=%5B%5B%22Received%22%2C+%22by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013+18%3A26%3A02+%2B0000%22%5D%2C+%5B%22X-Envelope-From%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29%22%5D%2C+%5B%22Received%22%2C+%22by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%22%5D%2C+%5B%22X-Google-Dkim-Signature%22%2C+%22v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D%22%5D%2C+%5B%22X-Received%22%2C+%22by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%22%5D%2C+%5B%22Return-Path%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29%22%5D%2C+%5B%22From%22%2C+%22James+McKinney+%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Content-Type%22%2C+%22text%2Fplain%22%5D%2C+%5B%22Content-Transfer-Encoding%22%2C+%227bit%22%5D%2C+%5B%22Subject%22%2C+%22%22%5D%2C+%5B%22Date%22%2C+%22Thu%2C+16+May+2013+14%3A25%3A49+-0400%22%5D%2C+%5B%22Message-Id%22%2C+%22%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E%22%5D%2C+%5B%22To%22%2C+%22foo%2Bbar%40multimail.mailgun.org%22%5D%2C+%5B%22Mime-Version%22%2C+%221.0+%28Apple+Message+framework+v1283%29%22%5D%2C+%5B%22X-Mailer%22%2C+%22Apple+Mail+%282.1283%29%22%5D%2C+%5B%22X-Gm-Message-State%22%2C+%22ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM%22%5D%2C+%5B%22X-Mailgun-Sflag%22%2C+%22No%22%5D%2C+%5B%22X-Mailgun-Sscore%22%2C+%220.0%22%5D%2C+%5B%22X-Mailgun-Spf%22%2C+%22Neutral%22%5D%2C+%5B%22X-Mailgun-Incoming%22%2C+%22Yes%22%5D%5D&timestamp=1368728762&token=9re7ap1c3w2tl3p34059w2v7yqz0s-l59r1tv4akbt1il87qd2&signature=xxx&body-mime=Received%3A+by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013%0A+18%3A26%3A02+%2B0000%0D%0AX-Envelope-From%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com%0A+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B%0A+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29%0D%0AReceived%3A+by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%0D%0AX-Google-Dkim-Signature%3A+v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B%0A+s%3D20120113%3B%0A+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id%0A+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B%0A+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B%0A+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw%0A+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX%0A+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64%0A+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx%0A+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D%0D%0AX-Received%3A+by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B%0A+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%0D%0AReturn-Path%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with%0A+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA%0A+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29%0D%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0D%0AContent-Type%3A+text%2Fplain%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0ASubject%3A+%0D%0ADate%3A+Thu%2C+16+May+2013+14%3A25%3A49+-0400%0D%0AMessage-Id%3A+%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E%0D%0ATo%3A+foo%2Bbar%40multimail.mailgun.org%0D%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0D%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0D%0AX-Gm-Message-State%3A+ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM%0D%0AX-Mailgun-Sflag%3A+No%0D%0AX-Mailgun-Sscore%3A+0.0%0D%0AX-Mailgun-Spf%3A+Neutral%0D%0AX-Mailgun-Incoming%3A+Yes%0D%0A%0D%0A
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Length: 7575
3
+ Content-Type: application/x-www-form-urlencoded
4
+ X-Request-Start: 1368728762873
5
+ X-Forwarded-Proto: http
6
+ X-Forwarded-Port: 80
7
+ X-Forwarded-For: 198.61.253.119
8
+ User-Agent: Python-urllib/2.7
9
+ Host: rackbin.herokuapp.com
10
+ Connection: close
11
+ Version: HTTP/1.1
12
+
13
+ recipient=foo%2Bbar%40multimail.mailgun.org&sender=james%40opennorth.ca&subject=&from=James+McKinney+%3Cjames%40opennorth.ca%3E&Received=by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013+18%3A26%3A02+%2B0000&X-Envelope-From=%3Cjames%40opennorth.ca%3E&Received=from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29&Received=by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29&X-Google-Dkim-Signature=v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D&X-Received=by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29&Return-Path=%3Cjames%40opennorth.ca%3E&Received=from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29&From=James+McKinney+%3Cjames%40opennorth.ca%3E&Content-Type=text%2Fplain&Content-Transfer-Encoding=7bit&Subject=&Date=Thu%2C+16+May+2013+14%3A25%3A49+-0400&Message-Id=%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E&To=foo%2Bbar%40multimail.mailgun.org&Mime-Version=1.0+%28Apple+Message+framework+v1283%29&X-Mailer=Apple+Mail+%282.1283%29&X-Gm-Message-State=ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM&X-Mailgun-Sflag=No&X-Mailgun-Sscore=0.0&X-Mailgun-Spf=Neutral&X-Mailgun-Incoming=Yes&message-headers=%5B%5B%22Received%22%2C+%22by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013+18%3A26%3A02+%2B0000%22%5D%2C+%5B%22X-Envelope-From%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29%22%5D%2C+%5B%22Received%22%2C+%22by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%22%5D%2C+%5B%22X-Google-Dkim-Signature%22%2C+%22v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D%22%5D%2C+%5B%22X-Received%22%2C+%22by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%22%5D%2C+%5B%22Return-Path%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29%22%5D%2C+%5B%22From%22%2C+%22James+McKinney+%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Content-Type%22%2C+%22text%2Fplain%22%5D%2C+%5B%22Content-Transfer-Encoding%22%2C+%227bit%22%5D%2C+%5B%22Subject%22%2C+%22%22%5D%2C+%5B%22Date%22%2C+%22Thu%2C+16+May+2013+14%3A25%3A49+-0400%22%5D%2C+%5B%22Message-Id%22%2C+%22%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E%22%5D%2C+%5B%22To%22%2C+%22foo%2Bbar%40multimail.mailgun.org%22%5D%2C+%5B%22Mime-Version%22%2C+%221.0+%28Apple+Message+framework+v1283%29%22%5D%2C+%5B%22X-Mailer%22%2C+%22Apple+Mail+%282.1283%29%22%5D%2C+%5B%22X-Gm-Message-State%22%2C+%22ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM%22%5D%2C+%5B%22X-Mailgun-Sflag%22%2C+%22No%22%5D%2C+%5B%22X-Mailgun-Sscore%22%2C+%220.0%22%5D%2C+%5B%22X-Mailgun-Spf%22%2C+%22Neutral%22%5D%2C+%5B%22X-Mailgun-Incoming%22%2C+%22Yes%22%5D%5D&timestamp=1368728762&token=9re7ap1c3w2tl3p34059w2v7yqz0s-l59r1tv4akbt1il87qd2&body-mime=Received%3A+by+luna.mailgun.net+with+SMTP+mgrt+8742233976457%3B+Thu%2C+16+May+2013%0A+18%3A26%3A02+%2B0000%0D%0AX-Envelope-From%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+mail-ie0-f176.google.com+%28mail-ie0-f176.google.com%0A+%5B209.85.223.176%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b1.6324fb0-in1%3B%0A+Thu%2C+16+May+2013+18%3A25%3A53+-0000+%28UTC%29%0D%0AReceived%3A+by+mail-ie0-f176.google.com+with+SMTP+id+at1so7220895iec.35+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%0D%0AX-Google-Dkim-Signature%3A+v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B%0A+s%3D20120113%3B%0A+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id%0A+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B%0A+bh%3D47DEQpj8HBSa%2B%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B%0A+b%3DlBjUT6ywRw8lW1OGr5YqUZwSA6fjnu9sTtDqJ%2BRX9QxXE2b8qISzynqB5aieVHZMlw%0A+F7IiBZwxZcjTcXNGqaSZePmYfTeK7jYnHtPN3hSVYSdjEnJPweaNpTG8YEfW30MjTByX%0A+k4kl8s6Ne1YKM9spIFYo4w40iWRAqQm2GWlw7IZ2NwiBl4EfOYBL%2BgA%2BRyBoc0TM%2F%2F64%0A+T9Yhjffl1mp%2BcSDSAVcqrXfNs84%2FFwZqzyBSkvtledaLVGi23AJ6%2BY8bBBtN9ugYp4Tx%0A+HZvMwbFr0fHQFesJtfBwNCvXy3gk16illqbLFDHBw8CqZjMXBbL%2FOQwAX0zVzcSI1bEq+nmsw%3D%3D%0D%0AX-Received%3A+by+10.50.131.137+with+SMTP+id+om9mr381819igb.1.1368728752881%3B%0A+Thu%2C+16+May+2013+11%3A25%3A52+-0700+%28PDT%29%0D%0AReturn-Path%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with%0A+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.50+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA%0A+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A51+-0700+%28PDT%29%0D%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0D%0AContent-Type%3A+text%2Fplain%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0ASubject%3A+%0D%0ADate%3A+Thu%2C+16+May+2013+14%3A25%3A49+-0400%0D%0AMessage-Id%3A+%3CDD2D5E91-DC27-4DB1-8E9E-DC5767D35B53%40opennorth.ca%3E%0D%0ATo%3A+foo%2Bbar%40multimail.mailgun.org%0D%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0D%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0D%0AX-Gm-Message-State%3A+ALoCoQlaZGqu6QdEEydVPntY6%2FUZJzH7yUT7oE7uV%2FEvFn%2FXSZ4zMOT9owx5X3BXokYI9AyXtQiM%0D%0AX-Mailgun-Sflag%3A+No%0D%0AX-Mailgun-Sscore%3A+0.0%0D%0AX-Mailgun-Spf%3A+Neutral%0D%0AX-Mailgun-Incoming%3A+Yes%0D%0A%0D%0A
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Length: 7699
3
+ Content-Type: application/x-www-form-urlencoded
4
+ X-Request-Start: 1368728764084
5
+ X-Forwarded-Proto: http
6
+ X-Forwarded-Port: 80
7
+ X-Forwarded-For: 198.61.253.117
8
+ User-Agent: Python-urllib/2.7
9
+ Host: rackbin.herokuapp.com
10
+ Connection: close
11
+ Version: HTTP/1.1
12
+
13
+ recipient=foo%2Bbar%40multimail.mailgun.org&sender=james%40opennorth.ca&subject=&from=James+McKinney+%3Cjames%40opennorth.ca%3E&Received=by+luna.mailgun.net+with+SMTP+mgrt+8768977185541%3B+Thu%2C+16+May+2013+18%3A26%3A03+%2B0000&X-Envelope-From=%3Cjames%40opennorth.ca%3E&Received=from+mail-ia0-f174.google.com+%28mail-ia0-f174.google.com+%5B209.85.210.174%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b4.60f61f0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A56+-0000+%28UTC%29&Received=by+mail-ia0-f174.google.com+with+SMTP+id+r13so1992106iar.19+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29&X-Google-Dkim-Signature=v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3Did84uDPa9SMZAVd%2Bg2pYg3Hl9aPfnapoGlOygxrIuV4%3D%3B+b%3DKtPiOX7uzBJtnhdXzQDnhDooMHIiDmSO9L%2BYACP2GuyIZqyeG2jbrAtvfrN4ty0l8x+yKsLweIaf1HfciEbfgO7LNU5GcTozZT%2B%2B2VYOzEwDXLSLB8ei5oWJlACiR3u8C26%2BA3z+L4%2Fx9ODWtS2bnbkVlEYdpBgT2ZGZU4TCT7V5QinbE3UR2lbKQ6e098yn2cT3Ri4PxdYC+tg0boJ9sASbn7vyUZCbFcrts1UnG0fAP21CuTw%2BEtsT8saEArMnbwgubsYaD9lAwfXtx+iK7h4s9Vfjx%2BeMABLFigI9iI37Zt5MD1zKNnjoNW2HOdkx3ErYLEIjcBQXP5hNqCtBpc+mALg%3D%3D&X-Received=by+10.50.128.44+with+SMTP+id+nl12mr386515igb.0.1368728755786%3B+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29&Return-Path=%3Cjames%40opennorth.ca%3E&Received=from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.53+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A54+-0700+%28PDT%29&From=James+McKinney+%3Cjames%40opennorth.ca%3E&Content-Type=text%2Fplain%3B+charset%3D%22us-ascii%22&Content-Transfer-Encoding=7bit&Subject=&Date=Thu%2C+16+May+2013+14%3A25%3A53+-0400&Message-Id=%3C471C0153-45E9-409E-8BE0-C11DCECE8527%40opennorth.ca%3E&To=foo%2Bbar%40multimail.mailgun.org&Mime-Version=1.0+%28Apple+Message+framework+v1283%29&X-Mailer=Apple+Mail+%282.1283%29&X-Gm-Message-State=ALoCoQkHRHyVSpySptrwaD7DCna5bmlrZ5MZLbx9a0a2liuD1YqXkZhOAkyNmQStTxrRGUAqqweM&X-Mailgun-Sflag=No&X-Mailgun-Sscore=0.0&X-Mailgun-Spf=Neutral&X-Mailgun-Incoming=Yes&message-headers=%5B%5B%22Received%22%2C+%22by+luna.mailgun.net+with+SMTP+mgrt+8768977185541%3B+Thu%2C+16+May+2013+18%3A26%3A03+%2B0000%22%5D%2C+%5B%22X-Envelope-From%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+mail-ia0-f174.google.com+%28mail-ia0-f174.google.com+%5B209.85.210.174%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b4.60f61f0-in1%3B+Thu%2C+16+May+2013+18%3A25%3A56+-0000+%28UTC%29%22%5D%2C+%5B%22Received%22%2C+%22by+mail-ia0-f174.google.com+with+SMTP+id+r13so1992106iar.19+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29%22%5D%2C+%5B%22X-Google-Dkim-Signature%22%2C+%22v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3Did84uDPa9SMZAVd%2Bg2pYg3Hl9aPfnapoGlOygxrIuV4%3D%3B+b%3DKtPiOX7uzBJtnhdXzQDnhDooMHIiDmSO9L%2BYACP2GuyIZqyeG2jbrAtvfrN4ty0l8x+yKsLweIaf1HfciEbfgO7LNU5GcTozZT%2B%2B2VYOzEwDXLSLB8ei5oWJlACiR3u8C26%2BA3z+L4%2Fx9ODWtS2bnbkVlEYdpBgT2ZGZU4TCT7V5QinbE3UR2lbKQ6e098yn2cT3Ri4PxdYC+tg0boJ9sASbn7vyUZCbFcrts1UnG0fAP21CuTw%2BEtsT8saEArMnbwgubsYaD9lAwfXtx+iK7h4s9Vfjx%2BeMABLFigI9iI37Zt5MD1zKNnjoNW2HOdkx3ErYLEIjcBQXP5hNqCtBpc+mALg%3D%3D%22%5D%2C+%5B%22X-Received%22%2C+%22by+10.50.128.44+with+SMTP+id+nl12mr386515igb.0.1368728755786%3B+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29%22%5D%2C+%5B%22Return-Path%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.53+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A54+-0700+%28PDT%29%22%5D%2C+%5B%22From%22%2C+%22James+McKinney+%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Content-Type%22%2C+%22text%2Fplain%3B+charset%3D%5C%22us-ascii%5C%22%22%5D%2C+%5B%22Content-Transfer-Encoding%22%2C+%227bit%22%5D%2C+%5B%22Subject%22%2C+%22%22%5D%2C+%5B%22Date%22%2C+%22Thu%2C+16+May+2013+14%3A25%3A53+-0400%22%5D%2C+%5B%22Message-Id%22%2C+%22%3C471C0153-45E9-409E-8BE0-C11DCECE8527%40opennorth.ca%3E%22%5D%2C+%5B%22To%22%2C+%22foo%2Bbar%40multimail.mailgun.org%22%5D%2C+%5B%22Mime-Version%22%2C+%221.0+%28Apple+Message+framework+v1283%29%22%5D%2C+%5B%22X-Mailer%22%2C+%22Apple+Mail+%282.1283%29%22%5D%2C+%5B%22X-Gm-Message-State%22%2C+%22ALoCoQkHRHyVSpySptrwaD7DCna5bmlrZ5MZLbx9a0a2liuD1YqXkZhOAkyNmQStTxrRGUAqqweM%22%5D%2C+%5B%22X-Mailgun-Sflag%22%2C+%22No%22%5D%2C+%5B%22X-Mailgun-Sscore%22%2C+%220.0%22%5D%2C+%5B%22X-Mailgun-Spf%22%2C+%22Neutral%22%5D%2C+%5B%22X-Mailgun-Incoming%22%2C+%22Yes%22%5D%5D&timestamp=1368728763&token=9f4o7ro45ugsca3i48h4zg4itiixh0vh7qz8rpnuda3bdyc181&signature=53acdf9dd008679a3b33780b9693efa5ea659da67f48d78d2ecc28a1235e2c67&body-mime=Received%3A+by+luna.mailgun.net+with+SMTP+mgrt+8768977185541%3B+Thu%2C+16+May+2013%0A+18%3A26%3A03+%2B0000%0D%0AX-Envelope-From%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+mail-ia0-f174.google.com+%28mail-ia0-f174.google.com%0A+%5B209.85.210.174%5D%29+by+mxa.mailgun.org+with+ESMTP+id+519524b4.60f61f0-in1%3B%0A+Thu%2C+16+May+2013+18%3A25%3A56+-0000+%28UTC%29%0D%0AReceived%3A+by+mail-ia0-f174.google.com+with+SMTP+id+r13so1992106iar.19+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29%0D%0AX-Google-Dkim-Signature%3A+v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B%0A+s%3D20120113%3B%0A+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id%0A+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B%0A+bh%3Did84uDPa9SMZAVd%2Bg2pYg3Hl9aPfnapoGlOygxrIuV4%3D%3B%0A+b%3DKtPiOX7uzBJtnhdXzQDnhDooMHIiDmSO9L%2BYACP2GuyIZqyeG2jbrAtvfrN4ty0l8x%0A+yKsLweIaf1HfciEbfgO7LNU5GcTozZT%2B%2B2VYOzEwDXLSLB8ei5oWJlACiR3u8C26%2BA3z%0A+L4%2Fx9ODWtS2bnbkVlEYdpBgT2ZGZU4TCT7V5QinbE3UR2lbKQ6e098yn2cT3Ri4PxdYC%0A+tg0boJ9sASbn7vyUZCbFcrts1UnG0fAP21CuTw%2BEtsT8saEArMnbwgubsYaD9lAwfXtx%0A+iK7h4s9Vfjx%2BeMABLFigI9iI37Zt5MD1zKNnjoNW2HOdkx3ErYLEIjcBQXP5hNqCtBpc+mALg%3D%3D%0D%0AX-Received%3A+by+10.50.128.44+with+SMTP+id+nl12mr386515igb.0.1368728755786%3B%0A+Thu%2C+16+May+2013+11%3A25%3A55+-0700+%28PDT%29%0D%0AReturn-Path%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with%0A+ESMTPSA+id+d9sm5269077igr.4.2013.05.16.11.25.53+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA%0A+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A25%3A54+-0700+%28PDT%29%0D%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0D%0AContent-Type%3A+text%2Fplain%3B+charset%3D%22us-ascii%22%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0ASubject%3A+%0D%0ADate%3A+Thu%2C+16+May+2013+14%3A25%3A53+-0400%0D%0AMessage-Id%3A+%3C471C0153-45E9-409E-8BE0-C11DCECE8527%40opennorth.ca%3E%0D%0ATo%3A+foo%2Bbar%40multimail.mailgun.org%0D%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0D%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0D%0AX-Gm-Message-State%3A+ALoCoQkHRHyVSpySptrwaD7DCna5bmlrZ5MZLbx9a0a2liuD1YqXkZhOAkyNmQStTxrRGUAqqweM%0D%0AX-Mailgun-Sflag%3A+No%0D%0AX-Mailgun-Sscore%3A+0.0%0D%0AX-Mailgun-Spf%3A+Neutral%0D%0AX-Mailgun-Incoming%3A+Yes%0D%0A%0D%0AXJS%2AC4JDBQADN1.NSBN3%2A2IDNEN%2AGTUBE-STANDARD-ANTI-UBE-TEST-EMAIL%2AC.34X
@@ -0,0 +1,13 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Length: 11133
3
+ Content-Type: application/x-www-form-urlencoded
4
+ X-Request-Start: 1368728697065
5
+ X-Forwarded-Proto: http
6
+ X-Forwarded-Port: 80
7
+ X-Forwarded-For: 198.61.253.119
8
+ User-Agent: Python-urllib/2.7
9
+ Host: rackbin.herokuapp.com
10
+ Connection: close
11
+ Version: HTTP/1.1
12
+
13
+ recipient=foo%2Bbar%40multimail.mailgun.org&sender=james%40opennorth.ca&subject=Test&from=James+McKinney+%3Cjames%40opennorth.ca%3E&Received=by+luna.mailgun.net+with+SMTP+mgrt+8736253172409%3B+Thu%2C+16+May+2013+18%3A24%3A56+%2B0000&X-Envelope-From=%3Cjames%40opennorth.ca%3E&Received=from+mail-ia0-f181.google.com+%28mail-ia0-f181.google.com+%5B209.85.210.181%5D%29+by+mxa.mailgun.org+with+ESMTP+id+51952470.5508670-in1%3B+Thu%2C+16+May+2013+18%3A24%3A48+-0000+%28UTC%29&Received=by+mail-ia0-f181.google.com+with+SMTP+id+y25so3791913iay.40+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29&X-Google-Dkim-Signature=v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dx-received%3Afrom%3Acontent-type%3Asubject%3Adate%3Amessage-id%3Ato+%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3DnHFddTyry8jWu92HPsWcxea8gMgaxJXAbq%2BmcjOcjM0%3D%3B+b%3Do2rCiZFjV6gjurnIHGtUiavMLKk7AcyjPR0Ysa2DUZrkfErwzAzQCJVI1330GkxoiG+6pj3vrAI80wyk8PwQy5Lp0K3Jy%2BY0%2FiZxDav4hZIRWjmbuIeDfuAv9FcxWEfWMutD6af+GKMjc3DwgRsLkDx0u%2BWMgaH6FQ%2B%2FkU84YlYB%2B%2BN5PnAtv8f40PjicGVc0BPEbRAi64sW+e62zpoeMSHwF4oFX5WLn%2B5fKghT3IzOyoSACGhMa8AI3dFRxIfBL1NdTDqTIj%2Fkv%2BmWO+FseRRSKUck5BOGlmXNIyEGTN1xv%2Bt78lAcVuGTmf2Ky3gZsyMjn3y1U6Yer6ofitLOdb+%2Bamw%3D%3D&X-Received=by+10.42.30.8+with+SMTP+id+t8mr23963282icc.43.1368728688269%3B+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29&Return-Path=%3Cjames%40opennorth.ca%3E&Received=from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+o10sm5288167igh.2.2013.05.16.11.24.46+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A24%3A46+-0700+%28PDT%29&From=James+McKinney+%3Cjames%40opennorth.ca%3E&Content-Type=multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54%22&Subject=Test&Date=Mon%2C+15+Apr+2013+20%3A20%3A12+-0400&Message-Id=%3C99CF7D8C-FCD4-443F-8E04-69C4E470D18F%40opennorth.ca%3E&To=foo%2Bbar%40multimail.mailgun.org&Mime-Version=1.0+%28Apple+Message+framework+v1283%29&X-Mailer=Apple+Mail+%282.1283%29&X-Gm-Message-State=ALoCoQm%2FbhpTykjTryk%2ByHHQD2%2F%2ByEZqxOzTReRuZT8pwCujwlA21ICpGD8h3oL8BMMWyRVAjku4&X-Mailgun-Sflag=No&X-Mailgun-Sscore=0.0&X-Mailgun-Spf=Neutral&X-Mailgun-Incoming=Yes&message-headers=%5B%5B%22Received%22%2C+%22by+luna.mailgun.net+with+SMTP+mgrt+8736253172409%3B+Thu%2C+16+May+2013+18%3A24%3A56+%2B0000%22%5D%2C+%5B%22X-Envelope-From%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+mail-ia0-f181.google.com+%28mail-ia0-f181.google.com+%5B209.85.210.181%5D%29+by+mxa.mailgun.org+with+ESMTP+id+51952470.5508670-in1%3B+Thu%2C+16+May+2013+18%3A24%3A48+-0000+%28UTC%29%22%5D%2C+%5B%22Received%22%2C+%22by+mail-ia0-f181.google.com+with+SMTP+id+y25so3791913iay.40+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29%22%5D%2C+%5B%22X-Google-Dkim-Signature%22%2C+%22v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dx-received%3Afrom%3Acontent-type%3Asubject%3Adate%3Amessage-id%3Ato+%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3DnHFddTyry8jWu92HPsWcxea8gMgaxJXAbq%2BmcjOcjM0%3D%3B+b%3Do2rCiZFjV6gjurnIHGtUiavMLKk7AcyjPR0Ysa2DUZrkfErwzAzQCJVI1330GkxoiG+6pj3vrAI80wyk8PwQy5Lp0K3Jy%2BY0%2FiZxDav4hZIRWjmbuIeDfuAv9FcxWEfWMutD6af+GKMjc3DwgRsLkDx0u%2BWMgaH6FQ%2B%2FkU84YlYB%2B%2BN5PnAtv8f40PjicGVc0BPEbRAi64sW+e62zpoeMSHwF4oFX5WLn%2B5fKghT3IzOyoSACGhMa8AI3dFRxIfBL1NdTDqTIj%2Fkv%2BmWO+FseRRSKUck5BOGlmXNIyEGTN1xv%2Bt78lAcVuGTmf2Ky3gZsyMjn3y1U6Yer6ofitLOdb+%2Bamw%3D%3D%22%5D%2C+%5B%22X-Received%22%2C+%22by+10.42.30.8+with+SMTP+id+t8mr23963282icc.43.1368728688269%3B+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29%22%5D%2C+%5B%22Return-Path%22%2C+%22%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Received%22%2C+%22from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+o10sm5288167igh.2.2013.05.16.11.24.46+for+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A24%3A46+-0700+%28PDT%29%22%5D%2C+%5B%22From%22%2C+%22James+McKinney+%3Cjames%40opennorth.ca%3E%22%5D%2C+%5B%22Content-Type%22%2C+%22multipart%2Falternative%3B+boundary%3D%5C%22Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54%5C%22%22%5D%2C+%5B%22Subject%22%2C+%22Test%22%5D%2C+%5B%22Date%22%2C+%22Mon%2C+15+Apr+2013+20%3A20%3A12+-0400%22%5D%2C+%5B%22Message-Id%22%2C+%22%3C99CF7D8C-FCD4-443F-8E04-69C4E470D18F%40opennorth.ca%3E%22%5D%2C+%5B%22To%22%2C+%22foo%2Bbar%40multimail.mailgun.org%22%5D%2C+%5B%22Mime-Version%22%2C+%221.0+%28Apple+Message+framework+v1283%29%22%5D%2C+%5B%22X-Mailer%22%2C+%22Apple+Mail+%282.1283%29%22%5D%2C+%5B%22X-Gm-Message-State%22%2C+%22ALoCoQm%2FbhpTykjTryk%2ByHHQD2%2F%2ByEZqxOzTReRuZT8pwCujwlA21ICpGD8h3oL8BMMWyRVAjku4%22%5D%2C+%5B%22X-Mailgun-Sflag%22%2C+%22No%22%5D%2C+%5B%22X-Mailgun-Sscore%22%2C+%220.0%22%5D%2C+%5B%22X-Mailgun-Spf%22%2C+%22Neutral%22%5D%2C+%5B%22X-Mailgun-Incoming%22%2C+%22Yes%22%5D%5D&timestamp=1366071615&token=5o56tmpwd3dnwthehwclemd-i-7u2gv9vb3u745ywj67d0mc87&signature=bc2ab6c1080d52f2a06928b93f21e86c2d28c548e2ef64354f8ba1a95bb53cd6&body-mime=Received%3A+by+luna.mailgun.net+with+SMTP+mgrt+8736253172409%3B+Thu%2C+16+May+2013%0A+18%3A24%3A56+%2B0000%0D%0AX-Envelope-From%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+mail-ia0-f181.google.com+%28mail-ia0-f181.google.com%0A+%5B209.85.210.181%5D%29+by+mxa.mailgun.org+with+ESMTP+id+51952470.5508670-in1%3B%0A+Thu%2C+16+May+2013+18%3A24%3A48+-0000+%28UTC%29%0D%0AReceived%3A+by+mail-ia0-f181.google.com+with+SMTP+id+y25so3791913iay.40+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E%3B+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29%0D%0AX-Google-Dkim-Signature%3A+v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%2Frelaxed%3B+d%3Dgoogle.com%3B%0A+s%3D20120113%3B+h%3Dx-received%3Afrom%3Acontent-type%3Asubject%3Adate%3Amessage-id%3Ato%0A+%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B%0A+bh%3DnHFddTyry8jWu92HPsWcxea8gMgaxJXAbq%2BmcjOcjM0%3D%3B%0A+b%3Do2rCiZFjV6gjurnIHGtUiavMLKk7AcyjPR0Ysa2DUZrkfErwzAzQCJVI1330GkxoiG%0A+6pj3vrAI80wyk8PwQy5Lp0K3Jy%2BY0%2FiZxDav4hZIRWjmbuIeDfuAv9FcxWEfWMutD6af%0A+GKMjc3DwgRsLkDx0u%2BWMgaH6FQ%2B%2FkU84YlYB%2B%2BN5PnAtv8f40PjicGVc0BPEbRAi64sW%0A+e62zpoeMSHwF4oFX5WLn%2B5fKghT3IzOyoSACGhMa8AI3dFRxIfBL1NdTDqTIj%2Fkv%2BmWO%0A+FseRRSKUck5BOGlmXNIyEGTN1xv%2Bt78lAcVuGTmf2Ky3gZsyMjn3y1U6Yer6ofitLOdb+%2Bamw%3D%3D%0D%0AX-Received%3A+by+10.42.30.8+with+SMTP+id+t8mr23963282icc.43.1368728688269%3B%0A+Thu%2C+16+May+2013+11%3A24%3A48+-0700+%28PDT%29%0D%0AReturn-Path%3A+%3Cjames%40opennorth.ca%3E%0D%0AReceived%3A+from+%5B192.168.0.105%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with%0A+ESMTPSA+id+o10sm5288167igh.2.2013.05.16.11.24.46+for%0A+%3Cfoo%2Bbar%40multimail.mailgun.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA%0A+bits%3D128%2F128%29%3B+Thu%2C+16+May+2013+11%3A24%3A46+-0700+%28PDT%29%0D%0AFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%0D%0AContent-Type%3A+multipart%2Falternative%3B+boundary%3D%22Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54%22%0D%0ASubject%3A+Test%0D%0ADate%3A+Mon%2C+15+Apr+2013+20%3A20%3A12+-0400%0D%0AMessage-Id%3A+%3C99CF7D8C-FCD4-443F-8E04-69C4E470D18F%40opennorth.ca%3E%0D%0ATo%3A+foo%2Bbar%40multimail.mailgun.org%0D%0AMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%0D%0AX-Mailer%3A+Apple+Mail+%282.1283%29%0D%0AX-Gm-Message-State%3A+ALoCoQm%2FbhpTykjTryk%2ByHHQD2%2F%2ByEZqxOzTReRuZT8pwCujwlA21ICpGD8h3oL8BMMWyRVAjku4%0D%0AX-Mailgun-Sflag%3A+No%0D%0AX-Mailgun-Sscore%3A+0.0%0D%0AX-Mailgun-Spf%3A+Neutral%0D%0AX-Mailgun-Incoming%3A+Yes%0D%0A%0D%0A--Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0AContent-Type%3A+text%2Fplain%3B%0D%0A%09charset%3Dus-ascii%0D%0A%0D%0Abold+text%0D%0A%0D%0A%0D%0A%0D%0Asome+more+bold+text%0D%0A%0D%0A%0D%0A%0D%0Asome+italic+text%0D%0A%0D%0A%3E+multiline%0D%0A%3E+quoted%0D%0A%3E+text%0D%0A%0D%0A%0D%0A--%0D%0ASignature+block%0D%0A--Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54%0D%0AContent-Type%3A+multipart%2Fmixed%3B%0D%0A%09boundary%3D%22Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%22%0D%0A%0D%0A%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0AContent-Type%3A+text%2Fhtml%3B%0D%0A%09charset%3Dus-ascii%0D%0A%0D%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cb%3Ebold+text%3C%2Fb%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%0D%0AContent-Disposition%3A+attachment%3B%0D%0A%09filename%3Dfoo.txt%0D%0AContent-Type%3A+text%2Fplain%3B%0D%0A%09x-unix-mode%3D0644%3B%0D%0A%09name%3D%22foo.txt%22%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0A%0D%0ALorem+ipsum+dolor+sit+amet%2C+consectetur+adipiscing+elit.%0D%0A%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0AContent-Type%3A+text%2Fhtml%3B%0D%0A%09charset%3Dus-ascii%0D%0A%0D%0A%3Chtml%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Chead%3E%3C%2Fhead%3E%3Cbr%3E%3Cdiv%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3Esome+more+bold+text%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3E%3Cbr%3E%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3E%3C%2Fb%3E%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%0D%0AContent-Disposition%3A+attachment%3B%0D%0A%09filename%3Dbar.txt%0D%0AContent-Type%3A+text%2Fplain%3B%0D%0A%09x-unix-mode%3D0644%3B%0D%0A%09name%3D%22bar.txt%22%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0A%0D%0ANam+accumsan+euismod+eros+et+rhoncus.%0D%0A%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B%0D%0AContent-Transfer-Encoding%3A+7bit%0D%0AContent-Type%3A+text%2Fhtml%3B%0D%0A%09charset%3Dus-ascii%0D%0A%0D%0A%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody+style%3D%22word-wrap%3A+break-word%3B+-webkit-nbsp-mode%3A+space%3B+-webkit-line-break%3A+after-white-space%3B+%22%3E%3Cbr%3E%3Cdiv%3E%3Cb%3E%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3E%3Cspan+class%3D%22Apple-style-span%22+style%3D%22font-weight%3A+normal%3B+%22%3E%3Cbr%3E%3C%2Fspan%3E%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3E%3Cspan+class%3D%22Apple-style-span%22+style%3D%22font-weight%3A+normal%3B+%22%3E%3Ci%3Esome+italic+text%3C%2Fi%3E%3C%2Fspan%3E%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cb%3E%3Cspan+class%3D%22Apple-style-span%22+style%3D%22font-weight%3A+normal%3B+%22%3E%3Cbr%3E%3C%2Fspan%3E%3C%2Fb%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cblockquote+type%3D%22cite%22%3Emultiline%3C%2Fblockquote%3E%3Cblockquote+type%3D%22cite%22%3Equoted%3C%2Fblockquote%3E%3Cblockquote+type%3D%22cite%22%3Etext%3C%2Fblockquote%3E%3C%2Fdiv%3E%3Cdiv%3E%3Cbr%3E%3C%2Fdiv%3E%3Cdiv%3E--%3C%2Fdiv%3E%3Cdiv%3ESignature+block%3C%2Fdiv%3E%3C%2Fbody%3E%3C%2Fhtml%3E%0D%0A--Apple-Mail%3D_7A3447DB-E6A4-47CF-B623-0F2038F9E60B--%0D%0A%0D%0A--Apple-Mail%3D_38D81264-10EE-42AE-A4F5-12897E2F7C54--%0D%0A
@@ -0,0 +1,15 @@
1
+ HTTP/1.1 200 OK
2
+ Content-Length: 5617
3
+ Content-Type: application/x-www-form-urlencoded
4
+ X-Request-Start: 1369936696755
5
+ X-Mandrill-Signature: xxx
6
+ X-Forwarded-Proto: http
7
+ X-Forwarded-Port: 80
8
+ X-Forwarded-For: 54.214.68.124
9
+ User-Agent: Mandrill-Webhook/1.0
10
+ Host: rackbin.herokuapp.com
11
+ Connection: close
12
+ Accept: */*
13
+ Version: HTTP/1.1
14
+
15
+ mandrill_events=%5B%7B%22event%22%3A%22inbound%22%2C%22ts%22%3A1369936696%2C%22msg%22%3A%7B%22raw_msg%22%3A%22Received%3A+from+mail-ob0-f171.google.com+%28mail-ob0-f171.google.com+%5B209.85.214.171%5D%29%5Cn%5Ctby+ip-10-249-27-209+%28Postfix%29+with+ESMTPS+id+66C5FE1C0A4%5Cn%5Ctfor+%3Cfoo%2Bbar%40govkit.org%3E%3B+Thu%2C+30+May+2013+17%3A58%3A10+%2B0000+%28UTC%29%5CnReceived%3A+by+mail-ob0-f171.google.com+with+SMTP+id+dn14so1210143obc.30%5Cn++++++++for+%3Cfoo%2Bbar%40govkit.org%3E%3B+Thu%2C+30+May+2013+10%3A58%3A09+-0700+%28PDT%29%5CnX-Google-DKIM-Signature%3A+v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%5C%2Frelaxed%3B%5Cn++++++++d%3Dgoogle.com%3B+s%3D20120113%3B%5Cn++++++++h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id%5Cn+++++++++%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B%5Cn++++++++bh%3D47DEQpj8HBSa%2B%5C%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B%5Cn++++++++b%3DSI%5C%2FNChu8mdE7mo4NG4gR74brC4En4M26tu7iKicblvmWWfdqFxRskFnIy1UmifC4lj%5Cn+++++++++atcYSI8WYN4LkckUwNf1maqQqBx%2B2M%5C%2FCkSHpMtpqV2uhfd0bsP6Xr2U27Lq0Qc9UxhL1%5Cn+++++++++7gSdYaVUm53VN5cBUngV2zm%2BF5QIq4uIUFxWjmL%2B3CZKvo6CtIoZS0zMihEIfbB87tTw%5Cn+++++++++erhxwulc%5C%2FiA%5C%2FDlYhbftvmtMCPkAuJafUhabdg7vSHWw0l3R7CN1zcUpnNUdEZzwK9GsN%5Cn+++++++++B0WL3gbjWzk727mlk9k6ejKt5Z9whBeaJ8OVKMIZOn7nhdbiplOzXarSEwmhll7eDXUg%5Cn+++++++++fyQg%3D%3D%5CnX-Received%3A+by+10.60.37.133+with+SMTP+id+y5mr4562147oej.123.1369936689131%3B%5Cn++++++++Thu%2C+30+May+2013+10%3A58%3A09+-0700+%28PDT%29%5CnReceived%3A+from+%5B192.168.0.102%5D+%28%5B69.165.208.137%5D%29%5Cn++++++++by+mx.google.com+with+ESMTPSA+id+hv3sm43172948obb.7.2013.05.30.10.58.06%5Cn++++++++for+%3Cfoo%2Bbar%40govkit.org%3E%5Cn++++++++%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%5C%2F128%29%3B%5Cn++++++++Thu%2C+30+May+2013+10%3A58%3A07+-0700+%28PDT%29%5CnFrom%3A+James+McKinney+%3Cjames%40opennorth.ca%3E%5CnContent-Type%3A+text%5C%2Fplain%5CnContent-Transfer-Encoding%3A+7bit%5CnSubject%3A+%5CnDate%3A+Thu%2C+30+May+2013+13%3A58%3A05+-0400%5CnMessage-Id%3A+%3C5B2DAE74-CE00-4A73-B7C6-5AE4C2EAD5FE%40opennorth.ca%3E%5CnTo%3A+foo%2Bbar%40govkit.org%5CnMime-Version%3A+1.0+%28Apple+Message+framework+v1283%29%5CnX-Mailer%3A+Apple+Mail+%282.1283%29%5CnX-Gm-Message-State%3A+ALoCoQn70NOfOklBLwZZN9Xsgep5nMg6jpgOCNHvteto9%5C%2FjHIOYSq71BfRxC3H7CsevGw6ZhSS9h%22%2C%22headers%22%3A%7B%22Received%22%3A%5B%22from+mail-ob0-f171.google.com+%28mail-ob0-f171.google.com+%5B209.85.214.171%5D%29+by+ip-10-249-27-209+%28Postfix%29+with+ESMTPS+id+66C5FE1C0A4+for+%3Cfoo%2Bbar%40govkit.org%3E%3B+Thu%2C+30+May+2013+17%3A58%3A10+%2B0000+%28UTC%29%22%2C%22by+mail-ob0-f171.google.com+with+SMTP+id+dn14so1210143obc.30+for+%3Cfoo%2Bbar%40govkit.org%3E%3B+Thu%2C+30+May+2013+10%3A58%3A09+-0700+%28PDT%29%22%2C%22from+%5B192.168.0.102%5D+%28%5B69.165.208.137%5D%29+by+mx.google.com+with+ESMTPSA+id+hv3sm43172948obb.7.2013.05.30.10.58.06+for+%3Cfoo%2Bbar%40govkit.org%3E+%28version%3DTLSv1+cipher%3DRC4-SHA+bits%3D128%5C%2F128%29%3B+Thu%2C+30+May+2013+10%3A58%3A07+-0700+%28PDT%29%22%5D%2C%22X-Google-Dkim-Signature%22%3A%22v%3D1%3B+a%3Drsa-sha256%3B+c%3Drelaxed%5C%2Frelaxed%3B+d%3Dgoogle.com%3B+s%3D20120113%3B+h%3Dfrom%3Acontent-type%3Acontent-transfer-encoding%3Asubject%3Adate%3Amessage-id+%3Ato%3Amime-version%3Ax-mailer%3Ax-gm-message-state%3B+bh%3D47DEQpj8HBSa%2B%5C%2FTImW%2B5JCeuQeRkm5NMpJWZG3hSuFU%3D%3B+b%3DSI%5C%2FNChu8mdE7mo4NG4gR74brC4En4M26tu7iKicblvmWWfdqFxRskFnIy1UmifC4lj+atcYSI8WYN4LkckUwNf1maqQqBx%2B2M%5C%2FCkSHpMtpqV2uhfd0bsP6Xr2U27Lq0Qc9UxhL1+7gSdYaVUm53VN5cBUngV2zm%2BF5QIq4uIUFxWjmL%2B3CZKvo6CtIoZS0zMihEIfbB87tTw+erhxwulc%5C%2FiA%5C%2FDlYhbftvmtMCPkAuJafUhabdg7vSHWw0l3R7CN1zcUpnNUdEZzwK9GsN+B0WL3gbjWzk727mlk9k6ejKt5Z9whBeaJ8OVKMIZOn7nhdbiplOzXarSEwmhll7eDXUg+fyQg%3D%3D%22%2C%22X-Received%22%3A%22by+10.60.37.133+with+SMTP+id+y5mr4562147oej.123.1369936689131%3B+Thu%2C+30+May+2013+10%3A58%3A09+-0700+%28PDT%29%22%2C%22From%22%3A%22James+McKinney+%3Cjames%40opennorth.ca%3E%22%2C%22Content-Type%22%3A%22text%5C%2Fplain%22%2C%22Content-Transfer-Encoding%22%3A%227bit%22%2C%22Subject%22%3A%22%22%2C%22Date%22%3A%22Thu%2C+30+May+2013+13%3A58%3A05+-0400%22%2C%22Message-Id%22%3A%22%3C5B2DAE74-CE00-4A73-B7C6-5AE4C2EAD5FE%40opennorth.ca%3E%22%2C%22To%22%3A%22foo%2Bbar%40govkit.org%22%2C%22Mime-Version%22%3A%221.0+%28Apple+Message+framework+v1283%29%22%2C%22X-Mailer%22%3A%22Apple+Mail+%282.1283%29%22%2C%22X-Gm-Message-State%22%3A%22ALoCoQn70NOfOklBLwZZN9Xsgep5nMg6jpgOCNHvteto9%5C%2FjHIOYSq71BfRxC3H7CsevGw6ZhSS9h%22%7D%2C%22text%22%3Anull%2C%22text_flowed%22%3Afalse%2C%22from_email%22%3A%22james%40opennorth.ca%22%2C%22from_name%22%3A%22James+McKinney%22%2C%22to%22%3A%5B%5B%22foo%2Bbar%40govkit.org%22%2Cnull%5D%5D%2C%22subject%22%3A%22%22%2C%22spam_report%22%3A%7B%22score%22%3A1.6%2C%22matched_rules%22%3A%5B%7B%22name%22%3A%22RCVD_IN_DNSWL_LOW%22%2C%22score%22%3A-0.7%2C%22description%22%3A%22RBL%3A+Sender+listed+at+http%3A%5C%2F%5C%2Fwww.dnswl.org%5C%2F%2C+low%22%7D%2C%7B%22name%22%3Anull%2C%22score%22%3A0%2C%22description%22%3Anull%7D%2C%7B%22name%22%3A%22listed%22%2C%22score%22%3A0%2C%22description%22%3A%22in+list.dnswl.org%5D%22%7D%2C%7B%22name%22%3A%22EMPTY_MESSAGE%22%2C%22score%22%3A2.3%2C%22description%22%3A%22Message+appears+to+have+no+textual+parts+and+no%22%7D%2C%7B%22name%22%3A%22text%22%2C%22score%22%3A0%2C%22description%22%3Anull%7D%5D%7D%2C%22dkim%22%3A%7B%22signed%22%3Afalse%2C%22valid%22%3Afalse%7D%2C%22spf%22%3A%7B%22result%22%3A%22pass%22%2C%22detail%22%3A%22sender+SPF+authorized%22%7D%2C%22email%22%3A%22foo%2Bbar%40govkit.org%22%2C%22tags%22%3A%5B%5D%2C%22sender%22%3Anull%2C%22template%22%3Anull%7D%7D%5D