onlyoffice_iredmail_helper 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e74825ff4765edfd4366de74a790cba2cc02da5af7d8c0ebc837306fd6aff2b
4
- data.tar.gz: 713bf750990f35c858ea73e6c79919dbc66952a39943140eb35b164fab213395
3
+ metadata.gz: aee7216a8ce608e7e08e4b625f0257abe4390bdf25587be65ec8c37a88d42911
4
+ data.tar.gz: e0aa9ec14113d81cdab2c1f879d59b9c4ff2b8d637ea2363684d93b79ae365df
5
5
  SHA512:
6
- metadata.gz: c89ff66486363120c32aff5c92c5f9729caf7ab0a897605bfa66404aee6057e00bc3de70f9a9aeea75b5a28eba42c777db55521a4ed9de3a183fad97c66e1bb9
7
- data.tar.gz: 35a00878f246327b96bdc8300b59126c0b0c93e87c9df83143ea964c902b1e3c05e9bd63736d959ca0d230450f273d32d861a171fa254c85c3b4c32c28f6f897
6
+ metadata.gz: 776d866b181e61ce9e1254096766f6578b9617a2fbd9f4f6c155de41bb9acf99f034330789109daf4ae21cf9c2dcb5ee425a070de6463f8977c6db38d3d5707e
7
+ data.tar.gz: 10eb89d22588e0275d83a7aeb1ee48600ffa9699817239a3396b16c25d22483a5d75636dc0bd34761de3196cc6e0a7488f54a9a0403d37b7777b560cf072ba4a
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeIredmailHelper
4
+ # Methods to delete messages
5
+ module DeleteMethods
6
+ # Delete all messages in inbox
7
+ # @return [nil]
8
+ def delete_all_messages
9
+ login
10
+ @imap.select('INBOX')
11
+ @imap.store(@imap.search(['ALL']), '+FLAGS', [:Deleted]) unless @imap.search(['ALL']).empty?
12
+ OnlyofficeLoggerHelper.log('Delete all messages')
13
+ close
14
+ end
15
+
16
+ # Delete email by subject
17
+ # @param subject [String] email title
18
+ # @return [nil]
19
+ def delete_email_by_subject(subject)
20
+ login
21
+ @imap.select('INBOX')
22
+ id_emails = @imap.search(['SUBJECT', subject.dup.force_encoding('ascii-8bit')])
23
+ @imap.store(id_emails, '+FLAGS', [:Deleted]) unless id_emails.empty?
24
+ close
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeIredmailHelper
4
+ # Methods to login and logout
5
+ module LoginMethods
6
+ # Login to email via IMAP
7
+ # @return [nil]
8
+ def login
9
+ return if @imap
10
+
11
+ @imap = Net::IMAP.new(@domainname)
12
+ @imap.authenticate('LOGIN', @username, @password)
13
+ end
14
+
15
+ private
16
+
17
+ # Correct close of mail account
18
+ # @return [Void]
19
+ def close
20
+ @imap.close
21
+ @imap.logout
22
+ @imap.disconnect
23
+ @imap = nil
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeIredmailHelper
4
+ # Methods to move message
5
+ module MoveMessageMethods
6
+ private
7
+
8
+ # Move out message to `checked` directory
9
+ # @param message_id [String] id of message
10
+ # @return [Void]
11
+ def move_out_message(message_id)
12
+ create_mailbox(@mailbox_for_archive) unless mailboxes.include?(@mailbox_for_archive)
13
+
14
+ login
15
+ @imap.select('INBOX')
16
+ @imap.copy(message_id, @mailbox_for_archive)
17
+ @imap.store(message_id, '+FLAGS', [:Deleted])
18
+ @imap.expunge
19
+ close
20
+ end
21
+
22
+ # Should message be moved out or marked as seen
23
+ # @param [String] message_id message to handle
24
+ # @param [Boolean] move_out should it be moved
25
+ # @return [Void]
26
+ def move_out_or_mark_seen(message_id, move_out)
27
+ if move_out
28
+ move_out_message(message_id)
29
+ else
30
+ mark_message_as_seen(message_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeIredmailHelper
4
+ # Methods to read default values
5
+ module ReadDefaultsMethods
6
+ private
7
+
8
+ # Get S3 key and S3 private key
9
+ # @return [Array <String>] list of keys
10
+ def read_defaults
11
+ return if read_env_defaults
12
+
13
+ yaml = YAML.load_file("#{Dir.home}/.gem-onlyoffice_iredmail_helper/config.yml")
14
+ @default_domain = yaml['domain']
15
+ @default_user = yaml['user']
16
+ @default_password = yaml['password'].to_s
17
+ @default_subject = yaml['subject']
18
+ rescue Errno::ENOENT
19
+ raise Errno::ENOENT, 'No config found. Please create ~/.gem-onlyoffice_iredmail_helper/config.yml'
20
+ end
21
+
22
+ # Read keys from env variables
23
+ def read_env_defaults
24
+ return false unless ENV['IREDMAIL_PASSWORD']
25
+
26
+ @default_domain = ENV['IREDMAIL_DOMAIN']
27
+ @default_user = ENV['IREDMAIL_USER']
28
+ @default_password = ENV['IREDMAIL_PASSWORD'].to_s
29
+ @default_subject = ENV['IREDMAIL_SUBJECT']
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeIredmailHelper
4
+ # Methods to send message
5
+ module SendMessageMethods
6
+ # Form a email string
7
+ # @param msg_data [Hash] params
8
+ # @return [String] formed mail message
9
+ def create_msg(msg_data = {})
10
+ <<~END_OF_MESSAGE
11
+ From: #{@username}
12
+ To: #{msg_data[:mailto]}
13
+ Subject: #{msg_data[:subject]}
14
+ Date: #{Time.now.rfc2822}
15
+ Message-Id: "#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@#{@username.split('@').last}"
16
+
17
+ #{msg_data[:body]}
18
+ END_OF_MESSAGE
19
+ end
20
+
21
+ # Send mail
22
+ # @param options [Hash] hash with params
23
+ # @return [nil]
24
+ def send_mail(options = {})
25
+ options[:subject] ||= @default_subject
26
+ options[:body] ||= @default_body
27
+ options[:mailto] ||= @default_user
28
+ smtp = Net::SMTP.start(@domainname, 25, @username, @username, @password, :login)
29
+ smtp.send_message create_msg(options), @username, options[:mailto]
30
+ smtp.finish
31
+ end
32
+ end
33
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module OnlyofficeIredmailHelper
4
4
  # [String] version of gem
5
- VERSION = '0.2.1'
5
+ VERSION = '0.3.0'
6
6
  end
@@ -7,18 +7,28 @@ require 'net/smtp'
7
7
  require 'onlyoffice_logger_helper'
8
8
  require 'time'
9
9
  require 'yaml'
10
+ require_relative 'onlyoffice_iredmail_helper/delete_methods'
11
+ require_relative 'onlyoffice_iredmail_helper/login_methods'
10
12
  require_relative 'onlyoffice_iredmail_helper/mailboxes_methods'
11
13
  require_relative 'onlyoffice_iredmail_helper/mail_getters'
12
14
  require_relative 'onlyoffice_iredmail_helper/message_methods'
15
+ require_relative 'onlyoffice_iredmail_helper/move_message_methods'
16
+ require_relative 'onlyoffice_iredmail_helper/read_defaults_methods'
17
+ require_relative 'onlyoffice_iredmail_helper/send_message_methods'
13
18
  require_relative 'onlyoffice_iredmail_helper/version'
14
19
 
15
20
  # Namespace of Gem
16
21
  module OnlyofficeIredmailHelper
17
22
  # Class for working with mail
18
23
  class IredMailHelper
24
+ include DeleteMethods
25
+ include LoginMethods
19
26
  include MailboxesMethods
20
27
  include MailGetters
21
28
  include MessageMethods
29
+ include MoveMessageMethods
30
+ include ReadDefaultsMethods
31
+ include SendMessageMethods
22
32
  attr_reader :username
23
33
 
24
34
  def initialize(options = {})
@@ -34,65 +44,8 @@ module OnlyofficeIredmailHelper
34
44
  # @return [String] inspect info
35
45
  def inspect
36
46
  "IredMailHelper domain: #{@domainname}, " \
37
- "user: #{@username}, " \
38
- "subject: #{@subject}"
39
- end
40
-
41
- # Login to email via IMAP
42
- # @return [nil]
43
- def login
44
- return if @imap
45
-
46
- @imap = Net::IMAP.new(@domainname)
47
- @imap.authenticate('LOGIN', @username, @password)
48
- end
49
-
50
- # Form a email string
51
- # @param msg_data [Hash] params
52
- # @return [String] formed mail message
53
- def create_msg(msg_data = {})
54
- <<~END_OF_MESSAGE
55
- From: #{@username}
56
- To: #{msg_data[:mailto]}
57
- Subject: #{msg_data[:subject]}
58
- Date: #{Time.now.rfc2822}
59
- Message-Id: "#{Digest::SHA2.hexdigest(Time.now.to_i.to_s)}@#{@username.split('@').last}"
60
-
61
- #{msg_data[:body]}
62
- END_OF_MESSAGE
63
- end
64
-
65
- # Send mail
66
- # @param options [Hash] hash with params
67
- # @return [nil]
68
- def send_mail(options = {})
69
- options[:subject] ||= @default_subject
70
- options[:body] ||= @default_body
71
- options[:mailto] ||= @default_user
72
- smtp = Net::SMTP.start(@domainname, 25, @username, @username, @password, :login)
73
- smtp.send_message create_msg(options), @username, options[:mailto]
74
- smtp.finish
75
- end
76
-
77
- # Delete all messages in inbox
78
- # @return [nil]
79
- def delete_all_messages
80
- login
81
- @imap.select('INBOX')
82
- @imap.store(@imap.search(['ALL']), '+FLAGS', [:Deleted]) unless @imap.search(['ALL']).empty?
83
- OnlyofficeLoggerHelper.log('Delete all messages')
84
- close
85
- end
86
-
87
- # Delete email by subject
88
- # @param subject [String] email title
89
- # @return [nil]
90
- def delete_email_by_subject(subject)
91
- login
92
- @imap.select('INBOX')
93
- id_emails = @imap.search(['SUBJECT', subject.dup.force_encoding('ascii-8bit')])
94
- @imap.store(id_emails, '+FLAGS', [:Deleted]) unless id_emails.empty?
95
- close
47
+ "user: #{@username}, " \
48
+ "subject: #{@subject}"
96
49
  end
97
50
 
98
51
  # Get email
@@ -110,11 +63,7 @@ module OnlyofficeIredmailHelper
110
63
  mail_subject_to_be_found = options[:subject].to_s.upcase
111
64
  next unless mail_subject_found.include? mail_subject_to_be_found
112
65
 
113
- if options[:move_out]
114
- move_out_message(message_id)
115
- else
116
- mark_message_as_seen(message_id)
117
- end
66
+ move_out_or_mark_seen(message_id, options[:move_out])
118
67
  return mail
119
68
  end
120
69
  end
@@ -135,11 +84,7 @@ module OnlyofficeIredmailHelper
135
84
  string_to_be_found = options[:subject].to_s.upcase.gsub(/\s+/, ' ')
136
85
  next unless string_found.include? string_to_be_found
137
86
 
138
- if move_out
139
- move_out_message(message_id)
140
- else
141
- mark_message_as_seen(message_id)
142
- end
87
+ move_out_or_mark_seen(message_id, move_out)
143
88
  return true
144
89
  end
145
90
  end
@@ -162,11 +107,7 @@ module OnlyofficeIredmailHelper
162
107
  string_to_be_found = options[:subject].to_s.upcase.gsub(/\s+/, ' ')
163
108
  next unless string_found.include? string_to_be_found
164
109
 
165
- if move_out
166
- move_out_message(message_id)
167
- else
168
- mark_message_as_seen(message_id)
169
- end
110
+ move_out_or_mark_seen(message_id, move_out)
170
111
  return mail
171
112
  end
172
113
  end
@@ -175,35 +116,16 @@ module OnlyofficeIredmailHelper
175
116
 
176
117
  private
177
118
 
178
- # Correct close of mail account
179
- # @return [Void]
180
- def close
181
- @imap.close
182
- @imap.logout
183
- @imap.disconnect
184
- @imap = nil
185
- end
186
-
187
- # Move out message to `checked` directory
188
- # @param message_id [String] id of message
189
- # @return [Void]
190
- def move_out_message(message_id)
191
- create_mailbox(@mailbox_for_archive) unless mailboxes.include?(@mailbox_for_archive)
192
-
193
- login
194
- @imap.select('INBOX')
195
- @imap.copy(message_id, @mailbox_for_archive)
196
- @imap.store(message_id, '+FLAGS', [:Deleted])
197
- @imap.expunge
198
- close
199
- end
200
-
201
119
  # Get email list via search or all unseen
202
120
  # @param options [Hash] options to search
121
+ # @option options [String] :search call search by this string
122
+ # @option options [Boolean] :include_read should messages marked as read included
203
123
  # @return [Array<Mail>] list of mails
204
124
  def get_emails_search_or_new(options)
205
125
  if options[:search]
206
126
  @imap.search([(options[:search_type] || 'BODY').to_s.upcase, options[:search]])
127
+ elsif options[:include_read]
128
+ @imap.search(['ALL'])
207
129
  else
208
130
  @imap.search(['UNSEEN'])
209
131
  end
@@ -224,29 +146,5 @@ module OnlyofficeIredmailHelper
224
146
  mark_message_as_seen(message_id, close_connection: false) unless search
225
147
  { subject: subject, body: body, html_body: html_body }
226
148
  end
227
-
228
- # Get S3 key and S3 private key
229
- # @return [Array <String>] list of keys
230
- def read_defaults
231
- return if read_env_defaults
232
-
233
- yaml = YAML.load_file("#{Dir.home}/.gem-onlyoffice_iredmail_helper/config.yml")
234
- @default_domain = yaml['domain']
235
- @default_user = yaml['user']
236
- @default_password = yaml['password'].to_s
237
- @default_subject = yaml['subject']
238
- rescue Errno::ENOENT
239
- raise Errno::ENOENT, 'No config found. Please create ~/.gem-onlyoffice_iredmail_helper/config.yml'
240
- end
241
-
242
- # Read keys from env variables
243
- def read_env_defaults
244
- return false unless ENV['IREDMAIL_PASSWORD']
245
-
246
- @default_domain = ENV['IREDMAIL_DOMAIN']
247
- @default_user = ENV['IREDMAIL_USER']
248
- @default_password = ENV['IREDMAIL_PASSWORD'].to_s
249
- @default_subject = ENV['IREDMAIL_SUBJECT']
250
- end
251
149
  end
252
150
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onlyoffice_iredmail_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ONLYOFFICE
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-09-17 00:00:00.000000000 Z
12
+ date: 2021-11-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mail
@@ -39,146 +39,138 @@ dependencies:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
41
  version: '1'
42
- - !ruby/object:Gem::Dependency
43
- name: codecov
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - '='
47
- - !ruby/object:Gem::Version
48
- version: 0.2.11
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - '='
54
- - !ruby/object:Gem::Version
55
- version: 0.2.11
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: overcommit
58
44
  requirement: !ruby/object:Gem::Requirement
59
45
  requirements:
60
- - - '='
46
+ - - "~>"
61
47
  - !ruby/object:Gem::Version
62
- version: 0.55.0
48
+ version: '0'
63
49
  type: :development
64
50
  prerelease: false
65
51
  version_requirements: !ruby/object:Gem::Requirement
66
52
  requirements:
67
- - - '='
53
+ - - "~>"
68
54
  - !ruby/object:Gem::Version
69
- version: 0.55.0
55
+ version: '0'
70
56
  - !ruby/object:Gem::Dependency
71
57
  name: rake
72
58
  requirement: !ruby/object:Gem::Requirement
73
59
  requirements:
74
- - - '='
60
+ - - "~>"
75
61
  - !ruby/object:Gem::Version
76
- version: 13.0.1
62
+ version: '13'
77
63
  type: :development
78
64
  prerelease: false
79
65
  version_requirements: !ruby/object:Gem::Requirement
80
66
  requirements:
81
- - - '='
67
+ - - "~>"
82
68
  - !ruby/object:Gem::Version
83
- version: 13.0.1
69
+ version: '13'
84
70
  - !ruby/object:Gem::Dependency
85
71
  name: rspec
86
72
  requirement: !ruby/object:Gem::Requirement
87
73
  requirements:
88
- - - '='
74
+ - - "~>"
89
75
  - !ruby/object:Gem::Version
90
- version: 3.9.0
76
+ version: '3'
91
77
  type: :development
92
78
  prerelease: false
93
79
  version_requirements: !ruby/object:Gem::Requirement
94
80
  requirements:
95
- - - '='
81
+ - - "~>"
96
82
  - !ruby/object:Gem::Version
97
- version: 3.9.0
83
+ version: '3'
98
84
  - !ruby/object:Gem::Dependency
99
85
  name: rubocop
100
86
  requirement: !ruby/object:Gem::Requirement
101
87
  requirements:
102
- - - '='
88
+ - - "~>"
103
89
  - !ruby/object:Gem::Version
104
- version: 0.91.0
90
+ version: '1'
105
91
  type: :development
106
92
  prerelease: false
107
93
  version_requirements: !ruby/object:Gem::Requirement
108
94
  requirements:
109
- - - '='
95
+ - - "~>"
110
96
  - !ruby/object:Gem::Version
111
- version: 0.91.0
97
+ version: '1'
112
98
  - !ruby/object:Gem::Dependency
113
99
  name: rubocop-performance
114
100
  requirement: !ruby/object:Gem::Requirement
115
101
  requirements:
116
- - - '='
102
+ - - "~>"
117
103
  - !ruby/object:Gem::Version
118
- version: 1.8.0
104
+ version: '1'
119
105
  type: :development
120
106
  prerelease: false
121
107
  version_requirements: !ruby/object:Gem::Requirement
122
108
  requirements:
123
- - - '='
109
+ - - "~>"
124
110
  - !ruby/object:Gem::Version
125
- version: 1.8.0
111
+ version: '1'
126
112
  - !ruby/object:Gem::Dependency
127
113
  name: rubocop-rake
128
114
  requirement: !ruby/object:Gem::Requirement
129
115
  requirements:
130
- - - '='
116
+ - - "~>"
131
117
  - !ruby/object:Gem::Version
132
- version: 0.5.1
118
+ version: '0'
133
119
  type: :development
134
120
  prerelease: false
135
121
  version_requirements: !ruby/object:Gem::Requirement
136
122
  requirements:
137
- - - '='
123
+ - - "~>"
138
124
  - !ruby/object:Gem::Version
139
- version: 0.5.1
125
+ version: '0'
140
126
  - !ruby/object:Gem::Dependency
141
127
  name: rubocop-rspec
142
128
  requirement: !ruby/object:Gem::Requirement
143
129
  requirements:
144
- - - '='
130
+ - - "~>"
145
131
  - !ruby/object:Gem::Version
146
- version: 1.43.2
132
+ version: '2'
147
133
  type: :development
148
134
  prerelease: false
149
135
  version_requirements: !ruby/object:Gem::Requirement
150
136
  requirements:
151
- - - '='
137
+ - - "~>"
152
138
  - !ruby/object:Gem::Version
153
- version: 1.43.2
139
+ version: '2'
154
140
  - !ruby/object:Gem::Dependency
155
- name: simplecov
141
+ name: simplecov-cobertura
156
142
  requirement: !ruby/object:Gem::Requirement
157
143
  requirements:
158
- - - '='
144
+ - - "~>"
159
145
  - !ruby/object:Gem::Version
160
- version: 0.19.0
146
+ version: '2'
161
147
  type: :development
162
148
  prerelease: false
163
149
  version_requirements: !ruby/object:Gem::Requirement
164
150
  requirements:
165
- - - '='
151
+ - - "~>"
166
152
  - !ruby/object:Gem::Version
167
- version: 0.19.0
153
+ version: '2'
168
154
  - !ruby/object:Gem::Dependency
169
155
  name: yard
170
156
  requirement: !ruby/object:Gem::Requirement
171
157
  requirements:
172
- - - '='
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ - - ">="
173
162
  - !ruby/object:Gem::Version
174
- version: 0.9.25
163
+ version: 0.9.20
175
164
  type: :development
176
165
  prerelease: false
177
166
  version_requirements: !ruby/object:Gem::Requirement
178
167
  requirements:
179
- - - '='
168
+ - - "~>"
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ - - ">="
180
172
  - !ruby/object:Gem::Version
181
- version: 0.9.25
173
+ version: 0.9.20
182
174
  description: ONLYOFFICE Helper Gem for iRedMail. Used in QA
183
175
  email:
184
176
  - shockwavenn@gmail.com
@@ -187,10 +179,15 @@ extensions: []
187
179
  extra_rdoc_files: []
188
180
  files:
189
181
  - lib/onlyoffice_iredmail_helper.rb
182
+ - lib/onlyoffice_iredmail_helper/delete_methods.rb
183
+ - lib/onlyoffice_iredmail_helper/login_methods.rb
190
184
  - lib/onlyoffice_iredmail_helper/mail_getters.rb
191
185
  - lib/onlyoffice_iredmail_helper/mailboxes_methods.rb
192
186
  - lib/onlyoffice_iredmail_helper/message_methods.rb
187
+ - lib/onlyoffice_iredmail_helper/move_message_methods.rb
193
188
  - lib/onlyoffice_iredmail_helper/name.rb
189
+ - lib/onlyoffice_iredmail_helper/read_defaults_methods.rb
190
+ - lib/onlyoffice_iredmail_helper/send_message_methods.rb
194
191
  - lib/onlyoffice_iredmail_helper/version.rb
195
192
  homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_iredmail_helper
196
193
  licenses:
@@ -201,6 +198,7 @@ metadata:
201
198
  documentation_uri: https://www.rubydoc.info/gems/onlyoffice_iredmail_helper
202
199
  homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_iredmail_helper
203
200
  source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_iredmail_helper
201
+ rubygems_mfa_required: 'true'
204
202
  post_install_message:
205
203
  rdoc_options: []
206
204
  require_paths:
@@ -216,7 +214,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
214
  - !ruby/object:Gem::Version
217
215
  version: '0'
218
216
  requirements: []
219
- rubygems_version: 3.1.4
217
+ rubygems_version: 3.2.29
220
218
  signing_key:
221
219
  specification_version: 4
222
220
  summary: ONLYOFFICE Helper Gem for iRedMail