mailhandler 1.0.13 → 1.0.14

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
  SHA1:
3
- metadata.gz: 7d5da2d84a112a75963921878106d433e7692f45
4
- data.tar.gz: 6d52c2232c683d02a2cfb6d27da46e5d399cc6c2
3
+ metadata.gz: 2ec9ad0acba66aa31321e63ed9f9acf9b95f57ea
4
+ data.tar.gz: 16279973b129e4a3f384e7cfdaa025603b6b3814
5
5
  SHA512:
6
- metadata.gz: 1834533b14c45829273d4c050b5f9f3cb1e0ac08e834bd9ac4d0b4e5b79250fe7e926120a36e64c844a5351d2b43df14eabbf7b3fa0220c327921e6fc74f904d
7
- data.tar.gz: e595566eb6a85f3043bb371d48a51d38a04bc430d7b4e5fd5a3ea434af6c76126e44086b007e68db703cdc28e72cc37ed318c5f6078859c68b64710577dc02f4
6
+ metadata.gz: 04381e76cc9adc9b6bfa1e2d649957cf60a2fbd1f5b2da7fa08d50d51d2e6fe3beaa61d13de6a4dcde7719c24c5affe8519d4bc13e97364a94a0ecf5e812d7fe
7
+ data.tar.gz: e0c657384c7679083bbe7047738fb2fb810fe58e9562a3a7ed9fd3d764178d155ce905a82e2722520786af049dbfbfe4aab991ed0e9d7e9b0a764f7401764a0f
@@ -0,0 +1,56 @@
1
+ require 'fileutils'
2
+
3
+ # Base filtering class, which is used for reading list of all files based on passed pattern.
4
+ # Patterns to be used can be checked here: http://ruby-doc.org/core-1.9.3/Dir.html
5
+ module Filter
6
+
7
+ class Base
8
+
9
+ def Base.sort(files)
10
+
11
+ swapped = true
12
+ j = 0
13
+
14
+ while swapped do
15
+
16
+ swapped = false
17
+ j+=1
18
+
19
+ (files.size - j).times do |i|
20
+
21
+ if File.new(files[i]).ctime < File.new(files[i + 1]).ctime
22
+ tmp = files[i]
23
+ files[i] = files[i + 1]
24
+ files[i + 1] = tmp
25
+ swapped = true
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ files
34
+
35
+ end
36
+
37
+ def get(pattern)
38
+
39
+ files = []
40
+ Dir.glob(pattern).each { |file| files << File.absolute_path(file) }
41
+ files
42
+
43
+ end
44
+
45
+ protected
46
+
47
+ def read_email(content)
48
+
49
+ Mail.read_from_string(content)
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
@@ -0,0 +1,167 @@
1
+ require_relative 'base.rb'
2
+
3
+ # Implementations of base filtering, which will allow further filtering the list of files based on email content.
4
+ module Filter
5
+
6
+ class ByFilename < Base
7
+
8
+ def get(pattern)
9
+
10
+ super(pattern)
11
+
12
+ end
13
+
14
+ end
15
+
16
+ class ContentBase < Base
17
+
18
+ def initialize(content)
19
+
20
+ @content = content.to_s
21
+
22
+ end
23
+
24
+ protected
25
+
26
+ def filter_files(files)
27
+
28
+ files.select do |file|
29
+
30
+ begin
31
+
32
+ file_match_filter?(file)
33
+
34
+ rescue
35
+
36
+ # return false if error occurred or content was not found
37
+ false
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ def file_match_filter?(file)
46
+
47
+ raise StandardError, 'Not implemented'
48
+
49
+ end
50
+
51
+ end
52
+
53
+ class BySubject < ContentBase
54
+
55
+ def initialize(content)
56
+
57
+ super(content)
58
+
59
+ end
60
+
61
+ def get(pattern)
62
+
63
+ files = super(pattern)
64
+ filter_files(files)
65
+
66
+ end
67
+
68
+ private
69
+
70
+ def file_match_filter?(file)
71
+
72
+ read_email(File.read(file)).subject.include? @content
73
+
74
+ end
75
+
76
+ end
77
+
78
+ class ByContent < ContentBase
79
+
80
+ def initialize(content)
81
+
82
+ super(content)
83
+
84
+ end
85
+
86
+ def get(pattern)
87
+
88
+ files = super(pattern)
89
+ filter_files(files)
90
+
91
+ end
92
+
93
+ private
94
+
95
+ def file_match_filter?(file)
96
+
97
+ File.read(file).include? @content
98
+
99
+ end
100
+
101
+ end
102
+
103
+ class ByDate < ContentBase
104
+
105
+ def initialize(date)
106
+
107
+ @date = date
108
+
109
+ end
110
+
111
+ def get(pattern)
112
+
113
+ files = super(pattern)
114
+ filter_files(files)
115
+
116
+ end
117
+
118
+ private
119
+
120
+ def file_match_filter?(file)
121
+
122
+ file = File.new(file)
123
+ if file != nil
124
+
125
+ file.ctime > @date
126
+
127
+ else
128
+
129
+ false
130
+
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
137
+ module Email
138
+
139
+ class ByRecipient < ContentBase
140
+
141
+ def initialize(recipient)
142
+
143
+ @recipient = recipient
144
+
145
+ end
146
+
147
+ def get(pattern)
148
+
149
+ files = super(pattern)
150
+ filter_files(files)
151
+
152
+ end
153
+
154
+ private
155
+
156
+ def file_match_filter?(file)
157
+
158
+ email = read_email(File.read(file))
159
+ email[@recipient.keys.first].to_s.include? @recipient.values.first
160
+
161
+ end
162
+
163
+ end
164
+
165
+ end
166
+
167
+ end
@@ -1,8 +1,10 @@
1
- require_relative 'base.rb'
2
- require_relative 'filter'
3
1
  require 'mail'
2
+ require_relative 'base.rb'
4
3
  require_relative '../errors'
5
4
 
5
+ require_relative 'file_filter/base.rb'
6
+ require_relative 'file_filter/filter.rb'
7
+
6
8
  module MailHandler
7
9
 
8
10
  module Receiving
@@ -45,7 +47,7 @@ module MailHandler
45
47
  # filter options which need to be done by searching files
46
48
  FILE_SEARCH_CLASSES = {
47
49
 
48
- :by_subject => Filter::ByContent,
50
+ :by_subject => Filter::BySubject,
49
51
  :by_content => Filter::ByContent,
50
52
  :by_date => Filter::ByDate,
51
53
  :by_recipient => Filter::Email::ByRecipient
@@ -59,12 +61,7 @@ module MailHandler
59
61
 
60
62
  def read_found_emails(files, count)
61
63
 
62
- files.first(count).map do |file|
63
-
64
- email_content = File.read(file)
65
- Mail.read_from_string(email_content)
66
-
67
- end
64
+ files.first(count).map { |file| Mail.read_from_string(File.read(file)) }
68
65
 
69
66
  end
70
67
 
@@ -103,7 +100,7 @@ module MailHandler
103
100
 
104
101
  def delete_file(file)
105
102
 
106
- FileUtils.rm_r "#{inbox_folder}/#{file}", :force => true
103
+ FileUtils.rm_r "#{inbox_folder}/#{file}", :force => false
107
104
 
108
105
  end
109
106
 
@@ -91,16 +91,7 @@ module MailHandler
91
91
 
92
92
  def find_emails(options)
93
93
 
94
- if options[:archive]
95
-
96
- result = Mail.find_and_delete(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options))
97
-
98
- else
99
-
100
- result = Mail.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options))
101
-
102
- end
103
-
94
+ result = Mail.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options), :delete_after_find => options[:archive])
104
95
  (result.kind_of? Array)? result : [result]
105
96
 
106
97
  end
@@ -1,5 +1,5 @@
1
1
  module MailHandler
2
2
 
3
- VERSION = '1.0.13'
3
+ VERSION = '1.0.14'
4
4
 
5
5
  end
@@ -0,0 +1,47 @@
1
+ Delivered-To: igor@example.com
2
+ Received: by 12.74.171.199 with SMTP id 1w7csp487013o2c;
3
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
4
+ X-Received: by 11.14.225.211 with SMTP id k202mr13688721ywe.168.1450691103560;
5
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
6
+ Received: from sc-exam.mtasv.net (sc-exam.itasv.net. [51.32.152.221])
7
+ by mx.google.com with ESMTPS id n124si20919044ywc.44.2015.22.22.01.45.03
8
+ for <igor@example.com>
9
+ (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
10
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
11
+ Received-SPF: pass (google.com: domain of unces@wb.example.com designates 11.1.1.1 as permitted sender) client-ip=11.1.1.1;
12
+ Authentication-Results: mx.google.com;
13
+ spf=pass (google.com: domain of ounces@wb.example.com designates 11.1.1.1 as permitted sender) smtp.mailfrom=ounces@wb.example.com;
14
+ dkim=pass header.i=@example.com;
15
+ dmarc=pass (p=NONE dis=NONE) header.from=example.com
16
+ DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=jan2013.pm; d=example.com;
17
+ h=From:Date:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:To:Reply-To:Message-ID; i=igor@example.com;
18
+ bh=PzwfK1FvIpe5JXJSkPKh5z/fDTY=;
19
+ b=Y8QAdWtGwwC9QSXtVQ+QJzOt+dzOm+WrOCJ/dnGbD8eBKYuEBRxwo18FqmSIP7petsfqU3NIXK85
20
+ uF7yvyaBdMkafiKrR4du+TFTf+QBfsOoSrCIvKhCqnRgTEeL/niuYMbjNDrUNWcxq5VvUWKrtyjf
21
+ cvyZhxW2Cwdbd5nZ2NM=
22
+ DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=jan2013.pm; d=example.com;
23
+ b=S7CL7EMB1XKFCedi2NHfRSxWEnzBXnt6f48UxDcpGBWQGRj5b53isqmr5dnwAvP+q6HdQDc0rDgk
24
+ hXnckMTHE1p1MmeBSvETDB+FU4VXnA4CaAfeRTf+rUZlz1w5d/aWKqBSa9kPJQvwQrCypxqcPJql
25
+ 7K0YKl5PtWP3D5gn/KU=;
26
+ Received: by sc-exam.mtasv.net id hev51u1jk5kd for <igor@example.com>; Mon, 21 Dec 2015 04:45:03 -0500 (envelope-from <ounces@wb.example.com>)
27
+ X-IADB-IP: 11.1.1.1
28
+ X-IADB-IP-REVERSE: 11.1.1.2
29
+ From: "John Smith" <igor@example.com>
30
+ Date: Mon, 21 Dec 2015 04:45:03 -0500
31
+ Subject: =?UTF-8?Q?=D0=95-=D0=BC=D0=B0=D0=B8=D0=BB=20=D0=BF=D1=80?=
32
+ =?UTF-8?Q?=D0=B8=D0=BC=D0=B5=D1=80=2069578385=20?=
33
+ MIME-Version: 1.0
34
+ Content-Type: text/html; charset=UTF-8
35
+ Content-Transfer-Encoding: quoted-printable
36
+ X-Mailer: aspNetEmail ver 4.0.0.38
37
+ X-PM-RCPT: |bTB8MjA3NDd8MTYzODZ8aWJhbG9zaC50ZXN0aW5nQGdtYWlsLmNv11==|
38
+ X-PM-Message-Id: 1fb4ccd8-fe62-4424-a0aa-a30b281b9631
39
+ To: igor@example.com
40
+ Message-ID: <5677ca1e87ee0_de33fee2381c080708d8@Johns-MacBook-Pro.local.mail>
41
+
42
+ <=21DOCTYPE html>=0A<html>=0A=0A<body>=0A<h1>My First Heading</h1>=0A<p>M=
43
+ y first paragraph=2E</p>=0A<p>My first paragraph S=C3=BC=C3=9Fe =2E</p>=0A=
44
+ =0A<img src=3D=22http://ea=2Epstmrk=2Eit/open/MjA3NDdfMTYzODZfb3ZlcjUwXzh=
45
+ mYjRjY2Q4LWZlNjItNDQyNC1hMGFhLWEzMGIyODFiOTYzMF9pYmFsb3NoLnRlc3RpbmdAZ21h=
46
+ aWwuY29t=22 width=3D=221=22 height=3D=221=22 border=3D=220=22 /></body>=0A=
47
+ </html>
@@ -0,0 +1,46 @@
1
+ Delivered-To: igor@example.com
2
+ Received: by 12.74.171.199 with SMTP id 1w7csp487013o2c;
3
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
4
+ X-Received: by 11.14.225.211 with SMTP id k202mr13688721ywe.168.1450691103560;
5
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
6
+ Received: from sc-exam.mtasv.net (sc-exam.itasv.net. [51.32.152.221])
7
+ by mx.google.com with ESMTPS id n124si20919044ywc.44.2015.22.22.01.45.03
8
+ for <igor@example.com>
9
+ (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
10
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
11
+ Received-SPF: pass (google.com: domain of unces@wb.example.com designates 11.1.1.1 as permitted sender) client-ip=11.1.1.1;
12
+ Authentication-Results: mx.google.com;
13
+ spf=pass (google.com: domain of ounces@wb.example.com designates 11.1.1.1 as permitted sender) smtp.mailfrom=ounces@wb.example.com;
14
+ dkim=pass header.i=@example.com;
15
+ dmarc=pass (p=NONE dis=NONE) header.from=example.com
16
+ DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=jan2013.pm; d=example.com;
17
+ h=From:Date:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:To:Reply-To:Message-ID; i=igor@example.com;
18
+ bh=PzwfK1FvIpe5JXJSkPKh5z/fDTY=;
19
+ b=Y8QAdWtGwwC9QSXtVQ+QJzOt+dzOm+WrOCJ/dnGbD8eBKYuEBRxwo18FqmSIP7petsfqU3NIXK85
20
+ uF7yvyaBdMkafiKrR4du+TFTf+QBfsOoSrCIvKhCqnRgTEeL/niuYMbjNDrUNWcxq5VvUWKrtyjf
21
+ cvyZhxW2Cwdbd5nZ2NM=
22
+ DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=jan2013.pm; d=example.com;
23
+ b=S7CL7EMB1XKFCedi2NHfRSxWEnzBXnt6f48UxDcpGBWQGRj5b53isqmr5dnwAvP+q6HdQDc0rDgk
24
+ hXnckMTHE1p1MmeBSvETDB+FU4VXnA4CaAfeRTf+rUZlz1w5d/aWKqBSa9kPJQvwQrCypxqcPJql
25
+ 7K0YKl5PtWP3D5gn/KU=;
26
+ Received: by sc-exam.mtasv.net id hev51u1jk5kd for <igor@example.com>; Mon, 21 Dec 2015 04:45:03 -0500 (envelope-from <ounces@wb.example.com>)
27
+ X-IADB-IP: 11.1.1.1
28
+ X-IADB-IP-REVERSE: 11.1.1.2
29
+ From: "John Smith" <igor@example.com>
30
+ Date: Mon, 21 Dec 2015 04:45:03 -0500
31
+ Subject: =?UTF-8?Q?E-Mail=20beispiels=20m=C3=B6glich=201=20?=
32
+ MIME-Version: 1.0
33
+ Content-Type: text/html; charset=UTF-8
34
+ Content-Transfer-Encoding: quoted-printable
35
+ X-Mailer: aspNetEmail ver 4.0.0.38
36
+ X-PM-RCPT: |bTB8MjA3NDd8MTYzODZ8aWJhbG9zaC50ZXN0aW5nQGdtYWlsLmNv11==|
37
+ X-PM-Message-Id: 1fb4ccd8-fe62-4424-a0aa-a30b281b9631
38
+ To: igor@example.com
39
+ Message-ID: <5677ca1e87ee0_de33fee2381c080708d8@Johns-MacBook-Pro.local.mail>
40
+
41
+ <=21DOCTYPE html>=0A<html>=0A=0A<body>=0A<h1>My First Heading</h1>=0A<p>M=
42
+ y first paragraph=2E</p>=0A<p>My first paragraph S=C3=BC=C3=9Fe =2E</p>=0A=
43
+ =0A<img src=3D=22http://ea=2Epstmrk=2Eit/open/MjA3NDdfMTYzODZfb3ZlcjUwXzh=
44
+ mYjRjY2Q4LWZlNjItNDQyNC1hMGFhLWEzMGIyODFiOTYzMF9pYmFsb3NoLnRlc3RpbmdAZ21h=
45
+ aWwuY29t=22 width=3D=221=22 height=3D=221=22 border=3D=220=22 /></body>=0A=
46
+ </html>
data/spec/data/email2.txt CHANGED
@@ -8,4 +8,4 @@ Content-Type: text/plain;
8
8
  charset=UTF-8
9
9
  Content-Transfer-Encoding: 7bit
10
10
 
11
- test body 1878275
11
+ test body 1878278
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe MailHandler::Receiving::FolderChecker do
@@ -131,7 +132,7 @@ describe MailHandler::Receiving::FolderChecker do
131
132
 
132
133
  it 'by recipient' do
133
134
 
134
- checker.find({:by_recipient => { to: 'igor@example.com'} })
135
+ checker.find({:by_recipient => { to: 'igor+nonexisting@example.com'} })
135
136
  expect(checker.found_emails).to be_empty
136
137
 
137
138
  end
@@ -161,6 +162,13 @@ describe MailHandler::Receiving::FolderChecker do
161
162
 
162
163
  end
163
164
 
165
+ it 'by content' do
166
+
167
+ checker.find({:by_content => '1878271'})
168
+ expect(checker.found_emails.size).to be 1
169
+
170
+ end
171
+
164
172
  it 'by subject - multiple' do
165
173
 
166
174
  checker.find({:by_subject => 'test'})
@@ -183,7 +191,7 @@ describe MailHandler::Receiving::FolderChecker do
183
191
  it 'by date' do
184
192
 
185
193
  checker.find({:by_date => Time.new(2015,10,12,13,30,0, "+02:00")})
186
- expect(checker.found_emails.size).to be 2
194
+ expect(checker.found_emails.size).to be 4
187
195
 
188
196
  end
189
197
 
@@ -197,6 +205,24 @@ describe MailHandler::Receiving::FolderChecker do
197
205
 
198
206
  end
199
207
 
208
+ context 'unicode' do
209
+
210
+ it 'by subject - cyrillic' do
211
+
212
+ checker.find({:by_subject => 'Е-маил пример'})
213
+ expect(checker.found_emails.size).to be 1
214
+
215
+ end
216
+
217
+ it 'by subject - german' do
218
+
219
+ checker.find({:by_subject => 'möglich'})
220
+ expect(checker.found_emails.size).to be 1
221
+
222
+ end
223
+
224
+ end
225
+
200
226
  context 'archiving emails' do
201
227
 
202
228
  before(:each) {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailhandler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Balos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2015-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -62,7 +62,8 @@ files:
62
62
  - lib/mailhandler/errors.rb
63
63
  - lib/mailhandler/receiver.rb
64
64
  - lib/mailhandler/receiving/base.rb
65
- - lib/mailhandler/receiving/filter.rb
65
+ - lib/mailhandler/receiving/file_filter/base.rb
66
+ - lib/mailhandler/receiving/file_filter/filter.rb
66
67
  - lib/mailhandler/receiving/folder.rb
67
68
  - lib/mailhandler/receiving/imap.rb
68
69
  - lib/mailhandler/receiving/notification/console.rb
@@ -78,6 +79,8 @@ files:
78
79
  - lib/mailhandler/version.rb
79
80
  - mailhandler.gemspec
80
81
  - readme.md
82
+ - spec/data/email-uni1.txt
83
+ - spec/data/email-uni2.txt
81
84
  - spec/data/email1.txt
82
85
  - spec/data/email2.txt
83
86
  - spec/spec_helper.rb
@@ -1,163 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Filter
4
-
5
- class Base
6
-
7
- def Base.sort(files)
8
-
9
- swapped = true
10
- j = 0
11
-
12
- while swapped do
13
-
14
- swapped = false
15
- j+=1
16
-
17
- (files.size - j).times do |i|
18
-
19
- if File.new(files[i]).ctime < File.new(files[i + 1]).ctime
20
- tmp = files[i]
21
- files[i] = files[i + 1]
22
- files[i + 1] = tmp
23
- swapped = true
24
-
25
- end
26
-
27
- end
28
-
29
- end
30
-
31
- files
32
-
33
- end
34
-
35
- def get(pattern)
36
-
37
- files = []
38
- Dir.glob(pattern).each { |file| files << File.absolute_path(file) }
39
- files
40
-
41
- end
42
-
43
- end
44
-
45
- class ByFilename < Base
46
-
47
- def get(pattern)
48
-
49
- super(pattern)
50
-
51
- end
52
-
53
- end
54
-
55
- class ByContent < Base
56
-
57
- def initialize(content)
58
-
59
- @content = content.to_s
60
-
61
- end
62
-
63
- def get(pattern)
64
-
65
- files = super(pattern)
66
-
67
- matched_files = []
68
-
69
- files.each do |file|
70
-
71
- begin
72
-
73
- content = File.read(file)
74
- matched_files << file if content.include? @content
75
-
76
- rescue
77
-
78
- # skip file reading if file is not there anymore
79
-
80
- end
81
-
82
- end
83
-
84
- matched_files
85
-
86
- end
87
-
88
- end
89
-
90
- class ByDate < Base
91
-
92
- def initialize(date)
93
-
94
- @date = date
95
-
96
- end
97
-
98
- def get(pattern)
99
-
100
- files = super(pattern)
101
- files.select { |filename|
102
-
103
- file = nil
104
- begin
105
-
106
- file = File.new(filename)
107
-
108
- rescue
109
-
110
- # skip file reading if file is not there anymore
111
-
112
- end
113
-
114
- file.ctime > @date if (file != nil)
115
-
116
- }
117
-
118
- end
119
-
120
- end
121
-
122
- module Email
123
-
124
- class ByRecipient < Base
125
-
126
- def initialize(recipient)
127
-
128
- @recipient = recipient
129
-
130
- end
131
-
132
- def get(pattern)
133
-
134
- files = super(pattern)
135
-
136
- matched_files = []
137
-
138
- files.each do |file|
139
-
140
- begin
141
-
142
- content = File.read(file)
143
-
144
- email = Mail.read_from_string(content)
145
- matched_files << file if email[@recipient.keys.first].to_s.include? @recipient.values.first
146
-
147
- rescue
148
-
149
- # skip file reading if file is not there anymore
150
-
151
- end
152
-
153
- end
154
-
155
- matched_files
156
-
157
- end
158
-
159
- end
160
-
161
- end
162
-
163
- end