Inquiridor
Sistema de newsletter dando problema com paginação e emails inválidos

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") = 30objCDOSYSCon.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.SendIf x = true then
Session("good") = Session("good") + 1
Else
Session("bad") = Session("bad") + 1
motivo = Mailer.Response
End Ifi = i + 1
RS.MoveNext
WendIf 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 = NothingEnd If
%>
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
%>
-
-
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!
-
-
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")) thenobjCDOSYSMail.Send
Session("good") = Session("good") + 1
elseSession("bad") = Session("bad") + 1
motivo = Mailer.Responseend 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! -
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