mailqun 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []