Extracción de código de estado en una respuesta por correo
Publicado: 2018-12-10 14:12 @633
Buenas tardes.
Tengo un problema con el siguiente código y un conocido en Stackoverflow me recomendó utilizar esta plataforma para buscar ayuda.
El siguiente código dejó de funcionar después de una actualización que hizo en una oportunidad una persona.
Desconozco qué actualización hizo pero logramos hacer funcionar bien la información que llega a la bandeja de devueltos. Sin embargo, el perl, por alguna extraña razón, no logra procesar de forma eficiente las query.
Cualquier ayuda que me puedan brindar estaría infinitamente agradecido.
Tengo un problema con el siguiente código y un conocido en Stackoverflow me recomendó utilizar esta plataforma para buscar ayuda.
El siguiente código dejó de funcionar después de una actualización que hizo en una oportunidad una persona.
Desconozco qué actualización hizo pero logramos hacer funcionar bien la información que llega a la bandeja de devueltos. Sin embargo, el perl, por alguna extraña razón, no logra procesar de forma eficiente las query.
Cualquier ayuda que me puedan brindar estaría infinitamente agradecido.
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use warnings;
- #use diagnostics;
- use File::Copy;
- use Mail::Box;
- use Mail::Box::Mbox;
- use POSIX qw(strftime);
- use DBI;
- use Encode qw(decode encode);
- use Net::SMTP;
- use MIME::Lite;
- my %config;
- my $mbox_user;
- my $mbox_uid_user;
- my $mbox_mode;
- my $mbox_guid;
- my $mbox_uid_grp;
- my $mbox_uid;
- my $mbox_file;
- my $mbox_file_tmp;
- my $folder;
- my $messageID;
- my $body;
- my $email;
- my $smtpCode;
- my $smtpAction;
- my $smtpStatus;
- my $smtpDiagnosticCode;
- my $smtpRemoteMta;
- my $smtpLastAttemptDate;
- my $smtpCodeDetail;
- my $adminId;
- my $usuarioId;
- my $campanaId;
- my $listaId;
- my $ipTempFiler;
- my $devueltosTotal;
- my $campanasTotal;
- my %devueltos;
- my %campanas;
- my $startDate;
- my $endDate;
- my $dbh;
- my $sth;
- my $sth2;
- my $query;
- my $query1;
- my $queryColumns;
- my $queryValues;
- my $emailFromName;
- my $emailFrom;
- my $emailTo;
- my $emailSubject;
- my $emailMensaje;
- my $emailBody;
- my $directoryDevueltos;
- my $fileNameDevueltos;
- my $string;
- $mbox_user = "devueltos";
- $mbox_uid_user = "devueltos";
- $mbox_mode = "0660";
- $mbox_uid_grp = "mail";
- #$mbox_guid = "mail";
- $mbox_file = "/var/spool/mail/$mbox_user";
- $mbox_file_tmp = "/var/spool/mail/$mbox_user-tmp";
- $directoryDevueltos = "/home/directorio/data/devueltos";
- $fileNameDevueltos = "devueltos-virt-" . strftime( "%Y%m%d-%H%M%S", localtime(time) ) . ".sql";
- $config{'dbhost'} = "127.0.0.1";
- $config{'dbname'} = "basededatosnombre";
- $config{'dbusername'} = "usuariobasededatos";
- $config{'dbuserpassword'} = "contrasenabasededatos";
- $emailFromName = 'Administrador Devueltos';
- #$emailTo = '';
- #$emailTo = '';
- $emailSubject = '';
- $emailMensaje = "";
- print $mbox_file. "\n";
- print $mbox_file_tmp. "\n";
- $startDate = strftime( "%Y/%m/%d %H:%M:%S", localtime(time) );
- if ( -e $mbox_file ) {
- move( $mbox_file, $mbox_file_tmp );
- open( OUTFILE, ">$mbox_file" ) || die "No se puede crear el archivo : $mbox_file";
- close(OUTFILE);
- $mbox_uid = ( getpwnam($mbox_uid_user) )[2];
- $mbox_guid = ( getpwnam($mbox_uid_grp) )[3];
- chown( $mbox_uid, $mbox_guid, $mbox_file );
- system("chmod $mbox_mode $mbox_file");
- # if( -e $mbox_file_tmp ){
- system("chmod $mbox_mode $mbox_file_tmp");
- $folder = new Mail::Box::Mbox( 'folder' => $mbox_file_tmp, 'access' => 'rw' );
- my $i = 0;
- %devueltos = ();
- foreach my $message ( $folder->messages ) {
- $smtpCode = undef;
- $smtpCodeDetail = undef;
- $email = undef;
- $smtpAction = undef;
- $smtpStatus = undef;
- $smtpDiagnosticCode = undef;
- $smtpCodeDetail = undef;
- $smtpRemoteMta = undef;
- $smtpLastAttemptDate = undef;
- $usuarioId = undef;
- $adminId = undef;
- $campanaId = undef;
- $listaId = undef;
- $ipTempFiler = undef;
- $body = $message->decoded();
- foreach ( split( /\n/, $body ) ) {
- next if (/^\s*$/);
- if ( $_ =~ /^(\d{3}\s\d{1}\.\d{1}\.\d{1})/ig ) {
- $smtpCode = $1;
- }
- elsif ( $_ =~ /^\d{3}\s\d{1}\.\d{1}\.\d{1}\s(.*)$/ig ) {
- $smtpCodeDetail = $1;
- }
- elsif ( $_ =~ /^Final-Recipient:\sRFC822;\s([A-z0-9_\-\.]+@[A-z0-9_\-\.]+\.\w+)+$/ig ) {
- $email = $1;
- }
- elsif ( $_ =~ /^Action:\s(\w+)$/ ) {
- $smtpAction = $1;
- }
- elsif ( $_ =~ /^Status:\s(\d\.\d\.\d)$/ ) {
- $smtpStatus = $1;
- }
- elsif ( $_ =~ /^Diagnostic-Code:\sSMTP;\s(.*)$/ ) {
- $smtpDiagnosticCode = $1;
- if ( ( $smtpDiagnosticCode =~ /(550\sSC\-[\d]{3})/ )
- or ( $smtpDiagnosticCode =~ /(550\sOU\-[\d]{3})/ )
- or ( $smtpDiagnosticCode =~ /(550\sDY\-[\d]{3})/ )
- or ( $smtpDiagnosticCode =~ /(421\sRP\-[\d]{3})/ ) ) {
- $ipTempFiler = 1;
- }
- }
- elsif ( $_ =~ /^Remote-MTA:\sDNS;\s([A-Za-z0-9\.\-]+)$/ ) {
- $smtpRemoteMta = $1;
- }
- elsif ( $_ =~ /^Last-Attempt-Date:\s[A-Za-z]+\,\s(\d{1,2}\s[A-Za-z]+\s\d{4}\s[0-9:]{8}\s[0-9\-]{5})/ig ) {
- $smtpLastAttemptDate = convert_date($1);
- }
- elsif ( $_ =~ /^X-RSidusuario:\s(\d+)$/ ) {
- $usuarioId = $1;
- }
- elsif ( $_ =~ /^X-RS-idadmin:\s(\d+)$/ ) {
- $adminId = $1;
- }
- elsif ( $_ =~ /^X-RS-idcamp:\s(\d+)$/ ) {
- $campanaId = $1;
- }
- elsif ( $_ =~ /^X-RS-idlist:\s(\d+)$/ ) {
- $listaId = $1;
- }
- if ( defined $smtpCode ) {
- if ( $smtpCode =~ /^550\s\d\.\d\.\d$/ ) {
- if ( ( defined $usuarioId )
- and ( defined $adminId )
- and ( defined $campanaId )
- and ( defined $listaId ) ) {
- $devueltos{$i}{'smtpcode'} = $smtpCode;
- $devueltos{$i}{'email'} = $email;
- $devueltos{$i}{'smtpaction'} = $smtpAction;
- $devueltos{$i}{'smtpstatus'} = $smtpStatus;
- if ( defined $smtpCodeDetail ) {
- $smtpDiagnosticCode .= " | " . $smtpCodeDetail;
- }
- if ( defined $smtpDiagnosticCode ) {
- $devueltos{$i}{'smtpdiagnosticcode'} = strip_slashes($smtpDiagnosticCode);
- }
- $devueltos{$i}{'smtpremotemta'} = $smtpRemoteMta;
- $devueltos{$i}{'smtplastattempdate'} = $smtpLastAttemptDate;
- $devueltos{$i}{'userid'} = $usuarioId;
- $devueltos{$i}{'adminid'} = $adminId;
- $devueltos{$i}{'campanaid'} = $campanaId;
- $devueltos{$i}{'listaid'} = $listaId;
- if ( not defined $ipTempFiler ) {
- $devueltos{$i}{'status'} = 1;
- }
- }
- }
- }
- else {
- if ( ( defined $usuarioId )
- and ( defined $adminId )
- and ( defined $campanaId )
- and ( defined $listaId ) ) {
- $devueltos{$i}{'email'} = $email;
- $devueltos{$i}{'smtpaction'} = $smtpAction;
- $devueltos{$i}{'smtpstatus'} = $smtpStatus;
- if ( defined $smtpDiagnosticCode ) {
- $devueltos{$i}{'smtpdiagnosticcode'} = strip_slashes($smtpDiagnosticCode);
- }
- if ( defined $smtpRemoteMta ) {
- $devueltos{$i}{'smtpremotemta'} = $smtpRemoteMta;
- }
- $devueltos{$i}{'smtplastattempdate'} = $smtpLastAttemptDate;
- $devueltos{$i}{'userid'} = $usuarioId;
- $devueltos{$i}{'adminid'} = $adminId;
- $devueltos{$i}{'campanaid'} = $campanaId;
- $devueltos{$i}{'listaid'} = $listaId;
- }
- }
- } #end foreach body
- $message->delete();
- $i++;
- } #end foreach $folder->messages
- $folder->close( 'write' => 'MODIFIED' );
- $devueltosTotal = scalar keys(%devueltos);
- if ( scalar keys(%devueltos) > 0 ) {
- $dbh = DBI->connect( "DBI:Pg:dbname=$config{'dbname'};host=$config{'dbhost'}",
- "$config{'dbusername'}", "$config{'dbuserpassword'}" );
- $dbh->{RaiseError} = 1;
- $dbh->{PrintError} = 0;
- $dbh->{AutoCommit} = 0;
- if ( !$dbh ) {
- print "Error al conectar a DB";
- }
- open( FSQL, ">$directoryDevueltos/$fileNameDevueltos" )
- || die "No se puede crear el archivo : $directoryDevueltos/$fileNameDevueltos";
- $string = "BEGIN;\n";
- for my $row ( sort keys %devueltos ) {
- $query = undef;
- $queryColumns = undef;
- $queryValues = undef;
- if ( exists( $campanas{ $devueltos{$row}{'campanaid'} } ) ) {
- $campanas{ $devueltos{$row}{'campanaid'} }{'count'}++;
- $campanas{ $devueltos{$row}{'campanaid'} }{'adminid'} = $devueltos{$row}{'adminid'};
- }
- else {
- $campanas{ $devueltos{$row}{'campanaid'} }{'count'} = 1;
- $campanas{ $devueltos{$row}{'campanaid'} }{'adminid'} = $devueltos{$row}{'adminid'};
- }
- if ( defined $devueltos{$row}{'smtpcode'} ) {
- $queryColumns .= "smtpcode1, ";
- $queryValues .= " '" . $devueltos{$row}{'smtpcode'} . "', ";
- }
- if ( defined $devueltos{$row}{'email'} ) {
- $queryColumns .= "email, ";
- $queryValues .= " '" . $devueltos{$row}{'email'} . "', ";
- }
- if ( defined $devueltos{$row}{'smtpaction'} ) {
- $queryColumns .= "smtpaction, ";
- $queryValues .= " '" . $devueltos{$row}{'smtpaction'} . "', ";
- }
- if ( defined $devueltos{$row}{'smtpstatus'} ) {
- $queryColumns .= "smtpcode, ";
- $queryValues .= " '" . $devueltos{$row}{'smtpstatus'} . "', ";
- }
- if ( defined $devueltos{$row}{'smtpdiagnosticcode'} ) {
- my $deletechar = $devueltos{$row}{'smtpdiagnosticcode'} =~ s/'//g;
- $queryColumns .= "smtpprefixdetail, ";
- # $queryValues .= " E'".encode('utf8', decode('iso-8859-1', $devueltos{$row}{'smtpdiagnosticcode'}))."', ";
- $queryValues .= " '" . encode( 'utf8', decode( 'iso-8859-1', $deletechar ) ) . "', ";
- }
- if ( defined $devueltos{$row}{'smtpremotemta'} ) {
- $queryColumns .= "smtpremote, ";
- $queryValues .= " '" . $devueltos{$row}{'smtpremotemta'} . "', ";
- }
- if ( defined $devueltos{$row}{'smtplastattempdate'} ) {
- $queryColumns .= "smtpdate, ";
- $queryValues .= " '" . $devueltos{$row}{'smtplastattempdate'} . "', ";
- }
- if ( defined $devueltos{$row}{'userid'} ) {
- $queryColumns .= "id_usuario, ";
- $queryValues .= "$devueltos{$row}{'userid'}, ";
- }
- if ( defined $devueltos{$row}{'adminid'} ) {
- $queryColumns .= "id_admin, ";
- $queryValues .= "$devueltos{$row}{'adminid'}, ";
- }
- if ( defined $devueltos{$row}{'campanaid'} ) {
- $queryColumns .= "id_campana, ";
- $queryValues .= "$devueltos{$row}{'campanaid'}, ";
- }
- if ( defined $devueltos{$row}{'listaid'} ) {
- $queryColumns .= "id_lista, ";
- $queryValues .= "$devueltos{$row}{'listaid'}, ";
- }
- if ( defined $devueltos{$row}{'status'} ) {
- $queryColumns .= "status, ";
- $queryValues .= "true, ";
- }
- $queryColumns .= "fecha ";
- $queryValues .= "now() ";
- $query = "INSERT INTO ex_tbl_devueltos ($queryColumns) VALUES ($queryValues);";
- $string .= $query . "\n";
- $sth = $dbh->prepare($query) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";
- $sth->execute() or die "Can't execute SQL statement: ", $sth->errstr(), "\n";
- }
- $dbh->commit();
- if ($@) {
- $dbh->rollback();
- move( $mbox_file_tmp, $mbox_file_tmp . "_" . strftime( "%Y%m%d%H%M%S", localtime(time) ) );
- }
- $campanasTotal = scalar keys(%campanas);
- if ( scalar keys(%campanas) > 0 ) {
- for my $idcampana ( sort keys %campanas ) {
- $query
- = "SELECT id_campana FROM tablas WHERE id_admin = '"
- . $campanas{$idcampana}{'adminid'}
- . "' AND id_campana = '"
- . $idcampana . "'; ";
- $sth = $dbh->prepare($query) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";
- $sth->execute() or die "Can't execute SQL statement: ", $sth->errstr(), "\n";
- if ( $sth->rows > 0 ) {
- $query1
- = "UPDATE tablas SET devueltos = devueltos + "
- . $campanas{$idcampana}{'count'}
- . ", recibidos = recibidos - "
- . $campanas{$idcampana}{'count'}
- . " WHERE id_campana = '"
- . $idcampana . "'; ";
- print $query1 . "\n";
- $sth2 = $dbh->prepare($query1) or die "Can't prepare SQL statement: ", $dbh->errstr(), "\n";
- $sth2->execute() or die "Can't execute SQL statement: ", $sth2->errstr(), "\n";
- }
- }
- }
- if ( defined($sth) ) {
- $sth->finish() or warn "finish failed: $!\n";
- }
- if ( defined($sth2) ) {
- $sth2->finish() or warn "finish failed: $!\n";
- }
- if ( defined($dbh) ) {
- $dbh->disconnect() or warn "Disconnection failed: $!\n";
- }
- $string .= "COMMIT;\n";
- print FSQL $string;
- close FSQL;
- }
- $endDate = strftime( "%Y/%m/%d %H:%M:%S", localtime(time) );
- $emailBody = "El proceso finalizo con exito\n\n";
- $emailBody .= "================================\n";
- $emailBody .= "Total devueltos procesados: " . $devueltosTotal . "\n";
- $emailBody .= "\n";
- $emailBody .= "Total campanas procesados: " . $campanasTotal . "\n";
- $emailBody .= "================================\n";
- $emailBody .= "Hora Inicio: " . $startDate . "\n";
- $emailBody .= "Hora Final: " . $endDate . "\n";
- $emailBody .= "================================\n\n";
- $emailBody .= "Administrador\n";
- $emailMensaje = encode( 'utf8', decode( 'iso-8859-1', $emailBody ) );
- &send_mail( $emailFromName, $emailFrom, $emailTo, $emailSubject, $emailMensaje );
- # }#end if $mbox_file_tmp
- } #end if $mbox_file;
- print "Finalizo " . $startDate . "--" . $endDate . "\n";
- sub convert_date {
- my ( $dateString, @datePart );
- my ( $dateDay, $dateMonth, $dateYear, $dateTime, $dateZone );
- my ( $month, $date );
- $dateString = shift;
- @datePart = split( " ", $dateString );
- $dateDay = $datePart[0];
- $dateMonth = $datePart[1];
- $dateYear = $datePart[2];
- $dateTime = $datePart[3];
- $dateZone = $datePart[4];
- $month = 0;
- if ( $dateMonth eq 'Jan' ) {
- $month = "01";
- }
- elsif ( $dateMonth eq 'Feb' ) {
- $month = "02";
- }
- elsif ( $dateMonth eq 'Mar' ) {
- $month = "03";
- }
- elsif ( $dateMonth eq 'Apr' ) {
- $month = "04";
- }
- elsif ( $dateMonth eq 'May' ) {
- $month = "5";
- }
- elsif ( $dateMonth eq 'Jun' ) {
- $month = "06";
- }
- elsif ( $dateMonth eq 'Jul' ) {
- $month = "07";
- }
- elsif ( $dateMonth eq 'Aug' ) {
- $month = "08";
- }
- elsif ( $dateMonth eq 'Sep' ) {
- $month = "09";
- }
- elsif ( $dateMonth eq 'Oct' ) {
- $month = "10";
- }
- elsif ( $dateMonth eq 'Nov' ) {
- $month = "11";
- }
- elsif ( $dateMonth eq 'Dec' ) {
- $month = "12";
- }
- $month = sprintf( "%02d", $month );
- $dateDay = sprintf( "%02d", $dateDay );
- $date = "$dateYear/$month/$dateDay $dateTime $dateZone";
- if ( $dateZone eq '-0480' ) {
- $date = "$dateYear/$month/$dateDay $dateTime";
- }
- return $date;
- }
- sub strip_slashes {
- my $string = shift;
- $string =~ s/\'/\\'/g;
- $string =~ s/\"/\\"/g;
- return $string;
- }
- sub send_mail {
- my $emailFromName = shift;
- my $emailFrom = shift;
- my $emailTo = shift;
- my $emailSubject = shift;
- my $emailMensaje = shift;
- my $smtp = Net::SMTP->new(
- 'Host' => '127.0.0.1',
- 'Hello' => 'url',
- 'Timeout' => 10,
- 'Debug' => 0, # Change to a 1 to turn on debug messages
- 'Port' => 25,
- 'User' => 'usuario',
- 'Password' => 'contrasena',
- );
- if ( not $smtp ) {
- die "Imposible conectar a servidor SMTP\n";
- next;
- }
- $smtp->mail($emailFrom);
- $smtp->to($emailTo);
- my $msg = "";
- my $maildata = "";
- $msg = MIME::Lite::->build(
- From => '' . $emailFromName . ' <' . $emailFrom . '>',
- To => '' . $emailTo . '',
- Subject => $emailSubject,
- Encoding => '8bit',
- Type => 'multipart/alternative'
- );
- $msg->attr( 'content-type.charset' => 'utf-8' );
- $msg->delete("X-Mailer");
- $msg->add( "X-Mailer" => 'X-RS-Mailer' );
- $msg->attach(
- Type => 'text/plain; charset=utf-8',
- Encoding => 'quoted-printable',
- Data => $emailMensaje
- );
- $maildata = $msg->as_string();
- $smtp->data();
- $smtp->datasend($maildata);
- $smtp->dataend();
- $smtp->quit();
- return 1;
- }
Coloreado en 0.014 segundos, usando GeSHi 1.0.8.4