blastengine 0.4.1 → 0.5.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5446dc5334db835f92acb44be743dff7de15fbadfea05ee17b31ee24a00839d0
4
- data.tar.gz: eaec75b620b64061ad33149270cdb6a806903b0b621dad49a3dd9f8470deda7b
3
+ metadata.gz: 02bc35ccd669b289c2a0f988b9b45eb234b340ebe56f95f24b8428774edefa65
4
+ data.tar.gz: 9311a00bbbd6b704f5dcb7317ad80122606326519c4a929ba484f026a17e3e4f
5
5
  SHA512:
6
- metadata.gz: f912a678d09587f36aa4bec4ca6c62f672d6c8d12052ed3201c113312a2d4c91e0caffea70af8b52ec5eb10424e16efbcbe575bd80da3ba92482f926281218c0
7
- data.tar.gz: 76deb185bb188795754903c55ee71fa61c168728fcf19114560f3a7dc7255e80dc5f8c3730ea60d8978640bff0756eedbe84b40392b0e2a82d4f93b9486de695
6
+ metadata.gz: 43416c93510d316fff59df714bc0e086539989d227691875fe34dc6579786d18ae85dc34c01db07065ab214d0ce9ad2b96a097b61ea626c2d7538c915fc1225c
7
+ data.tar.gz: 4e25b0934cf68ea34f62b6a671f2d79db388e50a1fbf47e0de4337a616363f57df8d15a9b277571c491bf964a00b71e87d248f5af71a68b53943cf62e9d6a1b1
data/README.md CHANGED
@@ -28,13 +28,71 @@ APIキーとユーザー名はblastengineのサイトで取得してください
28
28
  client = Blastengine.initialize api_key: "API_KEY", user_name: "YOUR_USER_NAME"
29
29
  ```
30
30
 
31
+ ### メール送信
32
+
33
+ ```ruby
34
+ mail = Blastengine::Mail.new
35
+ mail.from email: "admin@example.com", name: "Administrator"
36
+ mail.addTo email: config["to"], insert_code: { name1: "name 1" }
37
+ mail.subject = "Test email"
38
+ mail.text_part = "This is a test email __name1__"
39
+ mail.html_part = "<html><body>This is a test email __name1__</body></html>"
40
+ mail.attachments << "README.md"
41
+ bol = mail.send
42
+ expect(bol).to be true
43
+ delivery_id = mail.delivery_id
44
+ expect(delivery_id).to be_an(Integer)
45
+ ```
46
+
47
+ 送信先は制限なく登録できます。
48
+
49
+ ```ruby
50
+ mail = Blastengine::Mail.new
51
+ mail.from email: "admin@example.com", name: "Administrator"
52
+ 10000.times do |i|
53
+ mail.addTo email: "bulk#{i}@example.jp", insert_code: { name1: "name #{i}" }
54
+ end
55
+ mail.subject = "Test email"
56
+ mail.text_part = "This is a test email __name1__"
57
+ mail.html_part = "<html><body>This is a test email __name1__</body></html>"
58
+ mail.attachments << "README.md"
59
+ bol = mail.send
60
+ expect(bol).to be true
61
+ delivery_id = mail.delivery_id
62
+ expect(delivery_id).to be_an(Integer)
63
+ ```
64
+
65
+ ### メール検索
66
+
67
+ ```ruby
68
+ params = {
69
+ "delivery_start": Time.now - 60 * 60 * 24 * 30,
70
+ "delivery_end": Time.now,
71
+ "delivery_type": ["BULK"],
72
+ "status": ["EDIT", "SENT"]
73
+ }
74
+ ary = Blastengine::Mail.find params
75
+ ary[0].delivery_type # BULK
76
+ ary[0].status # SENT
77
+ ```
78
+
79
+ ### 配信ログ検索
80
+
81
+ ```ruby
82
+ params = {
83
+ "delivery_type": ["BULK"],
84
+ "status": ["EDIT", "SENT"]
85
+ }
86
+ ary = Blastengine::Log.find params
87
+ ```
88
+
31
89
  ### トランザクションメール
32
90
 
33
91
  #### テキストメール
34
92
 
35
93
  ```ruby
36
94
  transaction = Blastengine::Transaction.new
37
- transaction.from "admin@example.com", "Administrator"
95
+ transaction.from email: "admin@example.com", name: "Administrator"
38
96
  transaction.to = "user@example.jp"
39
97
  transaction.subject = "Test subject"
40
98
  transaction.text_part = "This is a test email"
@@ -67,8 +125,8 @@ bulk.text_part = "This is a test email to __name__"
67
125
  bulk.register
68
126
 
69
127
  # Add address
70
- bulk.add "test1@example.jp", {name: "User 1"}
71
- bulk.add "test2@example.jp", {name: "User 2"}
128
+ bulk.addTo "test1@example.jp", {name: "User 1"}
129
+ bulk.addTo "test2@example.jp", {name: "User 2"}
72
130
  bulk.update
73
131
 
74
132
  # Send email immediately
@@ -1,9 +1,72 @@
1
+ require "date"
2
+
1
3
  module Blastengine
2
4
  class Base
3
5
  include Blastengine
4
6
  attr_accessor :delivery_id, :status, :delivery_time, :delivery_type, :open_count,
5
7
  :created_time, :updated_time, :hard_error_count, :soft_error_count, :drop_count, :sent_count, :total_count
6
8
 
9
+ def self.client
10
+ base = Base.new
11
+ base.client
12
+ end
13
+
14
+ def client
15
+ @@client
16
+ end
17
+
18
+ def sets(params)
19
+ params.each do |key, value|
20
+ self.set(key, value)
21
+ end
22
+ end
23
+
24
+ def set(key, value)
25
+ case key
26
+ when "delivery_id"
27
+ @delivery_id = value
28
+ when "status"
29
+ @status = value
30
+ when "delivery_time"
31
+ @delivery_time = Date.parse(value) if value != nil
32
+ when "delivery_type"
33
+ @delivery_type = value
34
+ when "open_count"
35
+ @open_count = value
36
+ when "created_time"
37
+ @created_time = Date.parse(value) if value != nil
38
+ when "updated_time"
39
+ @updated_time = Date.parse(value) if value != nil
40
+ when "hard_error_count"
41
+ @hard_error_count = value
42
+ when "soft_error_count"
43
+ @soft_error_count = value
44
+ when "drop_count"
45
+ @drop_count = value
46
+ when "sent_count"
47
+ @sent_count = value
48
+ when "total_count"
49
+ @total_count = value
50
+ when "from"
51
+ @_from = value
52
+ when "reservation_time"
53
+ @reservation_time = Date.parse(value) if value != nil
54
+ when "maillog_id"
55
+ @maillog_id = value
56
+ when "email"
57
+ @to = value
58
+ when "last_response_code"
59
+ @last_response_code = value
60
+ when "last_response_message"
61
+ @last_response_message = value
62
+ when "subject"
63
+ @subject = value
64
+ when "open_time"
65
+ @open_time = Date.parse(value) if value != nil
66
+ end
67
+ self
68
+ end
69
+
7
70
  def get
8
71
  # APIリクエスト用のパス
9
72
  path = "/deliveries/#{@delivery_id}"
@@ -1,4 +1,7 @@
1
1
  require "time"
2
+ require "tempfile"
3
+ require "csv"
4
+ require "date"
2
5
 
3
6
  module Blastengine
4
7
  class Bulk < Base
@@ -40,7 +43,7 @@ module Blastengine
40
43
  #
41
44
  # 受信者の追加
42
45
  #
43
- def add(email, params = {})
46
+ def addTo(email, params = {})
44
47
  @to << {
45
48
  email: email,
46
49
  insert_code: params.map{|key, value| {
@@ -54,6 +57,14 @@ module Blastengine
54
57
  # バルクメールの更新
55
58
  #
56
59
  def update
60
+ if @to.size > 50
61
+ return self.csv_update
62
+ else
63
+ return self.normal_update
64
+ end
65
+ end
66
+
67
+ def normal_update
57
68
  # APIリクエスト用のパス
58
69
  path = "/deliveries/bulk/update/#{@delivery_id}"
59
70
  data = {
@@ -69,6 +80,36 @@ module Blastengine
69
80
  return res["delivery_id"]
70
81
  end
71
82
 
83
+ def csv_update
84
+ f = Tempfile.create(['blastengine', '.csv'])
85
+ f.close
86
+ csv = CSV.open(f.path, "w")
87
+ # ヘッダーの作成
88
+ headers = ["email"]
89
+ @to.each do |to|
90
+ to[:insert_code].each do |insert_code|
91
+ headers << insert_code[:key] if headers.index(insert_code[:key]) == nil
92
+ end
93
+ end
94
+ csv.puts headers
95
+ @to.each do |to|
96
+ lines = [to[:email]]
97
+ headers.each do |header|
98
+ next if header == "email"
99
+ insert_code = to[:insert_code].find{|insert_code| insert_code[:key] == header}
100
+ lines << insert_code[:value] if insert_code != nil
101
+ end
102
+ csv.puts lines
103
+ end
104
+ csv.close
105
+ job = self.import f.path
106
+ while !job.finish?
107
+ sleep 1
108
+ end
109
+ File.unlink f.path
110
+ @delivery_id
111
+ end
112
+
72
113
  #
73
114
  # バルクメールの送信
74
115
  #
@@ -82,6 +123,7 @@ module Blastengine
82
123
  # API実行
83
124
  res = @@client.patch path, data
84
125
  # エラーがあったら例外を投げるので、この場合は通常終了
126
+ @delivery_id = res["delivery_id"]
85
127
  return res["delivery_id"]
86
128
  end
87
129
 
@@ -5,6 +5,7 @@ require "faraday"
5
5
  require "faraday/multipart"
6
6
  require "json"
7
7
  require "mini_mime"
8
+ require "date"
8
9
 
9
10
  #
10
11
  # Blastengine SDKのモジュール
@@ -1,3 +1,4 @@
1
+ require 'date'
1
2
  require "zip"
2
3
  require "tempfile"
3
4
 
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  module Blastengine
2
4
  class Email < Base
3
5
  include Blastengine
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  module Blastengine
2
4
  class Job < Download
3
5
  include Blastengine
@@ -0,0 +1,28 @@
1
+ require 'date'
2
+
3
+ module Blastengine
4
+ class Log < Base
5
+ include Blastengine
6
+ attr_accessor :cc, :bcc, :subject, :text_part, :encode, :html_part, :attachments, :delivery_id, :job
7
+
8
+ def self.from_hash(params)
9
+ log = Log.new
10
+ log.sets(params)
11
+ log
12
+ end
13
+
14
+ def self.find(params = {})
15
+ Hash[ params.map{|k,v| [k.to_sym, v] } ]
16
+ if params[:delivery_start] != nil
17
+ params[:delivery_start] = params[:delivery_start].iso8601
18
+ end
19
+ if params[:delivery_end] != nil
20
+ params[:delivery_end] = params[:delivery_end].iso8601
21
+ end
22
+ query_string = URI.encode_www_form(params)
23
+ url = "/logs/mails/results?#{query_string}";
24
+ res = Mail.client.get url
25
+ return res['data'].map {|params| Log.from_hash params }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,105 @@
1
+ require 'date'
2
+
3
+ module Blastengine
4
+ class Mail < Base
5
+ include Blastengine
6
+ attr_accessor :to, :cc, :bcc, :subject, :text_part, :encode, :html_part, :attachments, :delivery_id
7
+ def initialize
8
+ @to = []
9
+ @cc = []
10
+ @bcc = []
11
+ @attachments = []
12
+ @encode = "UTF-8"
13
+ end
14
+
15
+ #
16
+ # 送信主の追加
17
+ #
18
+ def from(email:, name: "")
19
+ @_from = {email: email, name: name}
20
+ end
21
+
22
+ #
23
+ # 受信者の追加
24
+ #
25
+ def addTo(email:, insert_code: {})
26
+ @to << {
27
+ email: email,
28
+ insert_code: insert_code
29
+ }
30
+ end
31
+
32
+ def send(date = nil)
33
+ # CCまたはBCCがある場合はTransaction × Toの分
34
+ # Toが複数の場合はBulk、Toが1つの場合はTransaction
35
+ if @cc.size > 0 || @bcc.size > 0
36
+ # CCまたはBCCがある場合は、指定時刻送信はできない
37
+ raise "CC or BCC is not supported when sending at a specified time." if date != nil
38
+ raise "CC or BCC is not supported when sending to multiple recipients." if @to.size > 1
39
+ end
40
+ if date != nil || @to.size == 1
41
+ return self.sendTransaction();
42
+ end
43
+ return self.sendBulk(date)
44
+ end
45
+
46
+ def sendBulk(date = nil)
47
+ bulk = Bulk.new
48
+ bulk.from email: @_from[:email], name: @_from[:name]
49
+ bulk.subject = @subject
50
+ bulk.encode = @encode
51
+ bulk.text_part = @text_part
52
+ bulk.html_part = @html_part
53
+ if @attachments.size > 0
54
+ bulk.attachments = @attachments
55
+ end
56
+ bulk.register
57
+ @to.each do |to|
58
+ bulk.addTo(to[:email], to[:insert_code])
59
+ end
60
+ bulk.update
61
+ bulk.send date
62
+ @delivery_id = bulk.delivery_id
63
+ return true;
64
+ end
65
+
66
+ def sendTransaction
67
+ transaction = Transaction.new
68
+ transaction.from email: @_from[:email], name: @_from[:name]
69
+ transaction.subject = @subject
70
+ transaction.encode = @encode
71
+ transaction.text_part = @text_part
72
+ transaction.html_part = @html_part
73
+ transaction.to = @to[0][:email]
74
+ transaction.insert_code = @to[0][:insert_code] if @to[0][:insert_code].size > 0
75
+ transaction.cc = @cc if @cc.size > 0
76
+ transaction.bcc = @bcc if @bcc.size > 0
77
+ if @attachments.size > 0
78
+ transaction.attachments = @attachments
79
+ end
80
+ transaction.send
81
+ @delivery_id = transaction.delivery_id
82
+ return true;
83
+ end
84
+
85
+ def self.from_hash(params)
86
+ mail = params["delivery_type"] == "TRANSACTION" ? Transaction.new : Bulk.new
87
+ mail.sets(params);
88
+ mail
89
+ end
90
+
91
+ def self.find(params = {})
92
+ Hash[ params.map{|k,v| [k.to_sym, v] } ]
93
+ if params[:delivery_start] != nil
94
+ params[:delivery_start] = params[:delivery_start].iso8601
95
+ end
96
+ if params[:delivery_end] != nil
97
+ params[:delivery_end] = params[:delivery_end].iso8601
98
+ end
99
+ query_string = URI.encode_www_form(params)
100
+ url = "/deliveries?#{query_string}";
101
+ res = Mail.client.get url
102
+ return res['data'].map {|params| Mail.from_hash params }
103
+ end
104
+ end
105
+ end
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  module Blastengine
2
4
  class Report < Download
3
5
  include Blastengine
@@ -1,13 +1,16 @@
1
+ require 'date'
2
+
1
3
  module Blastengine
2
4
  class Transaction < Base
3
5
  include Blastengine
4
- attr_accessor :to, :cc, :bcc, :subject, :text_part, :encode, :html_part, :attachments
6
+ attr_accessor :to, :cc, :bcc, :subject, :text_part, :encode, :html_part, :attachments, :insert_code
5
7
  def initialize
6
8
  @to = ""
7
9
  @cc = []
8
10
  @bcc = []
9
11
  @attachments = []
10
12
  @encode = "UTF-8"
13
+ @insert_code = {}
11
14
  end
12
15
 
13
16
  #
@@ -35,9 +38,18 @@ module Blastengine
35
38
  }
36
39
  # HTMLパートがある場合は追加
37
40
  data[:html_part] = @html_part unless @html_part.nil?
41
+ if @insert_code != nil
42
+ data[:insert_code] = @insert_code.map do |key, value|
43
+ {
44
+ key: "__#{key}__",
45
+ value: value
46
+ }
47
+ end
48
+ end
38
49
  # API実行
39
50
  res = @@client.post path, data, @attachments
40
51
  # エラーがあったら例外を投げるので、この場合は通常終了
52
+ @delivery_id = res["delivery_id"]
41
53
  return res["delivery_id"]
42
54
  end
43
55
  end
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  module Blastengine
2
4
  class Usage < Base
3
5
  include Blastengine
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blastengine
4
- VERSION = "0.4.1"
4
+ VERSION = "0.5.1"
5
5
  end
data/lib/blastengine.rb CHANGED
@@ -10,6 +10,8 @@ require "blastengine/job"
10
10
  require "blastengine/usage"
11
11
  require "blastengine/email"
12
12
  require "blastengine/report"
13
+ require "blastengine/mail"
14
+ require "blastengine/log"
13
15
 
14
16
  module Blastengine
15
17
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blastengine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Atsushi Nakatsugawa
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-25 00:00:00.000000000 Z
11
+ date: 2023-07-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: This is a SDK for sending email by blastengine.
14
14
  email:
@@ -25,7 +25,6 @@ files:
25
25
  - LICENSE
26
26
  - README.md
27
27
  - Rakefile
28
- - blastengine.gemspec
29
28
  - lib/blastengine.rb
30
29
  - lib/blastengine/base.rb
31
30
  - lib/blastengine/bulk.rb
@@ -33,6 +32,8 @@ files:
33
32
  - lib/blastengine/download.rb
34
33
  - lib/blastengine/email.rb
35
34
  - lib/blastengine/job.rb
35
+ - lib/blastengine/log.rb
36
+ - lib/blastengine/mail.rb
36
37
  - lib/blastengine/report.rb
37
38
  - lib/blastengine/transaction.rb
38
39
  - lib/blastengine/usage.rb
@@ -60,7 +61,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
61
  - !ruby/object:Gem::Version
61
62
  version: '0'
62
63
  requirements: []
63
- rubygems_version: 3.3.7
64
+ rubygems_version: 3.4.9
64
65
  signing_key:
65
66
  specification_version: 4
66
67
  summary: SDK for sending email by blastengine
data/blastengine.gemspec DELETED
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/blastengine/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "blastengine"
7
- spec.version = Blastengine::VERSION
8
- spec.authors = ["Atsushi Nakatsugawa"]
9
- spec.email = ["atsushi@moongift.jp"]
10
-
11
- spec.summary = "SDK for sending email by blastengine"
12
- spec.description = "This is a SDK for sending email by blastengine."
13
- spec.homepage = "https://blastengine.jp/"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.6.0"
16
-
17
- # spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
18
-
19
- spec.metadata["homepage_uri"] = spec.homepage
20
- spec.metadata["source_code_uri"] = "https://github.com/blastengineMania/blastengine-ruby"
21
- spec.metadata["changelog_uri"] = "https://github.com/blastengineMania/blastengine-ruby/CHANGELOG.md"
22
-
23
- # Specify which files should be added to the gem when it is released.
24
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
26
- `git ls-files -z`.split("\x0").reject do |f|
27
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
28
- end
29
- end
30
- spec.bindir = "exe"
31
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
- spec.require_paths = ["lib"]
33
-
34
- # Uncomment to register a new dependency of your gem
35
- # spec.add_dependency "example-gem", "~> 1.0"
36
-
37
- # For more information and examples about making a new gem, check out our
38
- # guide at: https://bundler.io/guides/creating_gem.html
39
- end