none
problema com o cdosys RRS feed

  • Pergunta

  • Olá,

    meu servidor de hospedagem migrou de cdonts para cdosys e a partir dai tive problemas com newsletter.
    na base de dados eu tenho aproximadamente 3800 e-mails, e alguns são inválidos ou deixaram de existir.
    Com o código que o servidor (Terra) me passou, a newsletter vai enviando até chegar a algum inválido e tranca dando erro.
    Dai eu utilizei o comando On Error Resume Next e solucionou, mas para vários destinatários estão chegando 3, 5 ou até 15 e-mails iguais. e eu tive que cancelar.
    alguém sabe se é algum erro no loop ou no meu script?
    agradeço desde já a ajuda!


        Do While Not RS.eof      
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If   
            RS.movenext
            On Error Resume Next   
            objCDOSYSMail.Send
       
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing
    quinta-feira, 22 de novembro de 2007 17:12

Todas as Respostas

  • Pelo lógica acho que deveria ficar assim, se estiver por favor me corrijam:

     

        Do While Not RS.eof      
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If    
            objCDOSYSMail.Send 
            On Error Resume Next    
            
            RS.movenext
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing

     

    Só testando pra saber, infelizmente =(

     

    Abraços

     

    Estevam

    sexta-feira, 23 de novembro de 2007 02:19
  • ontem eu mudei assim:
    botei o  On Error Resume Next    antes de tudo... agora ta enviando normal, exceto para alguns que foi 2 e-mails...


        On Error Resume Next    
        Do While Not RS.eof      
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If   
            objCDOSYSMail.Send
            RS.movenext   
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing
    sexta-feira, 23 de novembro de 2007 15:35
  • Alguém sabe me dizer se é normal este código enviar a newsletter mais de uma vez para o mesmo destinatário?
    Está acontecendo isso...

    obrigado
    terça-feira, 27 de novembro de 2007 16:21
  • Seu recordset nao esta trazendo e-mails repetidos nao? Como esta seu select?

     

    Abraços

     

    Estevam

    terça-feira, 27 de novembro de 2007 17:43
  • não... foi um cuidado que eu tive, o cadastro não é aceito se tiver e-mails iguais... olhei os que estão voltando e estão cadastrados 1 vez apenas...
    o que eu tenho são vários e-mails inválido (?) para o cdosys, mas o On Error Resume Next  pula estes e-mails... será que eu utilizei ele de maneira errada?

    <%
    Server.ScriptTimeout = 1000000
    Set RS = Server.CreateObject("ADODB.Recordset")
    Set RSBODY = Server.CreateObject("ADODB.Recordset")
    SQL2 = "SELECT * from Settings"
    RSBODY.Open SQL2, Conn, 1, 3

    SQL = "SELECT Email FROM List"
    RS.open SQL, conn

        On Error Resume Next   
        Do While Not RS.eof
          
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If   
            objCDOSYSMail.Send
            RS.movenext   
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing

    %>
    terça-feira, 27 de novembro de 2007 17:51
  • Tenta fazer com um dos dois códigos  abaixo pra ver o que dá:

     

    1) O primeiro código grava o e-mail que já foi feito o send em uma variável, no retorno do loop ele verifica se já foi feito o envio para o e-mail correspondente, se já tiver sido feito ele dá um movenext no recordset.

     

    <%
    Server.ScriptTimeout = 1000000
    Set RS = Server.CreateObject("ADODB.Recordset")
    Set RSBODY = Server.CreateObject("ADODB.Recordset")
    SQL2 = "SELECT * from Settings"
    RSBODY.Open SQL2, Conn, 1, 3

    SQL = "SELECT Email FROM List"
    RS.open SQL, conn
    Dim emailanterior : emailanterior = ""

        Do While Not RS.eof
          
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If
            if rs("Email") <> emailanterior then    
                  objCDOSYSMail.Send
                  emailanterior = rs("Email")
            end if
            RS.movenext   
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing
    %>
     
     
    2) O segundo código abaixo, tento recuperar o erro do objeto de envio e se houver erro gravo o e-mail e o erro, depois te mostro na tela, antes isso era feito com (Cdonts nao sei se funciona com Cdosys).
    <%
    Server.ScriptTimeout = 1000000
    Set RS = Server.CreateObject("ADODB.Recordset")
    Set RSBODY = Server.CreateObject("ADODB.Recordset")
    SQL2 = "SELECT * from Settings"
    RSBODY.Open SQL2, Conn, 1, 3

    SQL = "SELECT Email FROM List"
    RS.open SQL, conn
    Dim resultado : resultado = ""
    Dim erro : erro = ""

        Do While Not RS.eof
          
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If
            resultado = objCDOSYSMail.Send
            if resultado <> 0 then    
                  erro = erro & "Email: " & rs("Email") &  " -- Erro: " & resultado & "<br/><hr><br/>" 
            end if
            RS.movenext   
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing
        Response.Write(erro)
    %>
     
    Bom só testando pra saber agora, por favor, retorne com os resultados dos testes.
     
    Abraços
     
    Estevam
    terça-feira, 27 de novembro de 2007 19:21
  • sem o On Error Resume Next   não vai... ele tranca quando encontra um e-mail inválido...
    quando eu usava cdonts não tinha problema..

    acho que essa mudança, cdonts > cdosys foi a pior mudança de todos os tempos!
    só trouxe problemas e desvantagens
    terça-feira, 27 de novembro de 2007 19:26
  • Eu tentaria fazer o teste mesmo assim, sem o On Error, pra ver o que acontece!

    Se nao poder testar com a base de clientes configura uma base de testes e coloque uns 10 e-mails entre eles alguns que nao existam.

    Se mesmo assim quiser fazer com o On Error Resume Next, coloque-o após o objCDOSYSMail.Send, pois da maneira que ele estava antes no seu código pelo que eu vi, ele estava fora do loop, entao nao estava fazendo efeito algum (pelo que entendo).

    Mesmo assim, agradeço se retornar com os testes que realizou.

     

    Abraços

     

    Estevam

    terça-feira, 27 de novembro de 2007 19:31
  • resultou isso:

    error '8004020f'

    /cdosys/envia2.asp, line 30


    quando ele encontra um e-mail inválido


    quinta-feira, 29 de novembro de 2007 16:20
  • Qual dos códigos utilizou?

    O que voce tem na linha 30?

     

    Abraços

     

    Estevam

     

    quinta-feira, 29 de novembro de 2007 16:32
  • usei o segundo...

    o erro foi no objCDOSYSMail.Send

    o cdosys cancela o envio se encontra um e-mail inválido, certo?
    por isso que eu usava o on error

    tentei fazer um tratamento de erro assim, mas ele diz que envia mesmo os inválidos... tendo o on error ele passa como se tivesse enviado o e-mail... tu sabe o que pode ser?

            On Error Resume Next
            If Error.Number <> 0 Then
                Response.Write "OK! - "& lista("Email") &"<br>"
            Else
                Response.Write "ERRO - "& lista("Email") &"<br>"
            End If               
            Response.Write "OK! - "& lista("Email") &"<br>"       
            lista.movenext   


    valeu por estar me ajudando cara...
    quinta-feira, 29 de novembro de 2007 16:37
  • Como voce utilizou o segundo código e pelo que disse ele da erro no send, porque ele nao consegue jogar o erro dentro da variável.

    Outro problema é que pelo que sei, On Error Resume Next simplesmente ignora o erro, e continua o processamento do script. ou seja, ele nao faz nenhuma validação se der erro ou nao ele faz o envio do e-mail do mesmo jeito.

    Me fala um coisa sua base tem muitos e-mails?

    Chegou a testar o primeiro código e também nao deu certo?

     

    Abraços

     

    Estevam

     

    quinta-feira, 29 de novembro de 2007 16:48
  • eu to testando o 1º agora... e vou retornar todos e-mails enviados na tela pra ver se foram duplicados...

    tenho 3800 e-mails na base de dados...

    valeu!
    quinta-feira, 29 de novembro de 2007 16:50
  • Se nao der certo com o primeiro codigo só vejo uma solução, criar um campo na tabela de e-mails que vai indicar se o e-mail já foi enviado ou nao, e fazer todo processo pelo ASP, a cada tentativa de envio agente verifica se o e-mail foi enviado ou nao.

     

    Abraços

     

    Estevam

    quinta-feira, 29 de novembro de 2007 16:54

  • cara, usei o código abaixo e aparentemente não foi nenhum duplicado... eu vo analisar melhor a lista e esperar os retornos... mas acho que deu certo.

    muito obrigado cara, tu foi um dos poucos que me ajudou a solucionar esse problema (solucionar pelo menos por enquanto :-))
    abs!

    Server.ScriptTimeout = 1000000
    Set RS = Server.CreateObject("ADODB.Recordset")
    Set RSBODY = Server.CreateObject("ADODB.Recordset")
    SQL2 = "SELECT * from Settings"
    RSBODY.Open SQL2, Conn, 1, 3

    SQL = "SELECT Email FROM List"
    RS.open SQL, conn
    Dim emailanterior : emailanterior = ""

    'Select Case RSBODY("Component")
    'Case "CDONTS"

        On Error Resume Next
        Do While Not RS.eof
               
            Set objCDOSYSMail = Server.CreateObject("CDO.Message")
            Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail-fwd"
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
            objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
            objCDOSYSCon.Fields.update
            Set objCDOSYSMail.Configuration = objCDOSYSCon
            objCDOSYSMail.From = RSBODY("From_Email")
            objCDOSYSMail.To =  RS("Email")
            objCDOSYSMail.Subject = Request("Subject")
            If (Request("Format") = "Text") Then
                objCDOSYSMail.TextBody = Request("Body")
            Else
                objCDOSYSMail.HTMLBody = Request("Body")
            End If   
            if RS("Email") <> emailanterior then   
                  objCDOSYSMail.Send
                  emailanterior = RS("Email")
                  response.write RS("Email") & "<br>"
            end if       
            RS.movenext   
        Loop

        Set objCDOSYSMail = Nothing
        Set objCDOSYSCon = Nothing

    quinta-feira, 29 de novembro de 2007 17:32
  • Blz verifique se realmente funcionou! Se funcionou nao esqueça de marcar o post, se nao funcionou retorno que agente cria uma outra solução.

     

    Abraços

     

    Estevam

    quinta-feira, 29 de novembro de 2007 17:43
  • Cara...

    ontem quando eu testei e foi normal eu enviei um e-mail simples, só com o logo do site e uma imagem.
    hoje eu fui mandar a newsletter completa, que tem bastante texto, com 217 linhas no html, e recebi muitos e-mails de retorno, duplicados, triplicados e até quadriplicados... não sei se as pessoas receberam mais de uma vez, mas nenhum do hotmail e ig chegou...

    será que esse problema tem alguma coisa a ver com o que eu estou enviando? pois no resultado da newsletter, no response write, foi só uma vez cada e-mail, mas se eu recebi mais de um retorno significa que ele tentou enviar mais de uma vez certo?

    valeu

    sexta-feira, 30 de novembro de 2007 17:49
  • Então o certo seria saber qual o erro que ocorre no envio, pois pelo que você acabou de comentar pode ser tanto erro de e-mail inválido, quanto a mensagem estar sendo tratada com erro, mas de qualquer forma esta multiplicação de e-mails que esta ocorrendo provavelmente por que o Cdosys quando encontra um erro, por algum motivo ele restarta o envio de e-mails começando do zero, por isso pode ocorrer de alguns virem duplicados e outros triplicados, pelo menos é que parece acontecer.

     

    Este envio de e-mails é feito por um servidor dentro de sua empresa, ou de um provedor? Se for de provedor, o servidor é dedicado, ou seja, voces tem controla total no server?

     

    De qualquer forma acho que para resolvermos o problema voce tera que criar uma tabela temporária aonde vai armazenar o e-mail que já foi enviado, a cada passagem do loop agente verifica se já foi enviado ou nao, se nao foi faz o envio normal.

     

    Por que isso?

     

    Por que o código que te passei, ele guarda somente o último e-mail enviado, se o proximo for ele mesmo não envia, mas e os outros que já foram acabam sendo enviados novamente. A lógica em sim parece correta já que esta dentro de um loop, mas por algum motivo o Cdosys (devido a esses erros) não esta obedecendo a lógica.

     

    Se precisar de ajuda pra criar o código posta novamente que agente senta o dedo no código.

     

     

    Abraços

     

    Estevam

     

    sexta-feira, 30 de novembro de 2007 19:40
  • cara... mas o que eu não to entendo é o seguinte:

    se ele reinicia cada vez que encontra um inválido, por que o meu e-mail q é bem no inicio do banco recebe só uma vez?
    não faz sentido ne?
    e ontem não foi nenhum duplicado...
    sexta-feira, 30 de novembro de 2007 19:46
  • Então realmente isso é meio estranho, mas isso só poderiamos saber se conseguisimos exatamente os erros que ocorrem no envio, do jeito que esta, estando tentando arrumar um motor no escuro, mas tenta fazer da maneira que te falei criando a tabela temporário e fazendo um select antes do envio na tabela temporária se o e-mail já foi enviado ou nao, se acontecer o mesmo problema realmente ai é pau no Cdosys e a unica forma vai ser descobrir quais os erros que ocorrem e como trata-los.

     

    Abraços

     

    Estevam

     

    sexta-feira, 30 de novembro de 2007 20:30
  • Oi Luiz...

    o que eu pude notar é que um dos problemas que ta causando isso é a recusa do servidor.
    quando eu relatei que enviei uma newsletter e foi normal, não duplicou nenhum.
    já, hoje por exemplo, eu tentando enviar para e-mail do hotmail ele retorna como spam e recebo retornos iguais mais de uma vez...

    se meu site estivesse hospedado em um servidor pequeno tudo bem, mas está no Terra...
    será que pode ser isso? eu já vi gente reclamando que está com problemas em mandar e-mail cdosys do terra > hotmail...

    mas será que pode ser a causa dos duplicados?

    abs
    segunda-feira, 3 de dezembro de 2007 18:01
  • Mas ai entra outro detalhe importante, apesar do terra ser considerado um provedor grande, se o IP que voce estiver usando do terra estiver listado em listas de spans, não adianta, vai ser barrado pelos filtros e bloqueado, agora quando voce enviou a newsletter foram para poucos ou muitos e-mails?
     
    Te pergunto isto, porque os provedores costumam bloquear tentativas de envio de mensagens multiplas simultaneamente, por exemplo, tinha um provedor, que se voce enviasse mais de 20 mensagens em menos de 5 minutos ele considerava spam e bloqueava o envio de outras mensagens, ou seja, eu tinha que enviar de 20 em 20 a cada 5 minutos. Voce deve estar pensando isso é um mer...! Realmente é! Mas para fugir disso só voce encontrando um provedor que libere o stmp pra voce, mas a probabilidade desse ip já estar em lista de spam é muito grande, ou contratando um link dedicado e fazendo um servidor de e-mail próprio, mas voce também teria que ficar pedindo a liberação do seu ip nas listas de spam, ou seja, voce seria bloqueado de uma forma ou de outra, já cansei de tentar fazer liberação de IP de cliente que ficava bloqueado em lista de spam, e nem eram eles que enviavam, e sim outras pessoas do mesmo provedor que acabam usando um mesmo range de IP.
     
    Outro detalhe importante não sei qual o seu nível de acesso ao terra, mas a maioria dos servidores de e-mails devem ter uma conta chamada postmaster@seudominio... ou abuse@seudominio.... para que os filtros possam enviar mensagens e verificar que não é nenhum robozinho da net que esta fazendo o envio, verifique isso com o terra.
     
    Hoje em dia não vejo muito saída para o envio de e-mails em massa, pelo menos não conheço nenhuma solução, se alguém souber do fórum ficaria muito grato com a contribuição.
     
    Tinha até um programinha que usava antes que se chamava "Carteiro", não sei se funciona ainda, mas quebrava um galho.
     
    Abraços
     
    Estevam
    segunda-feira, 3 de dezembro de 2007 18:17
  • Engracado, esotu lendo esse topico muito depois, e percebi que teria uma solucao relativamente simples para esse caso, porque nao utilizar uma funcao para verificar email por email antes de "sendar" o e-mail.

    Ex. IF ValidaEmail(rs("email")) objCDOSYSMail.Send

    Caso o email fosse invalido, ele pularia. E continuaria o processamento.

    sexta-feira, 15 de maio de 2009 23:18