MailAttachmentsSaver.php 4.04 KB
<?php
/**
 * Created by PhpStorm.
 * User: Cibermag
 * Date: 01.09.2015
 * Time: 10:53
 */

namespace common\components\mail;


use common\components\CustomVarDamp;

class MailAttachmentsSaver
{
    protected $mail_reader;
    protected $massage_type;
    public $file_name_prefix;

    public function __construct( MailReader $mail_reader, $massage_type )
    {
        $this->mail_reader = $mail_reader;
        $this->massage_type = $massage_type;

    }


    public function saveAttachmentsTo( $destination )
    {

        $emails = $this->mail_reader->getEmails( $this->massage_type );

        /* if emails are returned, cycle through each... */

        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'] = imap_fetchbody($this->mail_reader->connection, $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']);
                                        }
                                    mb_internal_encoding("UTF-8");

                                    //file_put_contents(\Yii::getAlias('@temp_upload') . '/' . $name, $val['attachment']);
                                    file_put_contents( $name, $val['attachment'] );
                                }

                            }
                        }

                    }

                }

            }

        }
}