mailtrap 1.1.1 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/Appraisals +9 -0
- data/CHANGELOG.md +17 -6
- data/Gemfile +1 -0
- data/Gemfile.lock +7 -1
- data/LICENSE.txt +1 -1
- data/README.md +24 -2
- data/lib/mailtrap/action_mailer/delivery_method.rb +1 -1
- data/lib/mailtrap/{sending/mail.rb → mail/base.rb} +10 -10
- data/lib/mailtrap/mail/from_template.rb +42 -0
- data/lib/mailtrap/mail.rb +88 -0
- data/lib/mailtrap/sending/client.rb +2 -1
- data/lib/mailtrap/sending.rb +0 -2
- data/lib/mailtrap/version.rb +1 -1
- data/lib/mailtrap.rb +1 -0
- data/mailtrap.gemspec +1 -1
- metadata +7 -5
- data/lib/mailtrap/sending/convert.rb +0 -83
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7dee4a202b02e16f840e8fc74526903e10418a0073c2392faf964dcdbcdfcde4
|
4
|
+
data.tar.gz: d35cf9fa125e8ec587f96626be7830f4398002173b7dc07c4560dddbbb0ddb3e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b4c0ba57ab2cab64cec15704bd34c04be134360a2600d2fc530bcae47ab8caf2e8dd79ce7ba5fd342e46dad599153d473006613c953da868182dcff2bb1e2be
|
7
|
+
data.tar.gz: 45d64a548b0cd54e0f98394a8c6739d1bc5dcd90716105100f7bae92f7aa5913c9ff66fde412d8965d3818bc7d6594c1c218d96cfcde59eabc6bd92c1901e2c3
|
data/.rubocop.yml
CHANGED
@@ -3,6 +3,8 @@ require: rubocop-rspec
|
|
3
3
|
AllCops:
|
4
4
|
TargetRubyVersion: 2.7
|
5
5
|
NewCops: enable
|
6
|
+
Exclude:
|
7
|
+
- 'gemfiles/**/*'
|
6
8
|
|
7
9
|
Layout/LineLength:
|
8
10
|
Max: 120
|
@@ -10,6 +12,9 @@ Layout/LineLength:
|
|
10
12
|
Naming/MethodParameterName:
|
11
13
|
MinNameLength: 2
|
12
14
|
|
15
|
+
Naming/VariableNumber:
|
16
|
+
EnforcedStyle: snake_case
|
17
|
+
|
13
18
|
RSpec/MultipleExpectations:
|
14
19
|
Max: 4
|
15
20
|
|
data/Appraisals
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,16 +1,27 @@
|
|
1
|
-
## [1.
|
1
|
+
## [1.2.1] - 2023-04-12
|
2
2
|
|
3
|
-
-
|
3
|
+
- Set custom user agent
|
4
4
|
|
5
|
-
## [1.0
|
5
|
+
## [1.2.0] - 2023-01-27
|
6
6
|
|
7
|
-
-
|
7
|
+
- Breaking changes:
|
8
|
+
- move `Mailtrap::Sending::Mail` class to `Mailtrap::Mail::Base`
|
9
|
+
- move `Mailtrap::Sending::Convert` to `Mailtrap::Mail`
|
10
|
+
- Add mail gem 2.8 support
|
11
|
+
- Add email template support
|
8
12
|
|
13
|
+
## [1.1.1] - 2022-10-14
|
14
|
+
|
15
|
+
- Fix custom port and host usage
|
9
16
|
|
10
17
|
## [1.1.0] - 2022-07-22
|
11
18
|
|
12
19
|
- Add ActionMailer support
|
13
20
|
|
14
|
-
## [1.
|
21
|
+
## [1.0.1] - 2022-06-20
|
15
22
|
|
16
|
-
-
|
23
|
+
- Update packed files list
|
24
|
+
|
25
|
+
## [1.0.0] - 2022-06-14
|
26
|
+
|
27
|
+
- Initial release
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,13 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
mailtrap (1.
|
4
|
+
mailtrap (1.2.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
addressable (2.8.0)
|
10
10
|
public_suffix (>= 2.0.2, < 5.0)
|
11
|
+
appraisal (2.4.1)
|
12
|
+
bundler
|
13
|
+
rake
|
14
|
+
thor (>= 0.14.0)
|
11
15
|
ast (2.4.2)
|
12
16
|
crack (0.4.5)
|
13
17
|
rexml
|
@@ -55,6 +59,7 @@ GEM
|
|
55
59
|
rubocop-rspec (2.11.1)
|
56
60
|
rubocop (~> 1.19)
|
57
61
|
ruby-progressbar (1.11.0)
|
62
|
+
thor (1.2.1)
|
58
63
|
unicode-display_width (2.1.0)
|
59
64
|
vcr (6.1.0)
|
60
65
|
webmock (3.14.0)
|
@@ -66,6 +71,7 @@ PLATFORMS
|
|
66
71
|
ruby
|
67
72
|
|
68
73
|
DEPENDENCIES
|
74
|
+
appraisal
|
69
75
|
mail
|
70
76
|
mailtrap!
|
71
77
|
net-smtp
|
data/LICENSE.txt
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
|
-
Copyright (c) 2022 Railsware Products Studio
|
3
|
+
Copyright (c) 2022 Railsware Products Studio LLC
|
4
4
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ Or install it yourself as:
|
|
30
30
|
require 'mailtrap'
|
31
31
|
|
32
32
|
# create mail object
|
33
|
-
mail = Mailtrap::
|
33
|
+
mail = Mailtrap::Mail::Base.new(
|
34
34
|
from: { email: 'mailtrap@example.com', name: 'Mailtrap Test' },
|
35
35
|
to: [
|
36
36
|
{ email: 'your@email.com' }
|
@@ -50,7 +50,7 @@ client.send(mail)
|
|
50
50
|
require 'mailtrap'
|
51
51
|
require 'base64'
|
52
52
|
|
53
|
-
mail = Mailtrap::
|
53
|
+
mail = Mailtrap::Mail::Base.new(
|
54
54
|
from: { email: 'mailtrap@example.com', name: 'Mailtrap Test' },
|
55
55
|
to: [
|
56
56
|
{ email: 'your@email.com', name: 'Your name' }
|
@@ -87,6 +87,28 @@ client = Mailtrap::Sending::Client.new(api_key: 'your-api-key')
|
|
87
87
|
client.send(mail)
|
88
88
|
```
|
89
89
|
|
90
|
+
### Using email template
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
require 'mailtrap'
|
94
|
+
|
95
|
+
# create mail object
|
96
|
+
mail = Mailtrap::Mail::FromTemplate.new(
|
97
|
+
from: { email: 'mailtrap@example.com', name: 'Mailtrap Test' },
|
98
|
+
to: [
|
99
|
+
{ email: 'your@email.com' }
|
100
|
+
],
|
101
|
+
template_uuid: '2f45b0aa-bbed-432f-95e4-e145e1965ba2',
|
102
|
+
template_variables: {
|
103
|
+
'user_name' => 'John Doe'
|
104
|
+
}
|
105
|
+
)
|
106
|
+
|
107
|
+
# create client and send
|
108
|
+
client = Mailtrap::Sending::Client.new(api_key: 'your-api-key')
|
109
|
+
client.send(mail)
|
110
|
+
```
|
111
|
+
|
90
112
|
### ActionMailer
|
91
113
|
|
92
114
|
This gem also adds ActionMailer delivery method. To configure it, add following to your ActionMailer configuration (in Rails projects located in `config/$ENVIRONMENT.rb`):
|
@@ -3,9 +3,9 @@
|
|
3
3
|
require 'json'
|
4
4
|
|
5
5
|
module Mailtrap
|
6
|
-
module
|
7
|
-
class
|
8
|
-
attr_accessor :from, :to, :cc, :bcc, :
|
6
|
+
module Mail
|
7
|
+
class Base
|
8
|
+
attr_accessor :from, :to, :cc, :bcc, :headers, :custom_variables, :subject, :text, :html, :category
|
9
9
|
attr_reader :attachments
|
10
10
|
|
11
11
|
def initialize( # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength
|
@@ -18,8 +18,8 @@ module Mailtrap
|
|
18
18
|
html: nil,
|
19
19
|
attachments: [],
|
20
20
|
headers: {},
|
21
|
-
|
22
|
-
|
21
|
+
custom_variables: {},
|
22
|
+
category: nil
|
23
23
|
)
|
24
24
|
@from = from
|
25
25
|
@to = to
|
@@ -30,24 +30,24 @@ module Mailtrap
|
|
30
30
|
@html = html
|
31
31
|
self.attachments = attachments
|
32
32
|
@headers = headers
|
33
|
-
@category = category
|
34
33
|
@custom_variables = custom_variables
|
34
|
+
@category = category
|
35
35
|
end
|
36
36
|
|
37
37
|
def as_json # rubocop:disable Metrics/MethodLength
|
38
38
|
{
|
39
|
-
'to' => to,
|
40
39
|
'from' => from,
|
40
|
+
'to' => to,
|
41
41
|
'cc' => cc,
|
42
42
|
'bcc' => bcc,
|
43
43
|
'subject' => subject,
|
44
|
-
'html' => html,
|
45
44
|
'text' => text,
|
45
|
+
'html' => html,
|
46
46
|
'attachments' => attachments.map(&:as_json),
|
47
47
|
# TODO: update headers and custom_variables with as_json method
|
48
48
|
'headers' => headers,
|
49
|
-
'
|
50
|
-
'
|
49
|
+
'custom_variables' => custom_variables,
|
50
|
+
'category' => category
|
51
51
|
}.compact
|
52
52
|
end
|
53
53
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mailtrap
|
4
|
+
module Mail
|
5
|
+
class FromTemplate < Base
|
6
|
+
attr_accessor :template_uuid, :template_variables
|
7
|
+
|
8
|
+
def initialize( # rubocop:disable Metrics/ParameterLists, Metrics/MethodLength
|
9
|
+
from: nil,
|
10
|
+
to: [],
|
11
|
+
cc: [],
|
12
|
+
bcc: [],
|
13
|
+
attachments: [],
|
14
|
+
headers: {},
|
15
|
+
custom_variables: {},
|
16
|
+
template_uuid: nil,
|
17
|
+
template_variables: {}
|
18
|
+
)
|
19
|
+
super(
|
20
|
+
from: from,
|
21
|
+
to: to,
|
22
|
+
cc: cc,
|
23
|
+
bcc: bcc,
|
24
|
+
attachments: attachments,
|
25
|
+
headers: headers,
|
26
|
+
custom_variables: custom_variables
|
27
|
+
)
|
28
|
+
@template_uuid = template_uuid
|
29
|
+
@template_variables = template_variables
|
30
|
+
end
|
31
|
+
|
32
|
+
def as_json
|
33
|
+
super.merge(
|
34
|
+
{
|
35
|
+
'template_uuid' => template_uuid,
|
36
|
+
'template_variables' => template_variables
|
37
|
+
}
|
38
|
+
).compact
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
require_relative 'mail/base'
|
6
|
+
require_relative 'mail/from_template'
|
7
|
+
|
8
|
+
module Mailtrap
|
9
|
+
module Mail
|
10
|
+
class << self
|
11
|
+
def from_message(message) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity
|
12
|
+
Mailtrap::Mail::Base.new(
|
13
|
+
from: prepare_address(address_list(message['from'])&.addresses&.first),
|
14
|
+
to: prepare_addresses(address_list(message['to'])&.addresses),
|
15
|
+
cc: prepare_addresses(address_list(message['cc'])&.addresses),
|
16
|
+
bcc: prepare_addresses(address_list(message['bcc'])&.addresses),
|
17
|
+
subject: message.subject,
|
18
|
+
text: prepare_text_part(message),
|
19
|
+
html: prepare_html_part(message),
|
20
|
+
headers: prepare_headers(message),
|
21
|
+
attachments: prepare_attachments(message.attachments),
|
22
|
+
category: message['category']&.unparsed_value,
|
23
|
+
custom_variables: message['custom_variables']&.unparsed_value
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
PROCESSED_HEADERS = %w[
|
30
|
+
from
|
31
|
+
to
|
32
|
+
cc
|
33
|
+
bcc
|
34
|
+
subject
|
35
|
+
category
|
36
|
+
customvariables
|
37
|
+
contenttype
|
38
|
+
].freeze
|
39
|
+
|
40
|
+
def address_list(header)
|
41
|
+
header.respond_to?(:element) ? header.element : header&.address_list
|
42
|
+
end
|
43
|
+
|
44
|
+
def prepare_addresses(addresses)
|
45
|
+
Array(addresses).map { |address| prepare_address(address) }
|
46
|
+
end
|
47
|
+
|
48
|
+
def prepare_headers(message)
|
49
|
+
message
|
50
|
+
.header_fields
|
51
|
+
.reject { |header| PROCESSED_HEADERS.include?(header.name.downcase.delete('-')) }
|
52
|
+
.to_h { |header| [header.name, header.value] }
|
53
|
+
.compact
|
54
|
+
end
|
55
|
+
|
56
|
+
def prepare_address(address)
|
57
|
+
{
|
58
|
+
email: address.address,
|
59
|
+
name: address.display_name
|
60
|
+
}.compact
|
61
|
+
end
|
62
|
+
|
63
|
+
def prepare_attachments(attachments_list = [])
|
64
|
+
attachments_list.map do |attachment|
|
65
|
+
{
|
66
|
+
content: Base64.strict_encode64(attachment.body.decoded),
|
67
|
+
type: attachment.mime_type,
|
68
|
+
filename: attachment.filename,
|
69
|
+
disposition: attachment.header[:content_disposition]&.disposition_type,
|
70
|
+
content_id: attachment&.cid
|
71
|
+
}.compact
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def prepare_html_part(message)
|
76
|
+
return message.body.decoded if message.mime_type == 'text/html'
|
77
|
+
|
78
|
+
message.html_part&.decoded
|
79
|
+
end
|
80
|
+
|
81
|
+
def prepare_text_part(message)
|
82
|
+
return message.body.decoded if message.mime_type == 'text/plain' || message.mime_type.nil?
|
83
|
+
|
84
|
+
message.text_part&.decoded
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -19,7 +19,7 @@ module Mailtrap
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def send(mail)
|
22
|
-
raise ArgumentError, 'should be Mailtrap::
|
22
|
+
raise ArgumentError, 'should be Mailtrap::Mail::Base object' unless mail.is_a? Mail::Base
|
23
23
|
|
24
24
|
request = post_request('/api/send', mail.to_json)
|
25
25
|
response = http_client.request(request)
|
@@ -38,6 +38,7 @@ module Mailtrap
|
|
38
38
|
request.body = body
|
39
39
|
request['Authorization'] = "Bearer #{api_key}"
|
40
40
|
request['Content-Type'] = 'application/json'
|
41
|
+
request['User-Agent'] = 'mailtrap-ruby (https://github.com/railsware/mailtrap-ruby)'
|
41
42
|
|
42
43
|
request
|
43
44
|
end
|
data/lib/mailtrap/sending.rb
CHANGED
data/lib/mailtrap/version.rb
CHANGED
data/lib/mailtrap.rb
CHANGED
data/mailtrap.gemspec
CHANGED
@@ -5,7 +5,7 @@ require_relative 'lib/mailtrap/version'
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'mailtrap'
|
7
7
|
spec.version = Mailtrap::VERSION
|
8
|
-
spec.authors = ['Railsware Products Studio
|
8
|
+
spec.authors = ['Railsware Products Studio LLC']
|
9
9
|
spec.email = ['support@mailtrap.io']
|
10
10
|
|
11
11
|
spec.summary = 'Official mailtrap.io API client'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailtrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Railsware Products Studio
|
7
|
+
- Railsware Products Studio LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Official mailtrap.io API client
|
14
14
|
email:
|
@@ -20,6 +20,7 @@ files:
|
|
20
20
|
- ".rspec"
|
21
21
|
- ".rubocop.yml"
|
22
22
|
- ".ruby-version"
|
23
|
+
- Appraisals
|
23
24
|
- CHANGELOG.md
|
24
25
|
- CODE_OF_CONDUCT.md
|
25
26
|
- Gemfile
|
@@ -31,11 +32,12 @@ files:
|
|
31
32
|
- lib/mailtrap/action_mailer.rb
|
32
33
|
- lib/mailtrap/action_mailer/delivery_method.rb
|
33
34
|
- lib/mailtrap/action_mailer/railtie.rb
|
35
|
+
- lib/mailtrap/mail.rb
|
36
|
+
- lib/mailtrap/mail/base.rb
|
37
|
+
- lib/mailtrap/mail/from_template.rb
|
34
38
|
- lib/mailtrap/sending.rb
|
35
39
|
- lib/mailtrap/sending/attachment.rb
|
36
40
|
- lib/mailtrap/sending/client.rb
|
37
|
-
- lib/mailtrap/sending/convert.rb
|
38
|
-
- lib/mailtrap/sending/mail.rb
|
39
41
|
- lib/mailtrap/version.rb
|
40
42
|
- mailtrap.gemspec
|
41
43
|
homepage: https://github.com/railsware/mailtrap-ruby
|
@@ -1,83 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'base64'
|
4
|
-
|
5
|
-
module Mailtrap
|
6
|
-
module Sending
|
7
|
-
module Convert
|
8
|
-
class << self
|
9
|
-
def from_message(message) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
10
|
-
Mailtrap::Sending::Mail.new(
|
11
|
-
from: prepare_address(message['from']&.address_list&.addresses&.first),
|
12
|
-
to: prepare_addresses(message['to']&.address_list&.addresses),
|
13
|
-
cc: prepare_addresses(message['cc']&.address_list&.addresses),
|
14
|
-
bcc: prepare_addresses(message['bcc']&.address_list&.addresses),
|
15
|
-
subject: message.subject,
|
16
|
-
text: prepare_text_part(message),
|
17
|
-
html: prepare_html_part(message),
|
18
|
-
headers: prepare_headers(message),
|
19
|
-
attachments: prepare_attachments(message.attachments),
|
20
|
-
category: message['category']&.unparsed_value,
|
21
|
-
custom_variables: message['custom_variables']&.unparsed_value
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
PROCESSED_HEADERS = %w[
|
28
|
-
from
|
29
|
-
to
|
30
|
-
cc
|
31
|
-
bcc
|
32
|
-
subject
|
33
|
-
category
|
34
|
-
customvariables
|
35
|
-
contenttype
|
36
|
-
].freeze
|
37
|
-
|
38
|
-
def prepare_addresses(addresses)
|
39
|
-
Array(addresses).map { |address| prepare_address(address) }
|
40
|
-
end
|
41
|
-
|
42
|
-
def prepare_headers(message)
|
43
|
-
message
|
44
|
-
.header_fields
|
45
|
-
.reject { |header| PROCESSED_HEADERS.include?(header.name.downcase.delete('-')) }
|
46
|
-
.to_h { |header| [header.name, header.value] }
|
47
|
-
.compact
|
48
|
-
end
|
49
|
-
|
50
|
-
def prepare_address(address)
|
51
|
-
{
|
52
|
-
email: address.address,
|
53
|
-
name: address.display_name
|
54
|
-
}.compact
|
55
|
-
end
|
56
|
-
|
57
|
-
def prepare_attachments(attachments_list = [])
|
58
|
-
attachments_list.map do |attachment|
|
59
|
-
{
|
60
|
-
content: Base64.strict_encode64(attachment.body.decoded),
|
61
|
-
type: attachment.mime_type,
|
62
|
-
filename: attachment.filename,
|
63
|
-
disposition: attachment.header[:content_disposition]&.disposition_type,
|
64
|
-
content_id: attachment.header[:content_id]&.field&.content_id
|
65
|
-
}.compact
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def prepare_html_part(message)
|
70
|
-
return message.body.decoded if message.mime_type == 'text/html'
|
71
|
-
|
72
|
-
message.html_part&.decoded
|
73
|
-
end
|
74
|
-
|
75
|
-
def prepare_text_part(message)
|
76
|
-
return message.body.decoded if message.mime_type == 'text/plain' || message.mime_type.nil?
|
77
|
-
|
78
|
-
message.text_part&.decoded
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|