4
4
5
5
use Illuminate \Container \Container ;
6
6
use Illuminate \Support \Facades \Event ;
7
- use Webkul \Core \Eloquent \Repository ;
7
+ use Illuminate \Support \Facades \Mail ;
8
+ use Webkul \Email \Mails \Email ;
8
9
use Webkul \Email \Helpers \Parser ;
10
+ use Webkul \Email \Helpers \Htmlfilter ;
11
+ use Webkul \Core \Eloquent \Repository ;
9
12
10
13
class EmailRepository extends Repository
11
14
{
12
15
/**
13
- * ThreadRepository object
16
+ * AttachmentRepository object
14
17
*
15
- * @var \Webkul\Attribute \Repositories\ThreadRepository
18
+ * @var \Webkul\Email \Repositories\AttachmentRepository
16
19
*/
17
- protected $ threadRepository ;
20
+ protected $ attachmentRepository ;
18
21
19
22
/**
20
23
* Parser object
@@ -23,24 +26,35 @@ class EmailRepository extends Repository
23
26
*/
24
27
protected $ emailParser ;
25
28
29
+ /**
30
+ * Htmlfilter object
31
+ *
32
+ * @var \Webkul\Email\Helpers\Htmlfilter
33
+ */
34
+ protected $ htmlFilter ;
35
+
26
36
/**
27
37
* Create a new repository instance.
28
38
*
29
- * @param \Webkul\Attribute \Repositories\ThreadRepository $threadRepository
39
+ * @param \Webkul\Email \Repositories\AttachmentRepository $attachmentRepository
30
40
* @param \Webkul\Email\Helpers\Parser $emailParser
41
+ * @param \Webkul\Email\Helpers\Htmlfilter $htmlFilter
31
42
* @param \Illuminate\Container\Container $container
32
43
* @return void
33
44
*/
34
45
public function __construct (
35
- ThreadRepository $ threadRepository ,
46
+ AttachmentRepository $ attachmentRepository ,
36
47
Parser $ emailParser ,
48
+ Htmlfilter $ htmlFilter ,
37
49
Container $ container
38
50
)
39
51
{
40
- $ this ->threadRepository = $ threadRepository ;
52
+ $ this ->attachmentRepository = $ attachmentRepository ;
41
53
42
54
$ this ->emailParser = $ emailParser ;
43
55
56
+ $ this ->htmlFilter = $ htmlFilter ;
57
+
44
58
parent ::__construct ($ container );
45
59
}
46
60
@@ -60,15 +74,14 @@ function model()
60
74
*/
61
75
public function create (array $ data )
62
76
{
63
- $ email = parent ::create (array_merge ($ data , [
77
+ $ email = parent ::create (array_merge ($ this ->sanitizeEmails ($ data ), [
78
+ 'unique_id ' => ! isset ($ data ['parent_id ' ]) ? time () . '@example.com ' : null ,
64
79
'message_id ' => $ data ['message_id ' ] ?? time () . '@example.com ' ,
65
80
]));
66
81
67
- $ thread = $ this ->threadRepository ->create (array_merge ($ data , [
68
- 'type ' => 'create ' ,
69
- 'message_id ' => $ email ->message_id ,
70
- 'email_id ' => $ email ->id ,
71
- ]));
82
+ $ this ->attachmentRepository ->setEmailParser ($ this ->emailParser )->uploadAttachments ($ email , $ data );
83
+
84
+ Mail::send (new Email ($ email ));
72
85
73
86
return $ email ;
74
87
}
@@ -81,6 +94,16 @@ public function processInboundParseMail($content)
81
94
{
82
95
$ this ->emailParser ->setText ($ content );
83
96
97
+ $ email = $ this ->findOneWhere (['message_id ' => $ this ->emailParser ->getHeader ('message-id ' )]);
98
+
99
+ if ($ email ) {
100
+ return ;
101
+ }
102
+
103
+ if (! $ fromNameParts = mailparse_rfc822_parse_addresses ($ this ->emailParser ->getHeader ('from ' ))) {
104
+ $ fromNameParts = mailparse_rfc822_parse_addresses ($ this ->emailParser ->getHeader ('sender ' ));
105
+ }
106
+
84
107
$ headers = [
85
108
'from ' => $ this ->parseEmailAddress ('from ' ),
86
109
'sender ' => $ this ->parseEmailAddress ('sender ' ),
@@ -89,56 +112,60 @@ public function processInboundParseMail($content)
89
112
'bcc ' => $ this ->parseEmailAddress ('bcc ' ),
90
113
'subject ' => $ this ->emailParser ->getHeader ('subject ' ),
91
114
'source ' => 'email ' ,
92
- 'name ' => $ headers [ ' from ' ] == $ from [0 ]['display ' ]
93
- ? current (explode ('@ ' , $ from [0 ]['display ' ]))
94
- : $ from [0 ]['display ' ],
115
+ 'name ' => $ fromNameParts [ 0 ][ ' display ' ] == $ fromNameParts [0 ]['address ' ]
116
+ ? current (explode ('@ ' , $ fromNameParts [0 ]['display ' ]))
117
+ : $ fromNameParts [0 ]['display ' ],
95
118
'user_type ' => 'person ' ,
96
119
'message_id ' => $ this ->emailParser ->getHeader ('message-id ' ) ?? time () . '@example.com ' ,
97
120
'reference_ids ' => htmlspecialchars_decode ($ this ->emailParser ->getHeader ('references ' )),
98
121
'in_reply_to ' => htmlspecialchars_decode ($ this ->emailParser ->getHeader ('in-reply-to ' )),
99
122
];
100
123
101
- foreach ($ toAdress as $ to ) {
124
+ foreach ($ headers [ ' reply_to ' ] as $ to ) {
102
125
if ($ email = $ this ->findOneWhere (['message_id ' => $ to ])) {
103
126
break ;
104
127
}
105
128
}
106
129
107
130
if (! isset ($ email ) && $ headers ['in_reply_to ' ]) {
108
- $ email = $ this ->threadRepository ->findOneWhere ([['reference_ids ' , 'like ' , $ headers ['in_reply_to ' ]]]);
131
+ $ email = $ this ->findOneWhere (['message_id ' => $ headers ['in_reply_to ' ]]);
132
+
133
+ if (! $ email ) {
134
+ $ email = $ this ->findOneWhere ([['reference_ids ' , 'like ' , '% ' . $ headers ['in_reply_to ' ] . '% ' ]]);
135
+ }
109
136
}
110
137
111
138
if (! isset ($ email ) && $ headers ['reference_ids ' ]) {
112
139
$ referenceIds = explode (' ' , $ headers ['reference_ids ' ]);
113
140
114
141
foreach ($ referenceIds as $ referenceId ) {
115
- if ($ email = $ this ->threadRepository -> findOneWhere ([['reference_ids ' , 'like ' , $ referenceId ]])) {
142
+ if ($ email = $ this ->findOneWhere ([['reference_ids ' , 'like ' , ' % ' . $ referenceId . ' % ' ]])) {
116
143
break ;
117
144
}
118
145
}
119
146
}
120
147
148
+ if (! $ reply = $ this ->emailParser ->getMessageBody ('text ' )) {
149
+ $ reply = $ this ->emailParser ->getTextMessageBody ();
150
+ }
151
+
121
152
if (! isset ($ email )) {
122
153
$ email = $ this ->create (array_merge ($ headers , [
123
- 'reference_ids ' => $ headers ['message_id ' ],
124
- ]));
125
-
126
- $ thread = $ this ->threadRepository ->setEmailParser ($ this ->emailParser )->create (array_merge ($ headers , [
127
- 'type ' => 'create ' ,
154
+ 'reply ' => $ this ->htmlFilter ->HTMLFilter ($ reply , '' ),
155
+ 'reference_ids ' => [$ headers ['message_id ' ]],
128
156
'user_type ' => 'person ' ,
129
- 'reference_ids ' => $ headers ['message_id ' ],
130
157
]));
131
158
} else {
132
- $ thread = $ this ->threadRepository ->findOneWhere (['message_id ' => $ headers ['message_id ' ]]);
133
-
134
- if ($ thread ) {
135
- return ;
136
- }
137
-
138
159
// Create person or admin if both are note exists (Optional)
139
160
140
- $ this ->threadRepository ->setEmailParser ($ this ->emailParser )->create (array_merge ($ headers , [
141
- 'type ' => 'reply ' ,
161
+ $ this ->update ([
162
+ 'reference_ids ' => array_merge ($ email ->reference_ids ?? [], [$ headers ['message_id ' ]]),
163
+ ], $ email ->id );
164
+
165
+ $ this ->create (array_merge ($ headers , [
166
+ 'reply ' => $ this ->htmlFilter ->HTMLFilter ($ reply , '' ),
167
+ 'parent_id ' => $ email ->id ,
168
+ 'user_type ' => 'person ' ,
142
169
]));
143
170
}
144
171
}
@@ -149,20 +176,35 @@ public function processInboundParseMail($content)
149
176
*/
150
177
public function parseEmailAddress ($ type )
151
178
{
152
- $ addresses = mailparse_rfc822_parse_addresses ($ this ->emailParser ->getHeader ($ type ));
153
-
154
- if (count ($ addresses ) <= 1 ) {
155
- return [$ addresses [0 ]['address ' ]];
156
- }
157
-
158
179
$ emails = [];
159
180
160
- foreach ($ addresses as $ address ) {
161
- if (filter_var ($ address ['address ' ], FILTER_VALIDATE_EMAIL )) {
162
- $ emails [] = $ address ['address ' ];
181
+ $ addresses = mailparse_rfc822_parse_addresses ($ this ->emailParser ->getHeader ($ type ));
182
+
183
+ if (count ($ addresses ) > 1 ) {
184
+ foreach ($ addresses as $ address ) {
185
+ if (filter_var ($ address ['address ' ], FILTER_VALIDATE_EMAIL )) {
186
+ $ emails [] = $ address ['address ' ];
187
+ }
163
188
}
189
+ } else if ($ addresses ) {
190
+ $ emails [] = $ addresses [0 ]['address ' ];
164
191
}
165
192
166
193
return $ emails ;
167
194
}
195
+
196
+ /**
197
+ * @param array $data
198
+ * @return array
199
+ */
200
+ public function sanitizeEmails (array $ data )
201
+ {
202
+ $ data ['reply_to ' ] = array_values (array_filter ($ data ['reply_to ' ]));
203
+
204
+ $ data ['cc ' ] = array_values (array_filter ($ data ['cc ' ]));
205
+
206
+ $ data ['bcc ' ] = array_values (array_filter ($ data ['bcc ' ]));
207
+
208
+ return $ data ;
209
+ }
168
210
}
0 commit comments