Proyectos de Subversion LeadersLinked - Services

Rev

Rev 607 | Rev 609 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
345 www 2
declare(strict_types = 1);
1 efrain 3
namespace LeadersLinked\Command;
4
 
5
use Symfony\Component\Console\Command\Command;
6
use Symfony\Component\Console\Input\InputInterface;
345 www 7
// use Symfony\Component\Console\Input\InputOption;
1 efrain 8
use Symfony\Component\Console\Output\OutputInterface;
9
use Laminas\Db\Adapter\AdapterInterface;
10
use Laminas\Log\LoggerInterface;
11
use LeadersLinked\Mapper\EmailMapper;
12
use PHPMailer\PHPMailer\PHPMailer;
13
use LeadersLinked\Model\Email;
14
use Laminas\Mvc\I18n\Translator;
15
use LeadersLinked\Cache\CacheInterface;
16
 
17
class ProcessQueueEmailCommand extends Command
18
{
345 www 19
 
1 efrain 20
    /**
21
     *
22
     * @var \Laminas\Db\Adapter\AdapterInterface
23
     */
24
    private $adapter;
345 www 25
 
1 efrain 26
    /**
27
     *
28
     * @var \LeadersLinked\Cache\CacheInterface
29
     */
30
    private $cache;
345 www 31
 
1 efrain 32
    /**
33
     *
34
     * @var \Laminas\Log\LoggerInterface
35
     */
36
    private $logger;
345 www 37
 
1 efrain 38
    /**
39
     *
40
     * @var array
41
     */
42
    private $config;
345 www 43
 
1 efrain 44
    /**
45
     *
46
     * @var \Laminas\Mvc\I18n\Translator
47
     */
48
    private $translator;
345 www 49
 
1 efrain 50
    /**
51
     *
52
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
53
     * @param \LeadersLinked\Cache\CacheInterface $cache
345 www 54
     * @param
55
     *            \Laminas\Log\LoggerInterface
1 efrain 56
     * @param array $config
57
     * @param \Laminas\Mvc\I18n\Translator $translator
58
     */
59
    public function __construct($adapter, $cache, $logger, $config, $translator)
60
    {
345 www 61
        $this->adapter = $adapter;
62
        $this->cache = $cache;
63
        $this->logger = $logger;
64
        $this->config = $config;
65
        $this->translator = $translator;
66
 
1 efrain 67
        parent::__construct();
68
    }
69
 
606 stevensc 70
    protected function execute($input, $output)
1 efrain 71
    {
72
        $output->writeln('Inicio del proceso de la cola de Email');
73
 
606 stevensc 74
        $emailConfig = $this->getEmailConfig();
75
        $this->logEmailConfig($emailConfig);
345 www 76
 
1 efrain 77
        $emailMapper = EmailMapper::getInstance($this->adapter);
606 stevensc 78
        $emails = $emailMapper->fetchBatch($emailConfig['batch_size']);
1 efrain 79
 
606 stevensc 80
        $stats = $this->processEmails($emails, $emailConfig, $emailMapper);
345 www 81
 
606 stevensc 82
        $output->writeln('Email con Errores descartados: ' . $stats['error']);
83
        $output->writeln('Email enviados correctamente:' . $stats['completed']);
84
        $output->writeln('Fin del proceso de la cola de Email');
1 efrain 85
 
606 stevensc 86
        return 0;
87
    }
345 www 88
 
606 stevensc 89
    private function getEmailConfig(): array
90
    {
91
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
92
        $prefix = $sandbox ? 'sandbox' : 'production';
345 www 93
 
606 stevensc 94
        return [
95
            'batch_size' => $this->config["leaderslinked.email.{$prefix}_batch_size"],
96
            'from_address' => $this->config["leaderslinked.email.{$prefix}_from_address"],
97
            'from_name' => $this->config["leaderslinked.email.{$prefix}_from_name"],
98
            'host' => $this->config["leaderslinked.email.{$prefix}_host"],
99
            'port' => $this->config["leaderslinked.email.{$prefix}_port"],
100
            'username' => $this->config["leaderslinked.email.{$prefix}_username"],
101
            'password' => $this->config["leaderslinked.email.{$prefix}_password"]
102
        ];
103
    }
345 www 104
 
606 stevensc 105
    private function logEmailConfig($config)
106
    {
107
        echo 'Username : ' . $config['username'] . PHP_EOL;
108
        echo 'Password : ' . $config['password'] . PHP_EOL;
109
        echo 'Host : ' . $config['host'] . PHP_EOL;
110
        echo 'Port : ' . $config['port'] . PHP_EOL;
111
    }
345 www 112
 
606 stevensc 113
    private function processEmails($emails, $config, $emailMapper)
114
    {
115
        $stats = ['completed' => 0, 'error' => 0];
345 www 116
 
606 stevensc 117
        if (!$emails) {
118
            return $stats;
119
        }
345 www 120
 
606 stevensc 121
        foreach ($emails as $email) {
122
            $content = json_decode($email->content, true);
123
            $result = $this->sendEmail($content, $config);
124
 
125
            if ($result) {
126
                $stats['completed']++;
127
                $email->status = Email::STATUS_COMPLETED;
128
            } else {
129
                if ($email->tried == 2) {
130
                    $stats['error']++;
131
                    $email->status = Email::STATUS_ERROR;
1 efrain 132
                }
606 stevensc 133
                $email->tried++;
1 efrain 134
            }
606 stevensc 135
            $emailMapper->update($email);
1 efrain 136
        }
345 www 137
 
606 stevensc 138
        return $stats;
139
    }
345 www 140
 
606 stevensc 141
    private function sendEmail($content, $config)
142
    {
143
        $to_address = $content['to_address'];
144
        $to_name = $content['to_name'];
145
        $cc = $content['cc'];
146
        $bcc = $content['bcc'];
147
        $subject = $this->ensureUtf8($content['subject']);
148
        $message = $this->ensureUtf8($content['message']);
345 www 149
 
606 stevensc 150
        $phpMailer = new PHPMailer();
151
        $phpMailer->isSMTP();
152
        $phpMailer->addAddress($to_address, $to_name);
153
 
154
        if ($cc) {
155
            foreach ($cc as $address => $name) {
156
                $phpMailer->addCC($address, $name);
157
            }
158
        }
159
 
160
        if ($bcc) {
161
            foreach ($bcc as $address => $name) {
162
                $phpMailer->addBCC($address, $name);
163
            }
164
        }
165
 
166
        $phpMailer->setFrom($config['from_address'], $config['from_name']);
167
        $phpMailer->SMTPDebug = 2;
168
        $phpMailer->Debugoutput = function($str, $level) {
608 stevensc 169
            error_log("PHPMailer: $str");
606 stevensc 170
        };
171
        $phpMailer->Host = $config['host'];
172
        $phpMailer->Port = $config['port'];
173
        $phpMailer->IsHTML(true);
174
        $phpMailer->SMTPAuth = true;
175
        $phpMailer->SMTPSecure = 'tls';
176
        $phpMailer->Username = $config['username'];
177
        $phpMailer->Password = $config['password'];
178
        $phpMailer->Subject = $subject;
179
        $phpMailer->Body = $message;
180
        $phpMailer->AltBody = $message;
181
        $phpMailer->CharSet = 'UTF-8';
182
 
183
        try {
184
            return $phpMailer->send();
185
        } catch (\Exception $e) {
608 stevensc 186
            error_log("Email sending failed: " . $e->getMessage());
606 stevensc 187
            return false;
188
        }
1 efrain 189
    }
606 stevensc 190
 
191
    private function ensureUtf8($text)
192
    {
193
        $encoding = mb_detect_encoding($text);
194
        return $encoding != 'UTF-8' ? mb_convert_encoding($text, 'UTF-8', $encoding) : $text;
195
    }
1 efrain 196
}