Inserindo lista de e-mails no banco direto de um arquivo .txt

Prezados,

 

Depois de muito tempo faço um retorno rápido, mas creio ajudar muitos com esse tutorial.

Devemos tirar esse pensamento de linguagem engessada que o coldFusion tem principalmente no mercado brasileiro, mostrar como ele pode ser poderoso e rápido se o aplicativo for bem programado.

 

Vamos lá:

Funcionalidades – Carrega um arquivo txt, valida e grava os resultados no banco diretamente.

Para testar acessem meu sistema de newsletter:

http://www.penseache.com.br/adm/newsfusion/login.cfm

Usuário = teste
senha = teste

Vamos aos problemas:

Não podemos esquecer que se trata de uma linguagem web,  não tentem carregar arquivos com mais de 20 mil e-mails por que vai demorar, ele foi desenvolvido para carregar com tranqüilidade um txt com no máximo 10 mil e-mails, demora em torno de 5 minutos, dependendo da conexão.

A primeira versão  desenvolvi direto em Cold sem nenhum objeto, de forma errada, uma programação ineficiente, com mais calma vi que poderia chamar o objeto  java.io.FileReader, que nesse caso grava o conteúdo na memória antes de inserir no banco.

Próximas versões:

Limitar a qtd de e-mails por arquivo para 10 mil no Max.
Verificar a duplicidade dos e-mails cadastrados no perfil. ( acrescentar mais 3 min no carregamento)

Ele carrega arquivos da seguinte forma:

email@provedor.com.br
email@provedor.com.br
.
.
email@provedor.com.br

Um sob o outro, sem espaços, fiz desta forma pois a maioria dos programas que constroem essas listas o fazem desta forma.

Código:

——————teste_carrega2.cfm ———————–

<cfif isDefined(‘form.envia’)>

<!— teste inicio, efetua o upload do txt —>

<cffile action=”Upload” filefield=”arquivo” destination=”#getDirectoryFromPath(getTemplatePath())#” nameconflict=”overwrite”>

<!———— Seta o arquivo ————>

<cfset arquivo = #cffile.serverFile#>

<!—— função que verifica a integridade do e-mail,  não foi desenvolvida por mim –à
<cfscript>

 function IsEmail(str) {

         if (REFindNoCase(“^['_a-z0-9-]+(.['_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*.(([a-z]{2,3})|(aero|coop|info|museum|name))$”,str)) return TRUE;

        else return FALSE;

               

                }

</cfscript>

<cfscript>              

fr = createobject(“java”,”java.io.FileReader”);

fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);

br = createobject(“java”,”java.io.BufferedReader”);

br.init(fr);

email_errado =0;

 email_inserido =0;

 queryvirt = queryNew(“NEW_EMAIL”);

 while (br.ready()) {

                 linha = br.readLine();

                 if(IsEmail(#linha#) EQ “true”){

                                email_inserido = email_inserido + 1;

                                QueryAddRow(queryvirt);

                                QuerySetCell(queryvirt, “NEW_EMAIL” , “#linha#” );

                   

                 }

                 else

                 {

                                email_errado = email_errado + 1;

                 }

 }

br.close();

</cfscript>

 

<cfquery name=”queryvirt” dbtype=”query”>

SELECT NEW_EMAIL FROM

queryvirt

</cfquery>

 

   <cfloop query=”queryvirt”>

                   <cfquery datasource=”#dsn#”>

                        INSERT INTO T_NEWSLATER

                        (NEW_EMAIL, NEW_CATEGORIA, email)

                        VALUES

                        (‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)

                    </cfquery>

                </cfloop>

</cfif>

————————————————–

Explicando os pontos importantes:

Crio o objeto JAVA java.io.FileReader
fr = createobject(“java”,”java.io.FileReader”);

Carrego o mesmo
fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);

Crio uma query virtual para armazenar os valores antes dos mesmos serem validados

queryvirt = queryNew(“NEW_EMAIL”);

 

Se o retorno da função for “true” incrementa as variáveis

if(IsEmail(#linha#) EQ “true”){

                                email_inserido = email_inserido + 1;

 

Aqui vem o pulo do gato:

1 Faço um select na no e-mail

2 Faço um loop inserindo os e-mails no banco

<cfquery name=”queryvirt” dbtype=”query”>

SELECT NEW_EMAIL FROM

queryvirt

</cfquery>

   <cfloop query=”queryvirt”>

                   <cfquery datasource=”#dsn#”>

                        INSERT INTO T_NEWSLATER

                        (NEW_EMAIL, NEW_CATEGORIA, email)

                        VALUES

                        (‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)

                    </cfquery>

                </cfloop>

 

Ai vem o código completo:

O mesmo foi escrito bem rápido, desculpe pela identação, não tive muito tempo, estou programando para o Governo.

<cfif not isDefined(“session.admin”) or not isDefined(“session.usuario”)>

<cflocation url=”login.cfm”>

</cfif>

<cfif isDefined(‘form.envia’)>

<!— teste inicio —>

<cffile action=”Upload” filefield=”arquivo” destination=”#getDirectoryFromPath(getTemplatePath())#” nameconflict=”overwrite”>

<!———— Seta o arquivo ————>

<cfset arquivo = #cffile.serverFile#>

<cfscript>

 function IsEmail(str) {

         if (REFindNoCase(“^['_a-z0-9-]+(.['_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*.(([a-z]{2,3})|(aero|coop|info|museum|name))$”,str)) return TRUE;

        else return FALSE;

                  }

</cfscript>

<cfscript>              

fr = createobject(“java”,”java.io.FileReader”);

fr.init(“#getDirectoryFromPath(getTemplatePath())#\#arquivo#”);

br = createobject(“java”,”java.io.BufferedReader”);

br.init(fr);

email_errado =0;

 email_inserido =0;

 queryvirt = queryNew(“NEW_EMAIL”);

 while (br.ready()) {

                 linha = br.readLine();

                 if(IsEmail(#linha#) EQ “true”){

                                email_inserido = email_inserido + 1;

                                QueryAddRow(queryvirt);

                                QuerySetCell(queryvirt, “NEW_EMAIL” , “#linha#” );

                   

                 }

                 else

                 {

                                email_errado = email_errado + 1;

                 }

 }

br.close();

</cfscript>

<cfquery name=”queryvirt” dbtype=”query”>

SELECT NEW_EMAIL FROM

queryvirt

</cfquery>

   <cfloop query=”queryvirt”>

                   <cfquery datasource=”#dsn#”>

                        INSERT INTO T_NEWSLATER

                        (NEW_EMAIL, NEW_CATEGORIA, email)

                        VALUES

                        (‘#NEW_EMAIL#’,'#form.categoria#’,'#session.email#’)

                    </cfquery>

                </cfloop>

</cfif>

<style type=”text/css”>

<!–

.style1 {

                font-family: Verdana, Arial, Helvetica, sans-serif;

                font-size: 10px;

                font-weight: bold;

}

.style2 {color: #FF0000}

#apDiv1 {

                position:absolute;

                left:0px;

                top:0px;

                width:277px;

                height:93px;

                z-index:1;

}

–>

</style>

<body topmargin=”0″ leftmargin=”0″>

<form action=”teste_carrega2.cfm” method=”post” enctype=”multipart/form-data”>
<table width=”274″ border=”0″ cellspacing=”0″ cellpadding=”0″>
<tr>

    <td colspan=”2″> <span class=”style1″>Carregar arquivo de lista (texto)</span></td>

  </tr>

  <tr>

    <td colspan=”2″><cfif isDefined(‘form.envia’)><table width=”276″ border=”0″ cellpadding=”0″ cellspacing=”0″ class=”style1″>

      <tr>

        <td width=”84″ bgcolor=”#CCFF33″>Inseridos</td>

        <td width=”192″ bgcolor=”#CCFF33″><cfoutput><span class=”style2″>#email_inserido#</span></cfoutput></td>

      </tr>

      <tr>

        <td bgcolor=”#CCFF33″>Errados</td>

        <td bgcolor=”#CCFF33″><cfoutput><span class=”style2″>#email_errado#</span></cfoutput></td>

      </TR>

    </table>

    </cfif></td>

    </tr>

  <tr>

    <td width=”56″ class=”style1″>Arquivo</td>

    <td width=”218″><input name=”arquivo” type=”file” class=”style1″ id=”arquivo”></td>

  </tr>

  <tr>

    <td class=”style1″>Categoria</td>

    <td><input name=”categoria” type=”text” class=”style1″ id=”categoria”></td>

  </tr>

  <tr>

    <td>&nbsp;</td>

    <td><div align=”right”>

      <input name=”envia” type=”submit” class=”style1″ id=”envia” value=”Carregar lista” />

    </div></td>

  </tr>

</table>

</form>

 

O algoritmo acima está funcional, basta criar o CFM e se divertir…

O programa pode ser muito otimizado ainda, vocês tem inteira liberdade para tal.

Grande abraço e bom 2009 !

Diogo Romano Souza

MSN vibeair@hotmail.com

Escrito por Diogo_Romano on janeiro 13, 2009. Arquivado em Coldfusion. Você pode seguir as respostas a esse artigo pelo RSS 2.0. Você pode deixar respostas para esse artigo

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>