chain_mail 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.
@@ -0,0 +1,656 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2015 SendPulse
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'net/http'
18
+ require 'json'
19
+ require 'base64'
20
+
21
+
22
+ #
23
+ # Sendpulse REST API Ruby class
24
+ #
25
+ # Documentation
26
+ # https://login.sendpulse.com/manual/rest-api/
27
+ # https://sendpulse.com/api
28
+ #
29
+ class SendpulseApi
30
+
31
+ #
32
+ # Sendpulse API constructor
33
+ #
34
+ # @param [Fixnum] user_id
35
+ # @param [String] secret
36
+ # @param [String] protocol
37
+ # @param [String] token
38
+ # @raise [Exception]
39
+ #
40
+ def initialize(user_id, secret, protocol = 'https', token = '')
41
+ raise 'Empty ID or SECRET' if user_id.to_s.empty? || secret.to_s.empty?
42
+
43
+ @url = "#{protocol}://api.sendpulse.com"
44
+ @user_id = user_id
45
+ @secret = secret
46
+ @protocol = protocol
47
+ @refresh_token = 0
48
+ @token = token
49
+
50
+ if @token.nil? || @token.empty?
51
+ raise 'Could not connect to api, check your ID and SECRET' unless refresh_token
52
+ end
53
+
54
+ end
55
+
56
+ #
57
+ # Refresh token
58
+ #
59
+ # @return [Boolean]
60
+ #
61
+ def refresh_token
62
+ @refresh_token += 1
63
+
64
+ data = {
65
+ grant_type: 'client_credentials',
66
+ client_id: @user_id,
67
+ client_secret: @secret
68
+ }
69
+
70
+ request_data = send_request('oauth/access_token', 'POST', data, false)
71
+
72
+ if !request_data.nil? && request_data[:data]['access_token']
73
+ @token = request_data[:data]['access_token']
74
+ @refresh_token = 0
75
+ else
76
+ return false
77
+ end
78
+
79
+ true
80
+ end
81
+ private :refresh_token
82
+
83
+ #
84
+ # Get token
85
+ #
86
+ # @return [String]
87
+ #
88
+ def get_token
89
+ @token
90
+ end
91
+
92
+ #
93
+ # Get serialized string
94
+ #
95
+ # @param [Mixed] data
96
+ # @return [String]
97
+ #
98
+ def serialize(data)
99
+ JSON.generate(data)
100
+ end
101
+ private :serialize
102
+
103
+ #
104
+ # Get unserialized data
105
+ #
106
+ # @param [String] data
107
+ # @return [Mixed]
108
+ #
109
+ def unserialize(data)
110
+ JSON.parse(data)
111
+ end
112
+ private :unserialize
113
+
114
+ #
115
+ # Form and send request to API service
116
+ #
117
+ # @param [String] path
118
+ # @param [String] method
119
+ # @param [Hash] data
120
+ # @param [Boolean] use_token
121
+ # @return [Hash]
122
+ #
123
+ def send_request(path, method = 'GET', data = {}, use_token = true)
124
+
125
+ request_data = {}
126
+
127
+ uri = URI.parse("#{@url}/#{path}")
128
+
129
+ http = Net::HTTP.new(uri.host, uri.port)
130
+ http.use_ssl = true if @protocol == 'https'
131
+
132
+ token = {}
133
+ token.merge!( 'authorization' => "Bearer #{@token}" ) if use_token
134
+
135
+ case method
136
+ when 'POST'
137
+ request = Net::HTTP::Post.new(uri.request_uri, token)
138
+ request.set_form_data(data)
139
+ when 'PUT'
140
+ request = Net::HTTP::Put.new(uri.request_uri, token)
141
+ request.set_form_data(data)
142
+ when 'DELETE'
143
+ request = Net::HTTP::Delete.new(uri.request_uri, token)
144
+ request.set_form_data(data)
145
+ else
146
+ request = Net::HTTP::Get.new(uri.request_uri, token)
147
+ end
148
+
149
+ begin
150
+ response = http.request(request)
151
+ if response.code.to_i == 401 && @refresh_token == 0
152
+ refresh_token
153
+ return send_request(path, method, data, use_token)
154
+ else
155
+ request_data[:data] = JSON.parse(response.body)
156
+ request_data[:http_code] = response.code
157
+ end
158
+ rescue Exception => e
159
+ puts "Exception \n message: #{e.message} \n backtrace: #{e.backtrace}"
160
+ end
161
+
162
+ handle_result(request_data)
163
+ end
164
+ private :send_request
165
+
166
+ #
167
+ # Process results
168
+ #
169
+ # @param [String] custom_message
170
+ # @return [Hash]
171
+ #
172
+ def handle_error (custom_message = nil)
173
+ data = { is_error: true }
174
+ data[:message] = custom_message unless custom_message.nil?
175
+ data
176
+ end
177
+ private :handle_error
178
+
179
+ #
180
+ # Process errors
181
+ #
182
+ # @param [Hash] data
183
+ # @return [Hash]
184
+ #
185
+ def handle_result (data)
186
+ unless data[:http_code].to_i == 200
187
+ data[:is_error] = true
188
+ end
189
+ data
190
+ end
191
+ private :handle_result
192
+
193
+ #
194
+ # Create address book
195
+ #
196
+ # @param [String] book_name
197
+ # @return [Hash]
198
+ #
199
+ def create_address_book(book_name)
200
+ handle_error('Empty book name') if book_name.to_s.empty?
201
+ data = { bookName: book_name }
202
+ send_request('addressbooks', 'POST', data)
203
+ end
204
+
205
+ #
206
+ # Edit address book name
207
+ #
208
+ # @param [Fixnum] id
209
+ # @param [String] new_name
210
+ # @return [Hash]
211
+ #
212
+ def edit_address_book(id, new_name)
213
+ return handle_error('Empty new name or book id') if id.to_i <= 0 || new_name.to_s.empty?
214
+ data = { name: new_name }
215
+ send_request("addressbooks/#{id}", 'PUT', data)
216
+ end
217
+
218
+ #
219
+ # Remove address book
220
+ #
221
+ # @param [Fixnum] id
222
+ # @return [Hash]
223
+ #
224
+ def remove_address_book(id)
225
+ return handle_error('Empty book id') unless id.to_i > 0
226
+ send_request("addressbooks/#{id}", 'DELETE')
227
+ end
228
+
229
+ #
230
+ # Get list of address books
231
+ #
232
+ # @param [Fixnum] limit
233
+ # @param [Fixnum] offset
234
+ # @return [Hash]
235
+ #
236
+ def list_address_books(limit = nil, offset = nil)
237
+ data = {}
238
+ data.merge!({limit: limit}) unless limit.nil?
239
+ data.merge!({offset: offset}) unless offset.nil?
240
+ send_request('addressbooks', 'GET', data)
241
+ end
242
+
243
+ #
244
+ # Get information about book
245
+ #
246
+ # @param [Fixnum] id
247
+ # @return [Hash]
248
+ #
249
+ def get_book_info(id)
250
+ return handle_error('Empty book id') unless id.to_i > 0
251
+ send_request("addressbooks/#{id}")
252
+ end
253
+
254
+ #
255
+ # List email addresses from book
256
+ #
257
+ # @param [Fixnum] id
258
+ # @return [Hash]
259
+ #
260
+ def get_emails_from_book(id)
261
+ return handle_error('Empty book id') unless id.to_i > 0
262
+ send_request("addressbooks/#{id}/emails")
263
+ end
264
+
265
+ #
266
+ # Add new emails to address book
267
+ #
268
+ # @param [Fixnum] book_id
269
+ # @param [Hash] emails
270
+ # @return [Hash]
271
+ #
272
+ def add_emails(book_id, emails)
273
+ return handle_error('Empty book id or emails') if book_id.to_i <= 0 || emails.empty?
274
+ data = { emails: serialize(emails) }
275
+ send_request("addressbooks/#{book_id}/emails", 'POST', data)
276
+ end
277
+
278
+ #
279
+ # Remove email addresses from book
280
+ #
281
+ # @param [Fixnum] book_id
282
+ # @param [Hash] emails
283
+ # @return [Hash]
284
+ #
285
+ def remove_emails(book_id, emails)
286
+ return handle_error('Empty book id or emails') if book_id.to_i <= 0 || emails.empty?
287
+ data = { emails: serialize(emails) }
288
+ send_request("addressbooks/#{book_id}/emails", 'DELETE', data)
289
+ end
290
+
291
+ #
292
+ # Get information about email address from book
293
+ #
294
+ # @param [Fixnum] book_id
295
+ # @param [String] email
296
+ # @return [Hash]
297
+ #
298
+ def get_email_info(book_id, email)
299
+ return handle_error('Empty book id or email') if book_id.to_i <= 0 || email.to_s.empty?
300
+ send_request("addressbooks/#{book_id}/emails/#{email}")
301
+ end
302
+
303
+ #
304
+ # Get cost of campaign based on address book
305
+ #
306
+ # @param [Fixnum] book_id
307
+ # @return [Hash]
308
+ #
309
+ def campaign_cost(book_id)
310
+ return handle_error('Empty book id') unless book_id.to_i > 0
311
+ send_request("addressbooks/#{book_id}/cost")
312
+ end
313
+
314
+ #
315
+ # Get list of campaigns
316
+ #
317
+ # @param [Fixnum] limit
318
+ # @param [Fixnum] offset
319
+ # @return [Hash]
320
+ #
321
+ def list_campaigns(limit = nil, offset = nil)
322
+ data = {}
323
+ data.merge!({limit: limit}) unless limit.nil?
324
+ data.merge!({offset: offset}) unless offset.nil?
325
+ send_request('campaigns', 'GET', data)
326
+ end
327
+
328
+ #
329
+ # Get information about campaign
330
+ #
331
+ # @param [Fixnum] id
332
+ # @return [Hash]
333
+ #
334
+ def get_campaign_info(id)
335
+ return handle_error('Empty campaign id') unless id.to_i > 0
336
+ send_request("campaigns/#{id}")
337
+ end
338
+
339
+ #
340
+ # Get campaign statistic by countries
341
+ #
342
+ # @param [Fixnum] id
343
+ # @return [Hash]
344
+ #
345
+ def campaign_stat_by_countries(id)
346
+ return handle_error('Empty campaign id') unless id.to_i > 0
347
+ send_request("campaigns/#{id}/countries")
348
+ end
349
+
350
+ #
351
+ # Get campaign statistic by referrals
352
+ #
353
+ # @param [Fixnum] id
354
+ # @return [Hash]
355
+ #
356
+ def campaign_stat_by_referrals(id)
357
+ return handle_error('Empty campaign id') unless id.to_i > 0
358
+ send_request("campaigns/#{id}/referrals")
359
+ end
360
+
361
+ #
362
+ # Create new campaign
363
+ #
364
+ # @param [String] sender_name
365
+ # @param [String] sender_email
366
+ # @param [String] subject
367
+ # @param [String] body
368
+ # @param [Fixnum] book_id
369
+ # @param [String] name
370
+ # @param [String] attachments
371
+ # @return [Hash]
372
+ #
373
+ def create_campaign(sender_name, sender_email, subject, body, book_id, name = '', attachments = '')
374
+ if sender_name.empty? || sender_email.empty? || subject.empty? || body.empty? || book_id.to_i <= 0
375
+ return handle_error('Not all data.')
376
+ end
377
+ attachments = serialize(attachments) unless attachments.empty?
378
+ data = {
379
+ sender_name: sender_name,
380
+ sender_email: sender_email,
381
+ subject: subject,
382
+ body: Base64.encode64(body),
383
+ list_id: book_id,
384
+ name: name,
385
+ attachments: attachments
386
+ }
387
+ send_request('campaigns', 'POST', data)
388
+ end
389
+
390
+ #
391
+ # Cancel campaign
392
+ #
393
+ # @param [Fixnum] id
394
+ # @return [Hash]
395
+ #
396
+ def cancel_campaign(id)
397
+ return handle_error('Empty campaign id') unless id.to_i > 0
398
+ send_request("campaigns/#{id}", 'DELETE')
399
+ end
400
+
401
+ #
402
+ # List all senders
403
+ #
404
+ # @return [Hash]
405
+ #
406
+ def list_senders
407
+ send_request('senders')
408
+ end
409
+
410
+ #
411
+ # Cancel Add new sender
412
+ #
413
+ # @param [String] sender_name
414
+ # @param [String] sender_email
415
+ # @return [Hash]
416
+ #
417
+ def add_sender(sender_name, sender_email)
418
+ return handle_error('Empty book sender name or sender email') if sender_name.to_s.empty? || sender_email.to_s.empty?
419
+ data = {
420
+ email: sender_email,
421
+ name: sender_name
422
+ }
423
+ send_request('senders', 'POST', data)
424
+ end
425
+
426
+ #
427
+ # Remove sender
428
+ #
429
+ # @param [String] email
430
+ # @return [Hash]
431
+ #
432
+ def remove_sender(email)
433
+ return handle_error('Empty email') if email.to_s.empty?
434
+ data = { email: email }
435
+ send_request('senders', 'DELETE', data)
436
+ end
437
+
438
+ #
439
+ # Activate sender using code
440
+ #
441
+ # @param [String] email
442
+ # @param [String] code
443
+ # @return [Hash]
444
+ #
445
+ def activate_sender(email, code)
446
+ return handle_error('Empty email or activation code') if email.to_s.empty? || code.to_s.empty?
447
+ data = { code: code }
448
+ send_request("senders/#{email}/code", 'POST', data)
449
+ end
450
+
451
+ #
452
+ # Request mail with activation code
453
+ #
454
+ # @param [String] email
455
+ # @return [Hash]
456
+ #
457
+ def get_sender_activation_mail(email)
458
+ return handle_error('Empty email') if email.to_s.empty?
459
+ send_request("senders/#{email}/code")
460
+ end
461
+
462
+ #
463
+ # Get global information about email
464
+ #
465
+ # @param [String] email
466
+ # @return [Hash]
467
+ #
468
+ def get_email_global_info(email)
469
+ return handle_error('Empty email') if email.to_s.empty?
470
+ send_request("emails/#{email}")
471
+ end
472
+
473
+ #
474
+ # Remove email from all books
475
+ #
476
+ # @param [String] email
477
+ # @return [Hash]
478
+ #
479
+ def remove_email_from_all_books(email)
480
+ return handle_error('Empty email') if email.to_s.empty?
481
+ send_request("emails/#{email}", 'DELETE')
482
+ end
483
+
484
+ #
485
+ # Get email statistic by all campaigns
486
+ #
487
+ # @param [String] email
488
+ # @return [Hash]
489
+ #
490
+ def email_stat_by_campaigns(email)
491
+ return handle_error('Empty email') if email.to_s.empty?
492
+ send_request("emails/#{email}/campaigns")
493
+ end
494
+
495
+ #
496
+ # Get all emails from blacklist
497
+ #
498
+ # @return [Hash]
499
+ #
500
+ def get_black_list
501
+ send_request('blacklist')
502
+ end
503
+
504
+ #
505
+ # Add email to blacklist
506
+ #
507
+ # @param [String] emails
508
+ # @param [String] comment
509
+ # @return [Hash]
510
+ #
511
+ def add_to_black_list(emails, comment = '')
512
+ return handle_error('Empty emails') if emails.to_s.empty?
513
+ data = {
514
+ emails: Base64.encode64(emails),
515
+ comment: comment
516
+ }
517
+ send_request('blacklist', 'POST', data)
518
+ end
519
+
520
+ #
521
+ # Remove emails from blacklist
522
+ #
523
+ # @param [String] emails
524
+ # @return [Hash]
525
+ #
526
+ def remove_from_black_list(emails)
527
+ return handle_error('Empty emails') if emails.to_s.empty?
528
+ data = { emails: Base64.encode64(emails) }
529
+ send_request('blacklist', 'DELETE', data)
530
+ end
531
+
532
+ #
533
+ # Get balance
534
+ #
535
+ # @param [String] currency
536
+ # @return [Hash]
537
+ #
538
+ def get_balance(currency = '')
539
+ url = 'balance'
540
+ url += '/' + currency.to_s.upcase unless currency.empty?
541
+ send_request(url)
542
+ end
543
+
544
+ #
545
+ # SMTP: get list of emails
546
+ #
547
+ # @param [Fixnum] limit
548
+ # @param [Fixnum] offset
549
+ # @param [String] from_date
550
+ # @param [String] to_date
551
+ # @param [String] sender
552
+ # @param [String] recipient
553
+ # @return [Hash]
554
+ #
555
+ def smtp_list_emails(limit = 0, offset = 0, from_date = '', to_date = '', sender = '', recipient = '')
556
+ data = {
557
+ limit: limit,
558
+ offset: offset,
559
+ from_date: from_date,
560
+ to_date: to_date,
561
+ sender: sender,
562
+ recipient: recipient
563
+ }
564
+ send_request('/smtp/emails', 'GET', data)
565
+ end
566
+
567
+ #
568
+ # SMTP: add emails to unsubscribe list
569
+ #
570
+ # @param [Fixnum] id
571
+ # @return [Hash]
572
+ #
573
+ def smtp_get_email_info_by_id(id)
574
+ return handle_error('Empty id') if id.to_s.empty?
575
+ send_request("smtp/emails/#{id}")
576
+ end
577
+
578
+ #
579
+ # SMTP: remove emails from unsubscribe list
580
+ #
581
+ # @param [Hash] emails
582
+ # @return [Hash]
583
+ #
584
+ def smtp_unsubscribe_emails(emails)
585
+ return handle_error('Empty emails') if emails.empty?
586
+ data = { emails: serialize(emails) }
587
+ send_request('smtp/unsubscribe', 'POST', data)
588
+ end
589
+
590
+ #
591
+ # SMTP: remove emails from unsubscribe list
592
+ #
593
+ # @param [Hash] emails
594
+ # @return [Hash]
595
+ #
596
+ def smtp_remove_from_unsubscribe(emails)
597
+ return handle_error('Empty emails') if emails.empty?
598
+ data = { emails: serialize(emails) }
599
+ send_request('smtp/unsubscribe', 'DELETE', data)
600
+ end
601
+
602
+ #
603
+ # SMTP: get list of IP
604
+ #
605
+ # @return [Hash]
606
+ #
607
+ def smtp_list_ip
608
+ send_request('smtp/ips')
609
+ end
610
+
611
+ #
612
+ # SMTP: get list of allowed domains
613
+ #
614
+ # @return [Hash]
615
+ #
616
+ def smtp_list_allowed_domains
617
+ send_request('smtp/domains')
618
+ end
619
+
620
+ #
621
+ # SMTP: add new domain
622
+ #
623
+ # @param [String] email
624
+ # @return [Hash]
625
+ #
626
+ def smtp_add_domain(email)
627
+ return handle_error('Empty email') if email.to_s.empty?
628
+ data = { email: email }
629
+ send_request('smtp/domains', 'POST', data)
630
+ end
631
+
632
+ #
633
+ # SMTP: verify domain
634
+ #
635
+ # @param [String] email
636
+ # @return [Hash]
637
+ #
638
+ def smtp_verify_domain(email)
639
+ return handle_error('Empty email') if email.to_s.empty?
640
+ send_request("smtp/domains/#{email}")
641
+ end
642
+
643
+ #
644
+ # SMTP: send mail
645
+ #
646
+ # @param [Hash] email
647
+ # @return [Hash]
648
+ #
649
+ def smtp_send_mail(email)
650
+ return handle_error('Empty email') if email.empty?
651
+ email[:html] = Base64.encode64(email[:html])
652
+ data = { email: serialize(email) }
653
+ send_request('smtp/emails', 'POST', data)
654
+ end
655
+
656
+ end