CronController.php 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace app\modules\mail\commands;
  3. use app\modules\mail\models\NotificacionCorreo;
  4. use app\modules\mail\models\NotificacionCorreoAdjunto;
  5. use yii\console\Controller;
  6. use yii\db\Expression;
  7. class CronController extends Controller {
  8. // ¿Cuántos correos se enviarán por minuto?
  9. # TODO: Se debe enviar uno cada 3 minutos para
  10. private $limite = 1;
  11. # Este debe venir de un archivo de configuración o de alguna tabla
  12. private $correoDesde = ["siistai@transparenciasonora.org" => "Notificación SIISTAI"];
  13. private $correoAResponder = "transparenciasonora22@gmail.com";
  14. public function actionCheck() {
  15. $this->stdout("checked \n");
  16. }
  17. public function actionIndex() {
  18. $notificaciones = NotificacionCorreo::find()
  19. ->andWhere([
  20. "estatus" => NotificacionCorreo::ESTATUS_NUEVO,
  21. "enviado" => null
  22. ])
  23. ->orderBy(["prioridad" => SORT_ASC])
  24. ->limit($this->limite);
  25. foreach ($notificaciones->each() as $notif) {
  26. /** @var NotificacionCorreo $notif */
  27. # Guardar el que se este procesando
  28. $notif->estatus = NotificacionCorreo::ESTATUS_PROCESO;
  29. $notif->modificado = new Expression('now()');
  30. $notif->save();
  31. $view = new \yii\web\View();
  32. $contenido = $view->render("@app/modules/mail/views/layouts/cuerpo", [
  33. "cuerpo" => $notif->cuerpo
  34. ]);
  35. $destinos = $notif->receptor;
  36. if (!is_array($destinos)) {
  37. $notif->estatus = NotificacionCorreo::ESTATUS_ERROR;
  38. $notif->detalle = "No hay destinos para el correo";
  39. $notif->save();
  40. continue;
  41. }
  42. foreach ($destinos as $indice => $valor) {
  43. $destino = [$indice => $valor];
  44. if (is_numeric($indice)) {
  45. $destino = $valor;
  46. }
  47. try {
  48. $correo = \Yii::$app->mailer->compose()
  49. ->setFrom($this->correoDesde)
  50. // ->setReplyTo($this->correoAResponder)
  51. ->setTo($destino)
  52. ->setSubject($notif->asunto)
  53. ->setHtmlBody($contenido);
  54. foreach ($notif->adjuntos as $adjunto) {
  55. $ruta = str_replace("https://sistai.web.app/", \Yii::getAlias("@app"), $adjunto->ruta);
  56. if (is_file($ruta)) {
  57. $correo->attach($ruta);
  58. }
  59. }
  60. $resultado = $correo->send();
  61. if ($resultado) {
  62. $notif->enviado = new Expression('now()');
  63. $notif->estatus = NotificacionCorreo::ESTATUS_ENVIADO;
  64. } else {
  65. $notif->estatus = NotificacionCorreo::ESTATUS_ERROR;
  66. $notif->detalle = $correo->toString(); # Buscar la manera de obtener el error
  67. }
  68. $notif->save();
  69. $this->stdout("\n");
  70. } catch (\Exception $e) {
  71. $notif->estatus = $notif::ESTATUS_ERROR;
  72. $notif->detalle = $e->getMessage();
  73. $notif->save();
  74. $this->stdout(" Ocurrió un error al guardar {$e->getMessage()}\n");
  75. }
  76. }
  77. }
  78. }
  79. }