mail2cb 0.0.6 → 0.0.8

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,63 @@
1
+ module Mail2cb
2
+ class MessageIdHandler
3
+
4
+ def initialize(email)
5
+ @email = email
6
+
7
+ @content = EmailContent.new(@email)
8
+ end
9
+
10
+ def message_id
11
+ from_headers || from_subject || from_body
12
+ end
13
+
14
+ def hash
15
+ if message_id
16
+ match = /([a-z]*?)\.([a-z0-9]*?)\.([a-z0-9]*?)@mail.caseblocks.com/.match(message_id)
17
+ if match
18
+ if match[1] == "conversation"
19
+ {"conversation_id" => match[2]}
20
+ elsif match[1] == "case"
21
+ {"case_id" => match[2]}
22
+ else
23
+ {match[1] => match[2]}
24
+ end
25
+ end
26
+ else
27
+ {}
28
+ end
29
+ end
30
+
31
+ def from_headers
32
+ references.reverse.detect{|id| find_in_content(id) }
33
+ end
34
+ def from_subject
35
+ find_in_content(@email.subject)
36
+ end
37
+ def from_body
38
+ find_in_content(@content.html) || find_in_content(@content.text)
39
+ end
40
+ def references
41
+ refs = @email.header["References"]
42
+ begin
43
+ if refs && refs.field.errors.empty?
44
+ return refs.field.element.message_ids
45
+ end
46
+ rescue
47
+ ap @email.header["References"]
48
+ end
49
+ []
50
+ end
51
+
52
+ private
53
+ def find_in_content(content)
54
+ match = /([a-z]*?)\.([a-z0-9]*?)\.([a-z0-9]*?)@mail.caseblocks.com/.match(content)
55
+ if match
56
+ match[0]
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ end
63
+ end
@@ -1,3 +1,3 @@
1
1
  module Mail2cb
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.8"
3
3
  end
data/lib/mail2cb.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require_relative 'mail2cb/version'
2
2
  require_relative 'mail2cb/helpers'
3
- require_relative 'mail2cb/email_body_parser'
3
+ require_relative 'mail2cb/email_body_cleanser'
4
+ require_relative 'mail2cb/email_content'
4
5
  require_relative 'mail2cb/email_watcher'
5
6
  require_relative 'mail2cb/email_handler'
6
7
  require_relative 'mail2cb/encryption'
8
+ require_relative 'mail2cb/message_id_handler'
7
9
  require 'sinatra/base'
8
10
  require 'json'
9
11
  require 'open3'
@@ -16,6 +18,7 @@ module Mail2cb
16
18
  @@watcher = EmailWatcher.new
17
19
 
18
20
  @@watcher.start
21
+ Thread.abort_on_exception = true
19
22
 
20
23
  my_app = Sinatra.new do
21
24
  set :logging, false
data/mail2cb.gemspec CHANGED
@@ -21,15 +21,21 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "awesome_print"
24
+ spec.add_development_dependency "rspec"
25
+ spec.add_development_dependency "timecop"
26
+ spec.add_development_dependency "mock-aws-s3"
27
+
28
+
24
29
 
25
30
  spec.add_dependency 'mysql2'
26
- spec.add_dependency 'sidekiq'
27
31
  spec.add_dependency 'mail'
28
- spec.add_dependency 'mail_daemon', "~> 0.0.6"
29
- spec.add_dependency 'charlock_holmes' # required for sidekiq delivery
32
+ spec.add_dependency 'mail_daemon', "~> 0.0.8"
30
33
  spec.add_dependency 'nokogiri'
31
34
  spec.add_dependency 'sinatra'
32
35
  spec.add_dependency 'sanitize'
33
-
36
+ spec.add_dependency 'faye'
37
+ spec.add_dependency 'redis'
38
+ spec.add_dependency 'aws-s3'
39
+ spec.add_dependency 'rest-client', '~> 1.8'
34
40
 
35
41
  end
@@ -0,0 +1,5 @@
1
+ From: Stewart McKee <stewart@emergeadapt.com>
2
+ To: Stewart McKee <stewart@caseblocks.com>
3
+ Subject: Re: Test Conversation
4
+
5
+ This is a bare bones email
data/samples/reply.txt ADDED
@@ -0,0 +1,226 @@
1
+ Delivered-To: stewart@activeinformationdesign.com
2
+ Received: by 10.112.147.106 with SMTP id tj10csp538989lbb;
3
+ Thu, 14 Apr 2016 04:09:36 -0700 (PDT)
4
+ X-Received: by 10.28.154.4 with SMTP id c4mr16610816wme.88.1460632176711;
5
+ Thu, 14 Apr 2016 04:09:36 -0700 (PDT)
6
+ Return-Path: <stewart@emergeadapt.com>
7
+ Received: from mail-wm0-x235.google.com (mail-wm0-x235.google.com. [2a00:1450:400c:c09::235])
8
+ by mx.google.com with ESMTPS id y77si34280990wmc.98.2016.04.14.04.09.36
9
+ for <stewart@activeinformationdesign.com>
10
+ (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
11
+ Thu, 14 Apr 2016 04:09:36 -0700 (PDT)
12
+ Received-SPF: neutral (google.com: 2a00:1450:400c:c09::235 is neither permitted nor denied by domain of stewart@emergeadapt.com) client-ip=2a00:1450:400c:c09::235;
13
+ Authentication-Results: mx.google.com;
14
+ dkim=pass header.i=@emergeadapt-com.20150623.gappssmtp.com;
15
+ spf=neutral (google.com: 2a00:1450:400c:c09::235 is neither permitted nor denied by domain of stewart@emergeadapt.com) smtp.mailfrom=stewart@emergeadapt.com
16
+ Received: by mail-wm0-x235.google.com with SMTP id u206so120243608wme.1
17
+ for <stewart@activeinformationdesign.com>; Thu, 14 Apr 2016 04:09:36 -0700 (PDT)
18
+ DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
19
+ d=emergeadapt-com.20150623.gappssmtp.com; s=20150623;
20
+ h=date:from:to:message-id:in-reply-to:references:subject:mime-version;
21
+ bh=pEIuGA/L/KBb8JXNV05lDAXhrHJJO1bDikKNmqibKv8=;
22
+ b=TUR4KQf1kPHO1yudZMQLjY1LNRuN5dwO7JUdGsKNUGsfJGKWKBqa4yCyQpSwPt4TPJ
23
+ WiMN9vn7WI4NiiMqwXtsJ0LedGa3JTMdo45TGceR5VR44QPKFODVZQjAvvoNtRYyvu5b
24
+ 2S60uigKsQ47QEVam7sAf3b+EN3njXQMS9kz+i4mNj/OSJFDVdcJ6kLo8GB6RoCFZRBk
25
+ gw0UNyDyZN4jrPhClvYTi8G6riCxiDHUXi1dcK4FyoivZyoRum3VyTjgM3W/O4DMPjZq
26
+ /NUUY+TM9OjhJKGguf4/v3s41vAwHfsxtk2mRbotQqkB5i1qWTSwPYM/kS9dE7CU1BnC
27
+ IyfQ==
28
+ X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
29
+ d=1e100.net; s=20130820;
30
+ h=x-gm-message-state:date:from:to:message-id:in-reply-to:references
31
+ :subject:mime-version;
32
+ bh=pEIuGA/L/KBb8JXNV05lDAXhrHJJO1bDikKNmqibKv8=;
33
+ b=mGLXs9ZE38pLNw0s6KStos+p5JmriL2hJ+kZyWgM1suosxF0H/Rp6Y6dpFLDR/31EX
34
+ huPAEebeSnT4FvoNN+g3HLMcu6toXRqSMvxr6RNHkFFTULPw8VnoJMacVxQtlbtmf9yL
35
+ kFg4GjnKiF4tFKy/FB876ZPBock1ECCYmCKEkSz/PpbtSWrBr9D2fjeAnSF3TuBuoDMy
36
+ NG5XGN6wTxg476UCQgfsnbMtwmPomrideYR/a76rFnC0oNVw3hsTq4THxpNx9BAS8lA1
37
+ JeFi/wAAq+DgvCvxA5te3VcRJAUzVcaT+yQP685xHiHwRTeXrS8jx/Yqm8l6l8rfH7cb
38
+ ZsfQ==
39
+ X-Gm-Message-State: AOPr4FVwWTraJ6O4DIWopwj/7+yVELMwvM4q3pDk8Rzjv/ZjJGyMIKp8wBqB7NbACeaNgw==
40
+ X-Received: by 10.194.23.65 with SMTP id k1mr9421523wjf.31.1460632176232;
41
+ Thu, 14 Apr 2016 04:09:36 -0700 (PDT)
42
+ Return-Path: <stewart@emergeadapt.com>
43
+ Received: from Jordans-MacBook-Pro.local (host81-130-148-178.in-addr.btopenworld.com. [81.130.148.178])
44
+ by smtp.gmail.com with ESMTPSA id x2sm43379531wjr.33.2016.04.14.04.09.35
45
+ for <stewart@activeinformationdesign.com>
46
+ (version=TLSv1/SSLv3 cipher=OTHER);
47
+ Thu, 14 Apr 2016 04:09:35 -0700 (PDT)
48
+ Date: Thu, 14 Apr 2016 12:09:33 +0100
49
+ From: Stewart McKee <stewart@emergeadapt.com>
50
+ To: Stewart McKee <stewart@activeinformationdesign.com>
51
+ Message-ID: <etPan.570f7a6d.7b5aa127.137@emergeadapt.com>
52
+ In-Reply-To: <conversation.570f77bc81e9a825e2000001.570f7a1381e9a82659000001@mail.caseblocks.com>
53
+ References: <conversation.570f77bc81e9a825e2000001.570f7a1381e9a82659000001@mail.caseblocks.com>
54
+ Subject: Re: Test Conversation
55
+ X-Mailer: Airmail Beta (353)
56
+ MIME-Version: 1.0
57
+ Content-Type: multipart/alternative; boundary="570f7a6d_418e9138_137"
58
+
59
+ --570f7a6d_418e9138_137
60
+ Content-Type: text/plain; charset="utf-8"
61
+ Content-Transfer-Encoding: quoted-printable
62
+ Content-Disposition: inline
63
+
64
+
65
+
66
+
67
+
68
+ www.emergeadapt.com
69
+
70
+ Office: +44 141 632 8395
71
+ =C2=A0
72
+ =C2=A9 EmergeAdapt 2016
73
+ All Rights Reserved.
74
+ Registered in Scotland SC413041
75
+
76
+ On 14 April 2016 at 12:08:09, default=40emergeadapt.com (default=40emerge=
77
+ adapt.com) wrote:
78
+
79
+ Re: Test Conversation
80
+ =46rom: Stewart
81
+
82
+ Bulk Uplift: Bulk Uplift 36-002
83
+
84
+ =20
85
+
86
+ Test Reply 3
87
+
88
+ This message was sent at 14 Apr 11:08 GMT
89
+
90
+ Recipients Stewart
91
+
92
+ Click here to view the conversation history and the Bulk Uplift in detail=
93
+ .
94
+
95
+
96
+ --570f7a6d_418e9138_137
97
+ Content-Type: multipart/related; boundary="570f7a6d_5792cea9_137"
98
+
99
+ --570f7a6d_5792cea9_137
100
+ Content-Type: text/html; charset="utf-8"
101
+ Content-Transfer-Encoding: quoted-printable
102
+ Content-Disposition: inline
103
+
104
+ <html><head></head><body><h1>Sample html content</h1></body></html>
105
+ --570f7a6d_5792cea9_137
106
+ Content-Type: image/png
107
+ Content-Transfer-Encoding: base64
108
+ Content-ID: <E8B60400-F80F-4594-AA4C-D6932E7320DB>
109
+ Content-Disposition: inline; filename="D69E1746-1CEE-47FE-B7E2-8C64E6EC2C63.png"
110
+
111
+ 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
222
+ cymsCM6CD/8XkPVUi4gUoCMAAAAASUVORK5CYII=
223
+
224
+ --570f7a6d_5792cea9_137--
225
+
226
+ --570f7a6d_418e9138_137--