mailqun 0.1.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/mailqun +198 -0
  3. metadata +61 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bd52c4bb04fc6ba851e6ebb6bcf33c8bd798810e
4
+ data.tar.gz: a9fa98a5782003419ffda122acc2d83c0c1061e1
5
+ SHA512:
6
+ metadata.gz: 1f1d853191de686a4a577b26371d72f8e919bfd83af3a8e2f47ed1be91bc86bb4f778417a228a16054f4534673f1c9304ad939b3cc9cae231e35ec3c4f18017d
7
+ data.tar.gz: 7a6a4243247dfd60e0a7e1d04ff5a61d2858f08720042ebbffc6cb21b440df98dcd6665a5a634e20f4c89d4e21ea5e7281f8aee7c8b8cce4251ff1f3584f1e8b
data/mailqun ADDED
@@ -0,0 +1,198 @@
1
+ #!/usr/bin/env ruby
2
+ require 'net/http'
3
+ require 'optparse'
4
+ require 'ostruct'
5
+ require 'json'
6
+ require 'colorize'
7
+
8
+ def load_env
9
+ @domain = ENV['MAILGUN_DOMAIN']
10
+ @secret = ENV['MAILGUN_SECRET']
11
+ end
12
+
13
+ def load_uri
14
+ if @query_type == 'view'
15
+ abort("Error: Where's the url, bro?") if @url.nil?
16
+ url = @url
17
+ elsif @query_type == 'bounces' and @address
18
+ url = "https://api.mailgun.net/v3/#{@domain}/#{@query_type}/#{@address}"
19
+ else
20
+ query = URI.encode_www_form(@options.to_h)
21
+ url = "https://api.mailgun.net/v3/#{@domain}/#{@query_type}?#{query}"
22
+ end
23
+ return URI(url)
24
+ end
25
+
26
+ def request uri
27
+ response = nil
28
+ Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http|
29
+ klass = Object.const_get("Net::HTTP::#{@verb.capitalize}")
30
+ request = klass.new uri.request_uri
31
+ request.basic_auth 'api', @secret
32
+ response = http.request request
33
+ end
34
+ return response
35
+ end
36
+
37
+ def get_json_response
38
+ response = request load_uri
39
+ unless response.kind_of? Net::HTTPSuccess
40
+ abort("Error: Response code was #{response.code}\n#{response.body}")
41
+ end
42
+ JSON.parse(response.body)
43
+ end
44
+
45
+ def get_filename filename
46
+ filename.gsub!(/^.*(\\|\/)/, '')
47
+ filename.gsub!(/[^0-9A-Za-z.\-]/, '_')
48
+ "#{filename.strip}_#{Time.now.to_i}.html"
49
+ end
50
+
51
+ def pretty_print_event_item item
52
+ event = item['event'].upcase
53
+ pretty_line = "#{Time.at(item['timestamp'])}: [#{event}]"
54
+ pretty_line = "#{pretty_line}\t[#{item['tags'].join(',')}]";
55
+ pretty_line = "#{pretty_line} #{item['message']['headers']['to']}"
56
+
57
+ if event == 'FAILED'
58
+ pretty_line = "#{pretty_line}\t- #{item['delivery-status']['code']}"\
59
+ " - #{item['delivery-status']['description']}"
60
+ puts "#{pretty_line}".red
61
+ elsif ['DELIVERED', 'OPENED'].include? event
62
+ puts "#{pretty_line}".green
63
+ else
64
+ puts "#{pretty_line}"
65
+ end
66
+ end
67
+
68
+ def pretty_print_bounce_item item
69
+ pretty_line = "#{item['created_at']}: #{item['address']}"
70
+ pretty_line = "#{pretty_line}\t- #{item['error'].red}";
71
+
72
+ puts "#{pretty_line}"
73
+ end
74
+
75
+ def pretty_print_item item
76
+ if @query_type == 'bounces'
77
+ pretty_print_bounce_item item
78
+ else
79
+ pretty_print_event_item item
80
+ end
81
+ end
82
+
83
+ def pretty_print json_response
84
+ json_response['items'].each do |item|
85
+ pretty_print_item item
86
+ end
87
+ end
88
+
89
+ def handle_fetch json_response
90
+ if @options.pretty and !json_response['items'].nil?
91
+ pretty_print json_response
92
+ else
93
+ puts JSON.pretty_generate(json_response)
94
+ end
95
+ p @options.to_h
96
+ end
97
+
98
+ def handle_view json_response
99
+ filename = get_filename json_response['subject']
100
+ open("#{filename}", 'w') do |f|
101
+ f.puts json_response['body-html']
102
+ end
103
+ system "open #{filename}"
104
+ end
105
+
106
+ def build_output json_response
107
+ if @query_type == 'view'
108
+ handle_view json_response
109
+ else
110
+ handle_fetch json_response
111
+ end
112
+ end
113
+
114
+ @options = OpenStruct.new
115
+ @options.limit = 10
116
+ @options.pretty = true
117
+ @query_type = 'events'
118
+ @verb = 'GET'
119
+
120
+ OptionParser.new do |opts|
121
+ opts.banner = "Usage: mailqun [options]"
122
+
123
+ opts.separator ""
124
+ opts.separator "Common options:"
125
+
126
+ opts.on("-f [FROM]", "--from [FROM]", String,
127
+ "Address of the sender") do |f|
128
+ @options.from = f
129
+ end
130
+
131
+ opts.on("-t [TO]", "--to [TO]", String,
132
+ "Address of the receiver") do |t|
133
+ @options.to = t
134
+ end
135
+
136
+ opts.on("-s [SUBJECT]", "--subject [SUBJECT]", String,
137
+ "Subject of mail") do |s|
138
+ @options.subject = s
139
+ end
140
+
141
+ opts.on("-l [LIMIT]", "--limit [LIMIT]", Integer,
142
+ "Limit on number of results") do |l|
143
+ @options.limit = l
144
+ end
145
+
146
+ opts.on("--tags [TAG]", String,
147
+ "Value in X-Mailgun-Tag header") do |t|
148
+ @options.tags = t
149
+ end
150
+
151
+ opts.on("-e [EVENT]", "--event [EVENT]", String,
152
+ "Event being queried") do |e|
153
+ @options.event = e
154
+ end
155
+
156
+ opts.on("--raw",
157
+ "Gives raw json response, instead of summary") do |e|
158
+ @options.pretty = false
159
+ end
160
+
161
+ opts.separator ""
162
+ opts.separator "Bounce options:"
163
+
164
+ opts.on("--bounces",
165
+ "Add this option to query bounces instead of events") do |e|
166
+ @query_type = 'bounces'
167
+ end
168
+
169
+ opts.on("-a [ADDRESS]", "--address [ADDRESS]", String,
170
+ "Bounced address, used with --bounces") do |a|
171
+ if @query_type == 'bounces'
172
+ @address = a
173
+ end
174
+ end
175
+
176
+ opts.on("--delete [ADDRESS]", String,
177
+ "Delete address from bounces, used with --bounces") do |a|
178
+ if @query_type == 'bounces'
179
+ @address = a
180
+ @verb = 'DELETE'
181
+ end
182
+ end
183
+
184
+ opts.separator ""
185
+ opts.separator "View options:"
186
+
187
+ opts.on("--view-body [URL]",
188
+ "Mailgun storage URL to fetch email body from") do |u|
189
+ @url = u
190
+ @query_type = 'view'
191
+ end
192
+ end.parse!
193
+
194
+ load_env
195
+
196
+ json_response = get_json_response
197
+
198
+ build_output json_response
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mailqun
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Harman Singh
8
+ autorequire:
9
+ bindir: "."
10
+ cert_chain: []
11
+ date: 2017-11-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.8.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.8.1
27
+ description: Mailgun's website is stupid, so this script lets you query events from
28
+ commandline.
29
+ email:
30
+ - harman28@gmail.com
31
+ executables:
32
+ - mailqun
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - "./mailqun"
37
+ homepage: https://github.com/harman28/mailqun
38
+ licenses:
39
+ - MIT
40
+ metadata: {}
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - "."
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ requirements: []
56
+ rubyforge_project:
57
+ rubygems_version: 2.5.1
58
+ signing_key:
59
+ specification_version: 4
60
+ summary: Command line query tool for Mailgun, cos their website is rubbish.
61
+ test_files: []