public static function deleteMailingWithoutGroupSendQueue($groups, $campaign) { EmailSendQueue::where('campaign_id_047', $campaign)->where('status_id_047', 0)->whereNotIn('contact_id_047', function ($query) use($groups) { $query->select('contact_id_042')->from('005_042_contacts_groups')->whereIn('group_id_042', $groups)->groupBy('contact_id_042')->get(); })->delete(); }
/** * Function that sends emails * * @access private * @return array */ private static function sendEmails() { $emailServiceSendingEmails = Preference::getValue('emailServiceSendingEmails', 5, '0'); // Comprobación para casos de errores o caídas del servidor, y no dejen bloquedo el envío de emails // si en 5 minutos no se ha liberado la variable, damos por hecho que se ha bloqueado y la liberamos $update = \DateTime::createFromFormat('Y-m-d H:i:s', $emailServiceSendingEmails->updated_at); if ($emailServiceSendingEmails->value_018 == '1' && date('U') - $update->getTimestamp() > 300) { Preference::setValue('emailServiceSendingEmails', 5, '0'); } //en el caso que el estado de envio esté activo, eso siginifica que hay una petición en curso y está haciendo la petición //a la base de datos y esta sustrayendo los ids, para posteriormente cambiar el estado de envíos, solo en ese momento //cambiaremos el estado de envío de emails para poder aceptar más peticiones, de esa manera nos aseguramos que no hayan //varias peticiones concurrentes del gestor de colas. if ($emailServiceSendingEmails->value_018 == '1') { exit; } else { Preference::setValue('emailServiceSendingEmails', 5, '1'); } // consultamos la cola de envíos que estén por enviar, solicitamos los primero N envíos según el itervalo configurado // solo de aquellos envíos que estén en estado: 0 = waiting to be sent $mailings = EmailSendQueue::getMailings((int) Preference::getValue('emailServiceIntervalProcess', 5)->value_018, 0); $mailingIds = $mailings->pluck('id_047')->toArray(); if (count($mailings) > 0) { // cambiamos el estado de EmailSendQueue para que se puedan hacer peticiones EmailSendQueue::whereIn('id_047', $mailingIds)->update(['status_id_047' => 1]); // desbloqueo de proceso de obtención de emails para ser enviados y se puedan hacer peticiones Preference::setValue('emailServiceSendingEmails', 5, '0'); $successfulIds = []; foreach ($mailings as $mailing) { // Creamos el historico de envío con antelación para obtener el ID del histórico de envío y contabilizarlo $emailSendHistory = EmailSendHistory::create(['send_queue_id_048' => $mailing->id_047, 'campaign_id_048' => $mailing->campaign_id_047, 'contact_id_048' => $mailing->contact_id_047, 'create_048' => $mailing->create_047, 'sent_048' => date('U'), 'viewed_048' => 0]); $dataEmail = ['replyTo' => empty($mailing->reply_to_013) ? null : $mailing->reply_to_013, 'email' => $mailing->email_041, 'html' => $mailing->header_044 . $mailing->body_044 . $mailing->footer_044, 'text' => $mailing->text_044, 'subject' => $mailing->subject_044, 'contactKey' => Crypt::encrypt($mailing->id_041), 'company' => isset($mailing->company_041) ? $mailing->company_041 : '', 'name' => isset($mailing->name_041) ? $mailing->name_041 : '', 'surname' => isset($mailing->surname_041) ? $mailing->surname_041 : '', 'birthDate' => isset($mailing->birth_date_041) ? date(config('pulsar.datePattern'), $mailing->birth_date_041) : '', 'campaign' => Crypt::encrypt($mailing->id_044), 'historyId' => Crypt::encrypt($emailSendHistory->id_048)]; // config SMTP account config(['mail.host' => $mailing->outgoing_server_013]); config(['mail.port' => $mailing->outgoing_port_013]); config(['mail.from' => ['address' => $mailing->email_013, 'name' => $mailing->name_013]]); config(['mail.encryption' => $mailing->outgoing_secure_013 == 'null' ? null : $mailing->outgoing_secure_013]); config(['mail.username' => $mailing->outgoing_user_013]); config(['mail.password' => Crypt::decrypt($mailing->outgoing_pass_013)]); // exec mailing $response = EmailServices::SendEmail($dataEmail); if ($response) { // delete message from queue EmailSendQueue::where('id_047', $mailing->id_047)->delete(); } else { // error de envío, eliminamos el histórico antes creado EmailSendHistory::destroy($emailSendHistory->id_048); } } } else { // desbloqueo de proceso de obtención de emails para ser enviados y se puedan hacer peticiones Preference::setValue('emailServiceSendingEmails', 5, '0'); } }
public function updateCustomRecord($parameters) { $htmlLinks = ComunikLibrary::setMailingLinks($this->request, $parameters); EmailCampaign::where('id_044', $parameters['id'])->update(['name_044' => $this->request->input('name'), 'email_account_id_044' => $this->request->input('emailAccount'), 'template_id_044' => empty($this->request->input('template')) ? null : $this->request->input('template'), 'subject_044' => $this->request->input('subject'), 'theme_044' => $this->request->input('theme'), 'header_044' => $htmlLinks['header'], 'body_044' => $htmlLinks['body'], 'footer_044' => $htmlLinks['footer'], 'text_044' => $htmlLinks['text'], 'data_044' => $this->request->input('data', 'NULL'), 'shipping_date_044' => $this->request->has('shippingDate') ? \DateTime::createFromFormat(config('pulsar.datePattern') . ' H:i', $this->request->input('shippingDate'))->getTimestamp() : (int) date('U'), 'shipping_date_text_044' => $this->request->has('shippingDate') ? $this->request->input('shippingDate') : date(config('pulsar.datePattern') . ' H:i'), 'persistence_date_044' => $this->request->has('persistenceDate') ? \DateTime::createFromFormat(config('pulsar.datePattern') . ' H:i', $this->request->input('persistenceDate'))->getTimestamp() : null, 'persistence_date_text_044' => $this->request->has('persistenceDate') ? $this->request->input('persistenceDate') : null, 'sorting_044' => $this->request->has('sorting') ? $this->request->input('sorting') : null]); $emailCampaign = EmailCampaign::find($parameters['id']); $emailCampaign->getCountries()->sync($this->request->input('countries')); $emailCampaign->getGroups()->sync($this->request->input('groups')); // borramos los envíos de cola, de aquellos correos en estado, status_id_047 = 0 waiting // que no correspondan con los nuevos grupos, caso muy dificil de ocurrir, // ya que solo se pasan a cola cuando van a ser enviados EmailSendQueue::deleteMailingWithoutGroupSendQueue($this->request->input('groups'), $emailCampaign->id_044); }