MailAttachmentsSaver.php 5.67 KB
<?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;
    }


}