Skip to content
Snippets Groups Projects
process_email_stack.php 7.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    <?php
    
    /******************************************************************************/
    // load the config and prepare to process
    include('load_process_email_stack.php');
    $state = 'LOAD_EMAILS';
    while ($state <> 'END') {
    
        Bt_writeLog(['level' => 'INFO', 'message' => 'STATE:' . $state]);
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
        switch ($state) {
    
            /**********************************************************************/
            /*                          LOAD_NOTIFS                               */
            /* List the stack to proceed                                          */
            /**********************************************************************/
            case 'LOAD_EMAILS':
                $emails = \Notification\models\NotificationsEmailsModel::get(['select' => ['*'], 'where' => ['exec_date is NULL'], 'data' => []]);
                $totalEmailsToProcess = count($emails);
                $currentEmail = 0;
                if ($totalEmailsToProcess === 0) {
                    Bt_exitBatch(0, 'No notification to send');
                }
                Bt_writeLog(['level' => 'INFO', 'message' => $totalEmailsToProcess . ' notification(s) to send.']);
                $state  = 'SEND_AN_EMAIL';
                $err    = 0;
                $errTxt = '';
                break;
                
            /**********************************************************************/
            /*                          SEND_AN_EMAIL                                 */
            /* Load parameters and send an e-mail                                    */
            /**********************************************************************/
            case 'SEND_AN_EMAIL':
                $configuration = \Configuration\models\ConfigurationModel::getByService(['service' => 'admin_email_server', 'select' => ['value']]);
                foreach ($emails as $key => $email) {
                    $configuration = json_decode($configuration['value'], true);
                    if (empty($configuration)) {
                        Bt_exitBatch(110, 'Configuration admin_email_server is missing');
                    }
                    
                    $phpmailer = new \PHPMailer\PHPMailer\PHPMailer();
                    $phpmailer->setFrom($configuration['from'], $configuration['from']);
                    if (in_array($configuration['type'], ['smtp', 'mail'])) {
                        if ($configuration['type'] == 'smtp') {
                            $phpmailer->isSMTP();
                        } elseif ($configuration['type'] == 'mail') {
                            $phpmailer->isMail();
                        }
    
                        $phpmailer->Host = $configuration['host'];
                        $phpmailer->Port = $configuration['port'];
                        $phpmailer->SMTPAutoTLS = false;
                        if (!empty($configuration['secure'])) {
                            $phpmailer->SMTPSecure = $configuration['secure'];
                        }
                        $phpmailer->SMTPAuth = $configuration['auth'];
                        if ($configuration['auth']) {
                            $phpmailer->Username = $configuration['user'];
                            if (!empty($configuration['password'])) {
                                $phpmailer->Password = \SrcCore\models\PasswordModel::decrypt(['cryptedPassword' => $configuration['password']]);
                            }
                        }
                    } elseif ($configuration['type'] == 'sendmail') {
                        $phpmailer->isSendmail();
                    } elseif ($configuration['type'] == 'qmail') {
                        $phpmailer->isQmail();
                    }
    
                    $phpmailer->CharSet = $configuration['charset'];
            
                    $phpmailer->addAddress($email['recipient']);
            
                    $phpmailer->isHTML(true);
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
                    $email['html_body'] = str_replace('#and#', '&', $email['html_body']);
                    $email['html_body'] = str_replace("\''", "'", $email['html_body']);
                    $email['html_body'] = str_replace("\'", "'", $email['html_body']);
                    $email['html_body'] = str_replace("''", "'", $email['html_body']);
        
                    $dom = new \DOMDocument();
                    $internalErrors = libxml_use_internal_errors(true);
                    $dom->loadHTML($email['html_body'], LIBXML_NOWARNING);
                    libxml_use_internal_errors($internalErrors);
                    $images = $dom->getElementsByTagName('img');
        
                    foreach ($images as $key => $image) {
                        $originalSrc = $image->getAttribute('src');
                        if (preg_match('/^data:image\/(\w+);base64,/', $originalSrc)) {
                            $encodedImage = substr($originalSrc, strpos($originalSrc, ',') + 1);
                            $imageFormat = substr($originalSrc, 11, strpos($originalSrc, ';') - 11);
                            $phpmailer->addStringEmbeddedImage(base64_decode($encodedImage), "embeded{$key}", "embeded{$key}.{$imageFormat}");
                            $email['html_body'] = str_replace($originalSrc, "cid:embeded{$key}", $email['html_body']);
    
                    }
            
                    $phpmailer->Subject = $email['subject'];
                    $phpmailer->Body = $email['html_body'];
                    if (empty($email['html_body'])) {
                        $phpmailer->AllowEmpty = true;
                    }
            
                    if ($email['attachments'] != '') {
                        $attachments = explode(',', $email['attachments']);
                        foreach ($attachments as $num => $attachment) {
                            if (is_file($attachment)) {
                                $ext  = strrchr($attachment, '.');
                                $name = str_pad(($num + 1), 4, '0', STR_PAD_LEFT) . $ext;
                                $phpmailer->addStringAttachment(file_get_contents($attachment), $name);
                            }
    
            
                    $phpmailer->Timeout = 30;
                    $phpmailer->SMTPDebug = 1;
                    $phpmailer->Debugoutput = function ($str) {
                        if (strpos($str, 'SMTP ERROR') !== false) {
    
                            \History\controllers\HistoryController::add([
    
                                'tableName'    => 'emails',
                                'recordId'     => 'email',
                                'eventType'    => 'ERROR',
                                'eventId'      => 'sendEmail',
    
                                'info'         => $str
                            ]);
                        }
                    };
            
                    $isSent = $phpmailer->send();
                    if ($isSent) {
                        $exec_result = 'SENT';
                        Bt_writeLog(['level' => 'INFO', 'message' => "notification sent"]);
                    } else {
                        $err++;
                        Bt_writeLog(['level' => 'ERROR', 'message' => "SENDING EMAIL ERROR ! (" . $phpmailer->ErrorInfo.")"]);
                        $errTxt = ' (Last Error : '.$phpmailer->ErrorInfo.')';
                        $exec_result = 'FAILED';
                        $GLOBALS['exitCode'] = 108;
                    }
    
                    \Notification\models\NotificationsEmailsModel::update([
                        'set'   => ['exec_date' => 'CURRENT_TIMESTAMP', 'exec_result' => $exec_result],
                        'where' => ['email_stack_sid = ?'],
    
                        'data'  => [$email['email_stack_sid']]
    
                $state = 'END';
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    }
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    $emailSent = $totalEmailsToProcess - $err;
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    
    
    Bt_writeLog(['level' => 'INFO', 'message' => $emailSent.' notification(s) sent']);
    Bt_writeLog(['level' => 'INFO', 'message' => 'End of process']);
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    Bt_logInDataBase(
    
        $totalEmailsToProcess,
        $err,
        $emailSent.' notification(s) sent'.$errTxt
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    );
    
    Alex ORLUC's avatar
    Alex ORLUC committed
    Bt_updateWorkBatch();
    
    Giovannoni Laurent's avatar
    Giovannoni Laurent committed
    exit($GLOBALS['exitCode']);