Mail Parser v1.0 – Organiza tu lista de correos

Iniciado por Xt3mP, Julio 16, 2012, 12:03:44 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 16, 2012, 12:03:44 AM Ultima modificación: Octubre 25, 2013, 11:24:49 PM por Expermicid
A veces nos encontramos con listas de correos bastantes extensas, pero ese no es el problema, sino el gran desorden de éstas; algunas tienen correos repetidos, otras correos inválidos, inclusive hasta espacios en blanco.

Para eso -y creo que para la comodidad de muchos- he creado un script en PHP el cual se encarga de organizar dichas listas de manera rápida, personalizada y sencilla.


Esta herramienta está aún en fase BETA por lo que algunos manejos de errores no están en el script; alguno de ellos puede ser, por ejemplo, que si metes datos que no son correos electrónicos, tál vez te "parsee" bien la información, pero el resto del procesamiento no será adecuado. Por el momento consta de 5 opciones:

    Remover repetidos:
        Elimina los correos inválidos, mal escritos o repetidos.
    Partir:
        Parte en listas la lista príncipal de correos; en caso de ser "Sí", en "Núm. de listas" elegir el número de listas a crear.
    Mostrar resultado:
        Muestra el resultado en dos opciones:
            Todos: Muestra los correos ordenados alfabéticamente.
            Por Dominio: Muestra los correos ordenados alfabéticamente y por dominio de correo (hotmail, yahoo, etc).

El script se puede mejorar bastante, pero es funcional:

Código: php
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Mail Parser V1 - http://xt3mp.mx</title>
<?php
class mailParserv1
{
    var $mails;
    var $realMails;
    var $nonparsedMails;
    var $correctMails;
    var $wrongMails;
    var $domainMails;

    public function __construct($mails)
    {
        $this->mails = $mails;
        $this->nonparsedMails = array();
        $this->correctMails = array();
        $this->wrongMails = array();
        $this->domainMails = array();
    }

    public function parseMails()
    {
        $eachMail = explode("\r\n", $this->mails);
        foreach($eachMail as $mail)
        {
            if(!empty($mail))
                $this->nonparsedMails[] = strtolower(trim($mail));
        }
    }

    public function removeRepeatmails()
    {
        foreach($this->nonparsedMails as $mail)
        {
            if(!in_array($mail, $this->correctMails) && !empty($mail) && !filter_var($mail, FILTER_VALIDATE_EMAIL))
            {
                $this->correctMails[] = $mail;

            }
            else
            {
                $this->wrongMails[] = $mail;
            }
        }
        return true;
    }

    public function checkMails()
    {
        $realMails = (empty($this->nonparsedMails)) ? $this->correctMails : $this->nonparsedMails;
        if(empty($realMails))
            return false;
        else
            return true;
    }

    private function domainMails()
    {
        $realMails = (empty($this->nonparsedMails)) ? $this->correctMails : $this->nonparsedMails;
        foreach($realMails as $mail)
        {
            $eachMail = explode('@', $mail);
            $this->domainMails[$eachMail[1]][] = $mail;
        }
    }

    private function makeWrongMailsFile()
    {
        if(!empty($this->wrongMails))
        {
            foreach($this->wrongMails as $mail)
            {
                $wrongMailsc .= $mail."\r\n";
            }
            $file = @fopen('xt3mp_badMailList.txt', 'w+');
            @fwrite($file, $wrongMailsc);
            @fclose($file);
        }
    }

    public function checkConfig($list, $result)
    {
        if($list == 'no' && $result == 'no')
            return false;
        else
            return true;
    }

    public function splitMails($parts)
    {
        $realMails = (empty($this->nonparsedMails)) ? $this->correctMails : $this->nonparsedMails;
        $totalMails = count($realMails);
        $totalParts = ceil($totalMails / $parts);
        for($i = 1; $i <= $parts; $i++)
        {
            $next = $i * $totalParts;
            $prev = ($i - 1) * $totalParts;
            for($x = $prev; $x < $next; $x++)
            {
                $newMailList .= $realMails[$x]."\r\n";
            }
            $file = @fopen('Xt3mP_mailList_'.$i.'.txt', 'w+');
            if($file)
            {
                @fwrite($file, $newMailList);
                @fclose($file);
                unset($newMailList);
                $status = true;
            }
            else
                $status = false;
        }
        $this->makeWrongMailsFile();
        return $status;
    }

    public function printMails($type)
    {
        $this->domainMails();
        if($type == 'all')
        {
            $realMails = (empty($this->nonparsedMails)) ? $this->correctMails : $this->nonparsedMails;
            asort($realMails);
            $textArea = '<textarea rows="10" cols="50" class="result">';
            foreach($realMails as $mail)
            {
                $textArea .= strtolower($mail)."\r\n";
            }
            $textArea .= '</textarea>';
            echo $textArea;
        }
        else
        {
            foreach($this->domainMails as $te => $domain)
            {
                asort($domain);
                $textArea .= '<textarea rows="10" cols="50" class="result">';
                foreach($domain as $mail)
                {
                    $textArea .= strtolower($mail)."\r\n";
                }
                $textArea .= '</textarea>';
            }
            echo $textArea;
        }
        return true;
    }
}
?>
<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script>
<script>
$(function(){
    $("#result").change(function(){
        val = $(this).val();
        if(val == "yes"){
            $(".result").fadeIn("slow");
        }else{
            $(".result").fadeOut("slow");
        }
    })
    $("#list").change(function(){
        val = $(this).val();
        if(val == "yes"){
            $(".list").fadeIn("slow");
        }else{
            $(".list").fadeOut("slow");
        }
    })
})
</script>
<style type="text/css">
body{
    background-color: #2b2b2b;
}
div#container{
    height: auto;
    font-family: arial, 'lucida console', sans-serif;
    font-size: 12px;
    margin: 0 auto;
    text-shadow: 1px 1px 1px #000;
    width: 500px;
}
div#container fieldset{
    background-color: #444;
    border: double #000;
    color: #FFF;
    padding: 5px;
}
div#container legend{
    background-color: #222;
    border: double #000;
    color: #FFF;
    padding: 5px;
}
div#container input, div#container select, div#container textarea{
    background-color: #222;
    border: 1px solid #000;
    color: #FFF;
    padding: 5px;
    width:  74%;
}
div#container input, div#container textarea{width: 72%;}
div#container input[type=submit]{width: 100px;}
div#container input[type=submit]:hover{
    cursor: pointer;
    background-color: #444;
}
div#container textarea.result
{
    width: 98%;
}
div#container label{
    float: left;
    height: 20px;
    text-align: right;
    margin: 6px 1px 0 0;
    width: 25%;
}
div#status .error, div#status .success{
    background-color: #FF7373;
    border: 1px dashed #FF0000;
    margin-top: 5px;
    padding: 5px;
}
div#status .success{
    background-color: #49A349;
    border: 1px dashed #002E00;
}
</style>
</head>
<body>
<div id="container">
    <form action="" method="POST">
        <fieldset>
            <legend>Mail Parser v1.0 | http://xt3mp.mx > [email protected]</legend>
            <label>Remover repetidos:</label><select name="remove"><option value="yes">Sí</option><option value="no">No</option></select>
            <label>Partir:</label><select id="list" name="list"><option value="yes">Sí</option><option value="no">No</option></select>
            <div class="list">
                <label>Núm. de listas:</label><input type="text" name="parts" value="0" size="5" />
            </div>
            <label>Mostrar resultado:</label><select id="result" name="result"><option value="no">No</option><option value="yes">Sí</option></select>
            <div class="result" style="display: none;">
                <label>Formato:</label><select name="format"><option value="all">Todos</option><option value="domain">Por dominio</option></select>
            </div>
            <label>Lista:</label><textarea name="mailList" rows="10" cols="50"></textarea><br />
            <label> </label><input type="submit" name="mailParserv1" value="Parse Mails" />
            <div id="status">
                <?php
                $class = 'error';
                if(isset($_POST['mailParserv1']))
                {
                    $mailParser = new mailParserv1($_POST['mailList']);
                    $mailParser->parseMails();
                    if(!$mailParser->checkConfig($_POST['list'], $_POST['result']))
                    {
                        echo '<div class="'.$class.'">Error: 0x01 > Bad config</div>';
                    }
                    elseif($_POST['remove'] == 'yes' && !$mailParser->removeRepeatmails())
                    {
                        echo '<div class="'.$class.'">Error: 0x02 > Can\'t remove repeated mails</div>';
                    }
                    elseif($_POST['result'] == 'yes' && $_POST['format'] == 'all' && !$mailParser->checkMails())
                    {
                        echo '<div class="'.$class.'">Error: 0x03 > Empty var: correct mails</div>';
                    }
                    elseif($_POST['list'] == 'yes' && ($_POST['parts'] == 0 or !is_numeric($_POST['parts']) or !$mailParser->splitMails($_POST['parts'])))
                    {
                        echo '<div class="'.$class.'">Error: 0x04 > Can\'t make lists</div>';
                    }
                    else{
                        $class = 'success';
                        $next = true;
                        echo '<div class="'.$class.'">Success: 0x01 > Parsed Mails Successful</div>';
                    }
                    if($next)
                    {
                        $class = 'error';
                        if($_POST['result'] == 'yes' && $_POST['format'] == 'all' && !$mailParser->printMails('all'))
                        {
                            echo '<div class="'.$class.'">Error: 0x05 > Can\'t show mails > Format: All</div>';
                        }
                        elseif($_POST['result'] == 'yes'  && $_POST['format'] == 'domain' && !$mailParser->printMails('domains'))
                        {
                            echo '<div class="'.$class.'">Error: 0x05 > Can\'t show mails > Format: Domains</div>';
                        }
                        elseif($_POST['result'] == 'yes')
                        {
                            $class = 'success';
                            echo '<div class="'.$class.'">Success: 0x02 > Mails Showed Successful</div>';
                        }
                    }
                }
                ?>
            </div>
        </legend>
    </form>
</div>
</body>
</html>


Algunas de las cosas que omití al agregarle son: mostrar el número de correos ingresados (basta con hacer un echo count($eachMail) en la función parseMails() de la clase), mostrar cantidad de correos por lista (en caso de que se decidan crear), etc.

Los errores que maneje son los siguientes:

    Errors
        0×01: No se puede elegir NO partir y NO mostrar resultados; al menos una de las dos debe ser sí, si no no tendría caso usar el script.
        0×02: Error interno al intentar remover y validar los correos ingresados (en caso de opción).
        0×03:Error interno al intentar recuperar los correos ingresados.
        0×04:Error interno al intentar crear las listas (en caso de opción).
        0×05: Error interno al intentar mostrar los correos (en caso de opción).
    Success
        0×01: Correos procesados correctamente.
        0×02: Correos mostrados correctamente (en caso de opción).

Nota: Cabe mencionar que una aplicacion de escritorio es mucho más eficaz que éste simple script en PHP, pero me sacó de apuros.
Cada vez que me das Karma me motivas

Muy bueno, me voy a poner a estudiar el codigo asi veo como lo hiciste!
PD: El diseño esta increible tambien vere ese para mis futuros proyectos :)
Saludos,, Cronos.-

Gracias, el design es full CSS.
Cada vez que me das Karma me motivas