none
Sistema de newsletter dando problema com paginação e emails inválidos RRS feed

  • Pergunta

  • Olá pessoal

     

    Sou iniciante em asp e to tentando desenvolver um sistema de newsletter. Possuo um banco de dados em access com 18.000 e-mails e preciso dispará-los de 99 em 99 a cada 20 seg (dados fornecedidos pelo Terra pra evitar prática de spam). O componente aceito lá é o CDOSYS.

     

    Bom, criei um sistema simples q funcionava perfeita. Só q como tem essa questão de ter q disparar 99 em 99 e-mails por vez, tive q fazer paginação. Funcionava perfeitamente, até encontrar um e-mail inválido dentro do banco. Resolvi acrescentando On Error Resume Next.

     

    O problema: Como o sistema tem paginação, o On Error Resume Next só funciona na página 1 (no envio dos primeiros 99 emails). Se na página 2 tiver um e-mail inválido, dá erro e o sistema não envia mais pra ninguém.

     

    To há dias tentando resolver e pesquisando, mas não consegui nada ainda. Por favor, vcs poderiam me ajudar??

     

    Obrigada desde já!!

    Luciana

     

    Segue o cód para análise:

     

    --------------------------------------------

     

     

    <%
    remetente = request("remetente")
    Assunto = request("assunto")
    conteudo = request("conteudo")

    Set ObjConn = Server.CreateObject("ADODB.Connection")
    Set RS = Server.CreateObject("ADODB.RecordSet")
    ObjConn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="& server.MapPath("dados.mdb")

     


    SQL = "SELECT email FROM emailfoco GROUP BY email"

    RS.Open SQL, ObjConn, 3, 3


    If Request.QueryString("pagina") = "" Then
    pagina = 1
    Else
    pagina = Request.QueryString("pagina")
    End if

     


    const registros = 20


    RS.PageSize = registros


    RS.AbsolutePage = pagina


    totpaginas = RS.PageCount


    totregistros = RS.RecordCount


    i = 1

     


    While NOT RS.EOF AND NOT i > registros

     

    'cria o objeto para o envio de e-mail
    Set objCDOSYSMail = Server.CreateObject("CDO.Message")

    'cria o objeto para configuração do SMTP
    Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")

    'SMTP
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"

    'porta do SMTP
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

    'porta do CDO
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

    'timeout
    objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30

    objCDOSYSCon.Fields.update

    'atualiza a configuração do CDOSYS para o envio do e-mail
    Set objCDOSYSMail.Configuration = objCDOSYSCon

    'e-mail do remetente
    objCDOSYSMail.From = email@cliente.com.br

    'e-mail do destinatário
    objCDOSYSMail.To = RS("email")

    'assunto da mensagem
    objCDOSYSMail.Subject = assunto

    'conteúdo da mensagem
    'objCDOSYSMail.TextBody = conteudo
    'para envio da mensagem no formato html altere o TextBody para HtmlBody
    objCDOSYSMail.HtmlBody = conteudo

    'objCDOSYSMail.fields.update
    'envia o e-mail
     On Error Resume Next
    objCDOSYSMail.Send

     

    If x = true then
    Session("good") = Session("good") + 1
    Else
    Session("bad") = Session("bad") + 1
    motivo = Mailer.Response
    End If

    i = i + 1
    RS.MoveNext
    Wend

     

    If NOT (pagina > totpaginas) Then

    Response.AddHeader "Refresh", "2;URL=enviar.asp?pagina="&pagina+1
    Response.Write("<strong><font face=verdana color=red>20 e-mails enviados.<BR>")
    Response.Write("Aguarde, preparando script para enviar mais 20 e-mails...</font></strong>")

    Else

    Response.Write("<strong><font face=verdana color=red>Todos os e-mails enviados.</font></strong><BR><BR>")
    Response.Write("<font face=verdana color=blue><b>Estatísticas</b></font><BR>=============================<BR>")
    Response.Write("<font face=verdana color=black>E-mails enviados com sucesso: <b>"&Session("good")&"</b><BR>")
    Response.Write("E-mails enviados sem sucesso: <b>"&Session("bad")&"</b><BR>")
    Response.Write("Erro: <b>"&motivo&"</b><BR>--<BR>")
    Response.Write("Total de e-mails no banco de dados: <b>"&totregistros&"</b></font>")
    Session("good") = 0
    Session("bad") = 0
    Set Mailer = Nothing
    Set RS = Nothing
    Set ObjConn = Nothing

    End If
    %>

     

    quinta-feira, 3 de janeiro de 2008 18:20

Todas as Respostas

  • Olá Luciana,

     

    Creio que você terá que realizar algumas alterações na lógica de sua página, para que quando o script encontre algum e-mail inválido o loop para o envio das mensagens continue em execução.

     

    Não estou familiarizado com o CDOSYS, mas no JMAIL (dimac.net), é possível fazer algo do tipo...

     

    Code Block

    <%

    While ...

    ...

    If objMail.Send() Then

    'E-mail enviado com sucesso, vá para o próximo registro...

    Else

    'Erro ao enviar o e-mail, salvar o endereço de e-mail inválido no Log via FSO e vá para o próximo registro...

    End If

    ...

    Wend

    %>

     

     

    sexta-feira, 4 de janeiro de 2008 12:20
  • Olá amigo, obrigada por responder!!

     

    Infelizmente não estou familirizada com o JMail, por isso não consegui adaptar.

     

    Teria alguém familiarizado com CDOSYS q pudesse me ajudar?? Meu servidor só roda CDOSYS.

    Obrigada,

    Luciana

    domingo, 6 de janeiro de 2008 18:04
  • Olá Luciana,

     

    O problema não é com o componente ou com o uso do mesmo e sim com a lógica utilizada, creio que você terá que fazer algumas alterações no modo de funcionamento do seu script, citei o exemplo do JMAIL apenas para você ter uma idéia. Boa Sorte!

     

    segunda-feira, 7 de janeiro de 2008 11:31
  • Aí é q tá, sei q tem erro mas não consigo achar e fazer as modificações, por isso vim pedir ajuda, depois de ter pesquisado muito sobre isso.....

    Se alguém puder ajudar, agradeço.

    segunda-feira, 7 de janeiro de 2008 15:53
  • Oi luciana,
    tente criar uma função (ou procure na net)para validar email. essa função receberia uma string (o email) e faria a ferificação para ver se é um endereço valido e retornaria true / false, de acordo com o email.

    ai antes de vc chamar o metodo send() faz a verificacao... tipo...

    (...)


    if ValidaEmail(rs("email")) then

                               objCDOSYSMail.Send

           Session("good") = Session("good") + 1
    else

           Session("bad") = Session("bad") + 1
           motivo = Mailer.Response

    end if

    (...)

     

    bom, aconselho a usar um vetor (ou qualquer outra forma), que vc possa gravar todos os motivos, do jeito q vc fez so vai gravar o ultimo motivo.

    funcao para verificar email vc acha pela net tranquilamente.


    espero ter ajudado!

    terça-feira, 15 de janeiro de 2008 17:41
  • Acredito que o problema não seja somente testar se o e-mail é válido ou não, o problema maior é quando o e-mail aparentemente pareça estar válido, mas quando o componente tenta o envio, verifica que o e-mail não existe, ai ele retorna com, o problema é tratar esse sem parar com o loop de envio de mensagens.

    Creio que seja este o problema!?!?!

     

    Abraços

     

    Estevam

    terça-feira, 15 de janeiro de 2008 18:18