Underc0de

Programación Web => Back-end => Mensaje iniciado por: Xt3mP en Julio 16, 2012, 12:03:44 AM

Título: Mail Parser v1.0 – Organiza tu lista de correos
Publicado por: Xt3mP en Julio 16, 2012, 12:03:44 AM
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.

(http://i49.tinypic.com/jsoaro.png)

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) [Seleccionar]
<!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($mailFILTER_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'] == 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.
Título: Re:Mail Parser v1.0 – Organiza tu lista de correos
Publicado por: Cronos en Julio 18, 2012, 01:44:44 PM
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.-
Título: Re:Mail Parser v1.0 – Organiza tu lista de correos
Publicado por: Xt3mP en Julio 18, 2012, 06:39:31 PM
Gracias, el design es full CSS.