X-Git-Url: https://git.llucax.com/software/sercom-old.git/blobdiff_plain/2629d689134a52c5d3210e371758931b99692a84..2865b092c966b47b21285144500ed9465d2f57c1:/src/sc_fetch diff --git a/src/sc_fetch b/src/sc_fetch index 2f31525..9f14318 100755 --- a/src/sc_fetch +++ b/src/sc_fetch @@ -1,6 +1,9 @@ #!/usr/bin/php4 120) { // 2 horas sin poder conectarse + logs('Hace 2 horas que no se puede conectar al servidor ('.imap_last_error().')', ERROR); + $mbox_errcount = 0; + } else { + logs('No se pudo conectar al servidor ('.imap_last_error().')', WARNING); + } + $mbox_errcount++; sleep($intervalo); + continue; } - logs('Conectado como '.@$mconf['user']." a $mailbox", L_DBG); + $mbox_errcount = 0; + logs('Conectado como '.@$mconf['user']." a $mailbox", DEBUG); if (imap_num_msg($mbox) and $hdr = imap_headerinfo($mbox, 1)) { - logs("Nuevo mail '{$hdr->subject}' de {$hdr->fromaddress}"); + logs(sprintf("Nuevo mail '%s' de %s", decode_header($hdr->subject), decode_header($hdr->subject))); @list($padron, $ej, $ent, $codigo) = validar_cabecera($hdr); if ($padron) { - logs('Cabecera válida', L_DBG); + logs('Cabecera válida', DEBUG); $intento = new T_Intento($padron, $ej, $ent); if (!($err = $intento->validar_entrega($codigo, $claves))) { logs('Entrega aceptada ('.$intento->to_line().')'); if (!($err = preparar_entrega($intento, $mbox, 1, $gconf['data_dir']))) { - logs('Intento preparado', L_DBG); + logs('Intento preparado', DEBUG); $res = $intento->hacer_entrega($hdr->fromaddress); if (PEAR::isError($res)) { - logs('Error al hacer entrega (' . $res->getMessage() . ')', L_ERR); - enviar_respuesta(R_ERR, $hdr->fromaddress, "Error al preparar entrega:\nError en la base de datos.\n\nSe envió un mensaje al administrador avisando del problema.", $intento); - enviar_respuesta(R_ERR, $mconf['mail_admin'], "Error al preparar entrega:\n" . $res->getMessage(), $intento); + logs('Error al hacer entrega (' . $res->getMessage() . ')', ERROR); + enviar_respuesta(R_ERR, $hdr->fromaddress, "Error interno al preparar entrega.\n\nSe envió un mensaje al administrador avisando del problema.", $intento); + enviar_respuesta(R_ERR, $mconf['admin'], "Error de la DB al preparar entrega:\n" . $res->getMessage(), $intento); } else { - logs('Intento encolado para compilar'); + logs('Intento encolado para compilar', DEBUG); enviar_respuesta(R_OK, $hdr->fromaddress, null, $intento); guardar_mbox($mbox, 1, $hdr, @$mconf['mbox_bak']); } } else { - logs("Error al preparar entrega ($err)", L_ERR); - enviar_respuesta(R_ERR, $hdr->fromaddress, "Error al preparar entrega:\n$err", $intento); - enviar_respuesta(R_ERR, $mconf['mail_admin'], "Error al preparar entrega:\n$err.\n\nSe envió un mensaje al administrador avisando del problema.", $intento); + logs("Error al preparar entrega ($err)", ERROR); + enviar_respuesta(R_ERR, $hdr->fromaddress, "Error interno al preparar entrega.\n\nSe envió un mensaje al administrador avisando del problema.", $intento); + enviar_respuesta(R_ERR, $mconf['admin'], "Error al preparar entrega:\n$err", $intento); } } else { - logs("Entrega rechazada ($err)"); + logs("Entrega rechazada ($err)", WARNING); enviar_respuesta(R_ERR, $hdr->fromaddress, $err, $intento); } } else { - logs('Entrega rechazada (subject inválido)'); + logs('Entrega rechazada (subject inválido)', WARNING); enviar_respuesta(R_ERR, $hdr->fromaddress, "Asunto (subject) inválido.\n\n" . "Recuerde que el formato del asunto es estricto:\n" . "[padrón] [ejercicio].[entrega] [código]\n\n" . "Donde [padrón] es su número de padrón, [ejercicio] es el número de\n" - . "ejercicio (1 a 4), [entrega] el número de entrega (1 o 2) y [código]\n" - . "es el código verificador que le fue asignado por la cátedra.\n" + . "ejercicio (1 a 4), [entrega] el número de entrega (1 entrega, 2 reentrega)\n" + . "y [código] es el código verificador que le fue asignado por la cátedra.\n" ); } imap_delete($mbox, 1); - logs('Mail borrado'); + logs('Mail borrado', DEBUG); imap_expunge($mbox); - logs('Mensajes purgandos', L_DBG); + logs('Mensajes purgandos', DEBUG); $intervalo = 0; // Que tome el próximo mail enseguida. } else { - logs('No hay mail nuevo', L_DBG); + logs('No hay mail nuevo', DEBUG); } - logs('Cerrando conexión', L_DBG); + logs('Cerrando conexión', DEBUG); imap_close($mbox); sleep($intervalo); } @@ -147,21 +161,22 @@ imap_close($mbox); function enviar_respuesta($tipo, $to, $mensaje = '', $intento = null) { global $mconf; - $subject = $mconf['prefijo'] . ' Entrega '; + $subject = '[' . $mconf['prefijo'] . '] Entrega '; if ($tipo == R_OK) $estado = 'ACEPTADA'; else $estado = 'RECHAZADA'; $subject .= $estado; $body .= "Estado: $estado\n"; if ($mensaje) $body .= "\n$mensaje\n"; if ($intento) $body .= "\n" . $intento->__toString() . "\n"; - logs("Envío de mail '$subject' a '$to'\n$body\n", L_DBG); + logs("Envío de mail '$subject' a '$to'\n$body\n", DEBUG); $headers = <<subject, $m)) { + $subject = decode_header($hdr->subject); + if (preg_match('/^\s*(\d{5})\s+([1-4])\.([12])\s+(.*)$/', $subject, $m)) { return array_slice($m, 1, 5); } return false; } function preparar_entrega($intento, $mbox, $msgid, $dir) { - logs('Acá debería verificar el cuerpo del mensaje', L_DBG); + logs('Acá debería verificar el cuerpo del mensaje', DEBUG); + $path = "$dir/" . $intento->path('intentos'); $mail = imap_fetchstructure($mbox, $msgid); + if (!mkdir_p($path)) return 'No se pudo crear el directorio'; foreach ($mail->parts as $id => $part) { $fname = part_filename($part); if ($fname) { - logs("Escribiendo archivo '$fname' [enc={$part->encoding}]", L_DBG); + logs("Escribiendo archivo '$fname' [enc={$part->encoding}]", DEBUG); $body = imap_fetchbody($mbox, $msgid, $id + 1); - $path = "$dir/" . $intento->path(); - if (!mkdir_p($path)) return 'No se pudo crear el directorio'; if (!file_put_contents("$path/$fname", decode_body($body, $part->encoding))) return "Error al guardar el archivo $fname"; } //if (part_is_source($part) $has_sources = true; @@ -247,7 +263,7 @@ function decode_body($body, $encoding) { case ENCQUOTEDPRINTABLE: return imap_qprint($body); case ENCOTHER: return $body; } - logs('Encoding no reconocido.', L_ERR); + logs('Encoding no reconocido.', WARNING); return $body; } @@ -278,4 +294,13 @@ function fix_eol($str) { return str_replace("\r\n", "\n", $str); } +function decode_header($str) { + $elems = imap_mime_header_decode($str); + $result = ''; + foreach ($elems as $elem) { + $result .= $elem->text; + } + return $result; +} + ?> \ No newline at end of file