Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fernando Web

Sistema de Newsletter

Recommended Posts

Bom dia,

 

Fiz um outro codigo para envio de email para usuarios cadastrado em meu site, 3500 apr, ele esta funcionando perfeitamente, mas quando chega a 150 email enviado acontece esse erro:

 

Microsoft OLE DB Provider for ODBC Drivers error '80040e31'

 

[Microsoft][ODBC SQL Server Driver]Timeout expired

 

/loja/painelctrl/envia-news.asp, line 106

a linha 106 é essa

 

Set rsmuda=conexao.Execute(sqlmuda)

 

e a pagina para envio é essa:

<!--#INCLUDE FILE="../funcoes/funcoes_mail.asp"-->
<%
Conn_SQL = "UID=xxx; PWD=xxx; driver={SQL Server}; SERVER=xxx; DATABASE=xxx"

Set conexao = Server.CreateObject("ADODB.Connection")
conexao.Open Conn_SQL

//Verifica se e-mails a serem enviados

sqlVerifica= "SELECT COUNT (*) AS QTD FROM cob_tb_ContatoEmail WHERE id_enviado = 0"
Set rsVerifica=conexao.Execute(sqlVerifica)

if rsVerifica("QTD") = "0" then
%>
<b><br><font color="#DB251D">Não há e-mails disponíveis para envio.<br></b><br>
<%
else


// Todos os registros têm inicialmente o campo newsletter_enviado=0. 
//conforme vão sendo enviadas as mensagens, o valor é trocado para 1.

sqlSend= "SELECT * FROM cob_tb_ContatoEmail WHERE id_enviado = 0"
Set rsSend=conexao.Execute(sqlSend)

//Se todos os registros tiverem o newsletter_enviado=1, ou seja, 
//todas as mensagens foram enviadas, o newsletter_enviado volta para 0.
If rsSend.EOF Then
sqlTudo = "UPDATE cob_tb_ContatoEmail SET "
sqlTudo = sqlTudo &"id_enviado = 0"
sqlTudo = sqlTudo &"WHERE id_enviado = 1"
Set rsTudo=conexao.Execute(sqlTudo)
Set rsTudo=nothing
%>

<b><br><font color="#DB251D">Newsletter enviada com sucesso! <br> Total de e-mails enviados:<%=Session("Ntotal")%><br></b><br>

<%
else

// Conta total de mensagens a serem enviadas
sqlTotal="Select Count(*) AS Ntotal FROM cob_tb_ContatoEmail where id_enviado = 0"
Set rsTotal=conexao.Execute(sqlTotal)
Ntotal=rsTotal("Ntotal")
rsTotal.close
Set rsTotal=nothing


// Conta total de mensagens já enviadas
sqlSent="Select Count(*) AS Nsent FROM cob_tb_ContatoEmail where id_enviado = 1"
Set rsSent=conexao.Execute(sqlSent)
Nsent=rsSent("Nsent")
rssent.close
Set rssent=nothing


 // Conta as mensagens que ainda não foram enviadas para tratar envio das últimas mensagens
sqlFalta="Select Count(*) AS Nfalta FROM cob_tb_ContatoEmail where id_enviado = 0"
Set rsFalta=conexao.Execute(sqlFalta)
Nfalta=rsfalta("Nfalta")
rsFalta.close
Set rsFalta=nothing

// Trata quantas mensagens devem ser enviadas das que sobraram
// Se o número de registros finais for menor que 10, ocorrerá um erro.
// A rotininha abaixo trata esse erro, ou seja, o último loop será feito até o número de registros restantes.
QTDnewsletter = Int(Application("NewsletterQuantidade"))
temp=0
  If Nfalta<QTDnewsletter Then

   temp1=Nfalta

  Else

   temp1=QTDnewsletter

  End If

 
//  Envia mensagens de registro em registro

// Newsletter que sera enviada para usuarios cadastrados
Set HttpObj = Server.CreateObject("AspHTTP.Conn")
HTTPObj.Url = "http://www.cobequi.com.br/loja/mail/lancamento.html"  
HTTPObj.RequestMethod = "GET"
strResult = HTTPObj.GetURL


Do Until temp=temp1
  Set Mailer = Server.CreateObject("SoftArtisans.SMTPMail")
	  Mailer.FromName = "Cobequi. O Shopping da Industria"
	  Mailer.FromAddress = "informativo@cobequi.com.br"
	  //Mailer.CC = "informativo@cobequi.com.br"
	  Mailer.RemoteHost = "localhost"
	  Mailer.AddRecipient rsSend("nm_pessoa"), rsSend("em_pessoa")
	  Mailer.Subject = "Lançamento Cobequi"
	  Mailer.HTMLText = strResult
	  Mailer.SendMail
	  Set Mailer = Nothing
	  
	  
//  '*** Troca valor do newsletter_enviado para 1 onde campo email= email enviado
	  mail=rssend("em_pessoa")
	  sqlmuda = "UPDATE cob_tb_ContatoEmail SET "
	  sqlmuda = sqlmuda &"id_enviado = 1 "
	  sqlmuda = sqlmuda &"WHERE em_pessoa = '"&mail&"'"
	  Set rsmuda=conexao.Execute(sqlmuda)
	  Set rsmuda = Nothing

	  temp=temp+1
	  rssend.MoveNext
Loop



// '***** Imagem transparente para acionar o tempo do JavaScript 

	   TMPnewsletter = Int(Application("NewsletterTempo"))*100
%>
	   <img src="images/Regua1x1.gif" width="1" height="1" onLoad="window.setTimeout('getSecs()',1)"> 
	   Enviando <%=temp1%> mensagens a cada 5 segundos...<br><br>
	   
	   Total: <%=Ntotal%><br>
	   Enviadas: <%=Nsent%><br>
	   <%Session("Ntotal") = Ntotal%>
	   <%//'***** Script que faz refresh da página %>
	   <script language="JavaScript">
	   startday = new Date();
	   clockStart = startday.getTime();
	   function initStopwatch() 
	   { 
	   var myTime = new Date(); 
	   var timeNow = myTime.getTime();  
	   var timeDiff = timeNow - clockStart; 
	   this.diffSecs = timeDiff/<%= TMPnewsletter%>; 
	   return(this.diffSecs); 
	   } 
	   function getSecs() 
	   { 
	   var mySecs = initStopwatch(); 
	   var mySecs1 = ""+mySecs; 
	   mySecs1= mySecs1.substring(0,mySecs1.indexOf(".")); 
	   document.forms[0].timespent.value = mySecs1 
	   if(mySecs1><%= Application("NewsletterTempo")%>) {
	   location.reload();
	   }
	   window.setTimeout('getSecs()',<%= TMPnewsletter%>); 
	   }
	   document.write ("<form><font color=red>Tempo decorrido: </font></a><input size=1 name=timespent style='font-family: Verdana; font-size: 10 pt; COLOR: 0000CC;border: 1 solid #FFFFFF'><font color=red>seg.</font></form>")
	   </script>
	   <br>
	     
	   <%
	   rsSend.Close
	 Set rsSend = Nothing
										
   End If

rsVerifica.Close
Set rsVerifica = Nothing

End If
%>

o codigo funciona assim:

 

a cada 10 segundos ele manda 15 emails e da um refresh da pagina, e assim vai, só que quando chega no email nº150 acontece aquele erro, não sei se é devido ao tempo e N° de email que estou enviando, ou se é erro no codigo.

 

o meu sistema esta ospedado na locaweb!!!

 

se algum puder me ajudar fico grato!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Feche e destrua a conexão também.

 

Analizando o código notei uma redundância: você faz dois SELECTS no banco para pegar exatamente a mesma coisa (e-mails a serem enviados e e-mails que faltam ser enviados).

 

Você pode reduzir bastante a quantidade de registros em seu RecordSet se armazenar o último ID enviado e usar a propriedade TOP no seu SELECT do banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.