MailAttachmentsSaver.php
5.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
<?php
/**
* Created by PhpStorm.
* User: Cibermag
* Date: 01.09.2015
* Time: 10:53
*/
namespace common\components\mail;
/**
* Class MailAttachmentsSaver
* @package common\components\mail
* сохраняет вложения в указанную папку по полученому соединению к ящику,
* а также хранит имена сохраненных файлов
*/
class MailAttachmentsSaver
{
/**
* @var соединение с ящиком - экземляр класса - MailReader
*/
protected $mail_reader;
/**
* @var - string, тип сообщений - например UNSEEN. Значения можно перечислять разделяя запятой.
*/
protected $massage_type;
/**
* @var array - после сохранения будет содержать сохраненные файлы, ключ - путь к файлу, значение - расширение
*/
protected $saved_files_arr = [];
/**
* @var - префикс который будет прибавлен к оригинальному имени сохраняемого файла
*/
protected $file_name_prefix;
public function __construct(MailReader $mail_reader)
{
$this->mail_reader = $mail_reader;
$this->saved_files_arr = [];
}
/**
* @param mixed $file_name_prefix
*/
public function setFileNamePrefix($file_name_prefix)
{
$this->file_name_prefix = $file_name_prefix;
}
public function saveAttachmentsTo( $destination, $massage_type )
{
$this->massage_type = $massage_type;
$emails = $this->mail_reader->getEmails($this->massage_type);
/* if emails are returned, cycle through each... */
$result = false;
if ($emails) {
/* begin output var */
$output = '';
/* put the newest emails on top */
rsort($emails);
// CustomVarDamp::dump($emails);
foreach ($emails as $email_number) {
$structure = $this->mail_reader->getCurrentEmailStructure($email_number);
$attachments = array();
if (isset($structure->parts) && count($structure->parts)) {
for ($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = array(
'is_attachment' => false,
'filename' => '',
'name' => '',
'attachment' => '');
if ($structure->parts[$i]->ifdparameters) {
foreach ($structure->parts[$i]->dparameters as $object) {
if (strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['filename'] = $object->value;
}
}
}
if ($structure->parts[$i]->ifparameters) {
foreach ($structure->parts[$i]->parameters as $object) {
if (strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
}
}
}
if ($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = $this->mail_reader->getEmailBody($email_number, $i + 1);
if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
} elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
}
}
if (count($attachments) != 0) {
foreach ($attachments as $key => &$val) {
if ($val['is_attachment'] == 1) {
if (isset($this->file_name_prefix)) {
$name = $destination . '/' . $this->file_name_prefix . mb_decode_mimeheader($val['name']);
} else {
$name = $destination . '/' . mb_decode_mimeheader($val['name']);
}
$ext = pathinfo($name, PATHINFO_EXTENSION);
mb_internal_encoding("UTF-8");
file_put_contents($name, $val['attachment']);
// все извлеченные файлы сохраняем в $this->saved_files_arr
$this->setSavedFile( $name , $ext );
$result = true;
}
}
}
}
}
}
return $result;
}
/**
* @return array - массив извлеченных файлов
*/
public function getSavedFilesArr()
{
return $this->saved_files_arr;
}
/**
* @param array $saved_files_arr
*/
public function setSavedFile($saved_file, $saved_file_ext)
{
$this->saved_files_arr[$saved_file] = $saved_file_ext;
}
}