Página 2 de 4

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 14 Jul 2011 16:27
por HASA
:-O

Olá, sygecom, obrigado mais uma vez, vou qurebrando a cabeça por aqui, mas... será que alguma LIB pode estar dando conflito ou coisa parecida, tipo 2 libs do Xharbour que tenham chamadas que possam estar dando esse erro ?

Hasa

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 14 Jul 2011 19:34
por sygecom
Olá Hasa,

Nesse caso segue as LIB que estou usando no meu sistema, talvez alguma ajude nesse caso:

[D:\Devel\xHarbour\contrib\hwgui\lib\hwgui.lib]
[D:\Devel\xHarbour\contrib\sqlrdd\lib\BC5\SQL.lib]
[D:\Devel\xHarbour\contrib\sqlrdd\lib\BC5\libpq.lib]
[D:\Devel\xHarbour\lib\gdlib.lib]
[D:\Devel\xHarbour\lib\libbgd.lib]
[D:\Devel\xHarbour\lib\hbhpdf.lib]
[D:\Devel\xHarbour\lib\pdflib.lib]
[D:\Devel\xHarbour\lib\zlib.lib]
[D:\Devel\xHarbour\lib\hbzip.lib]
[D:\Devel\xHarbour\lib\tip.lib]
[D:\Devel\xHarbour\lib\tipssl.lib]
[D:\Devel\xHarbour\lib\codepage.lib]
[D:\Devel\xHarbour\lib\libfi.lib]

Tente conforme abaixo e veja o que acontece:

Código: Selecionar todos

FUNCTION ENVIA_EMAIL
LOCAL oOutLook,oMailItem,oRecip,oAttach
      TRY
         oOutLook := GetActiveObject( "Outlook.Application" )
      CATCH
         TRY
            oOutLook := CREATEOBJECT("Outlook.Application")
         CATCH
             MsgStop("Não foi Possivel Achar o Outlook Instalado, Favor revisar","Aviso do Sistema")
             RETURN
         END
      END
      oMailItem := oOutLook:Invoke("CreateItem", 0)
      oRecip := oMailItem:Invoke("Recipients")
      oRecip:Invoke("Add",'destino@servidor.com.br' )
      oMailItem:Set("Subject", 'Asunto' )
      oMailItem:Set("Body", 'Corpo do email' )
      oAttach := oMailItem:Invoke("Attachments")
      FOR x=1 to len(aFiles) //anexos
          oAttach:Invoke("Add", aFiles[x] )
      NEXT
      oMailItem:Invoke("Send")
      oOutlook:Quit()
RETURN

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 09:41
por HASA
:))

Legal vou testar, dessa lista a que eu uso que não tem ai é hbole.lib, será que é essa ? é a única que tem haver com a história
Hasa
:D

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 10:05
por HASA
:%
Ainda não deu, o erro exato é:

Error BASE/1004 Class: 'NUMERIC' has no exported method: INVOKE
Called from INVOKE(0)

Minigui Ext. Build 95 + Xharbour 1.2.1 (Rev.9371) + Bcc5

Hasa

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 15:29
por glopes2011
Pela mensagem de erro que apresenta, parece
que voce está passando uma variavel numerica ao
inves de uma constante ou character.

Tenta ver se não é isto.

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 16:22
por HASA
:%
Boa tarde na verdade a classe está dizendo que eu deveria passar um valor numerico, eu estou passando o email mesmo.
:(Neg

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 17:40
por glopes2011
Faça o seguinte coloque sua rotina completa para eu testa-la com o meu outlook.
O que o sigecom colocou funcionou para mim.
Ai poderemos ver se é programa no outlook.

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 17:57
por HASA
:D
Ok,ai está :

Código: Selecionar todos

**
* ENVIAR EMAIL ATRAVEZ DO OUTLOOK/2007
**

FUNCTION EMAIL_OUTLOOK_2007( cAssunto, cTexto, cDestAddress, xARQUIVO1, xARQUIVO2 )

LOCAL x

DECLARE aFiles[2]

aFiles[ 1 ] = IIF( EMPTY( xARQUIVO1 ), "", xARQUIVO1 )
aFiles[ 2 ] = IIF( EMPTY( xARQUIVO2 ), "", xARQUIVO2 )

TRY
    oOutLook := GetActiveObject("Outlook.Application")
   *oOutLook  := TOleAuto():New( "Outlook.Application" )
CATCH
   TRY
      oOutLook := CREATEOBJECT("Outlook.Application")
      *oOutLook  := TOleAuto():New( "Outlook.Application" )
   CATCH
      PLAYEXCLAMATION()
      MsgStop( "Não encontrei Outlook/2000 ou superior, Verifique" , SISTEMA )
      RETURN NIL
   END
END

oMailItem := oOutLook:Invoke( "CreateItem", 0 )
oRecip    := oMailItem:Invoke("Recipients")
oRecip:Invoke("Add", cDestAddress )

oMailItem:Set("Subject", cAssunto )
oMailItem:Set("Body", cTexto )

oAttach   := oMailItem:Invoke("Attachments")

FOR x = 1 to len( aFiles )
    oAttach:Invoke("Add", aFiles[ x ] ) // aqui os anexos
NEXT

oMailItem:Invoke("Send") //ENVIA O E-MAIL
oOutlook:Quit()

RETURN NIL
:(

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 15 Jul 2011 18:14
por sygecom
Olá Hassa,
Vamos de novo, tente assim:

Código: Selecionar todos

#define olMailItem 0
FUNCTION EMAIL_OUTLOOK
LOCAL oOutlook, oMail
    TRY
        oOutlook = CREATEOBJECT( "Outlook.Application" )
    CATCH
        MsgStop("Não foi Possivel Achar o Outlook Instalado, Favor revisar","Aviso do Sistema")
        RETURN
    END

    oMail = oOutlook:CreateItem( olMailItem )
    oMail:Recipients:Add( "destino@servidor.com.br" )
    oMail:Subject = "Assunto"
    oMail:Body = 'Corpo do E-mail'
    FOR x=1 to len(aFiles)
        oMail:Attachments:Add( aFiles[x] ) // anexos
    NEXT
    //oMail:HTMLBody = MEMOREAD( "c:\fundo_email.htm" )
    oMail:Send()
    oOutlook:Quit()
RETURN

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 18 Jul 2011 03:03
por rochinha
Amiguinhos,

Outlook Express e Outlook Office são duas coisas bem diferentes, tanto em interface quanto em objetos acessiveis via API.

O Outlook chamado por Outlook.Application chama as propriedades e métodos do Outlook Office ou seja Outlook 2000, 2003, 2007.

Para acessar as propriedades e métodos do Outlook Express deve-se usar OutlookExpress.Application.

O erro provocado por INVOKE significa que o método ou propriedade não existe ou não tem o mesmo nome.

O incoveniente de se usar o Outlook para esta tarefa é a chatice do: "...um aplicativo externo esta tentando acessar o outlook...

Acho ainda que o melhor é integrar o BLAT como motor de emails, seja por aplicativo externo ou acesso as funções de sua .DLL.

Para acessá-lo, bastará criar a string de envio e chamar o BLAT.EXE passando a mesma como parametro ou passar a string como parametro das funções da .DLL.

Código: Selecionar todos

DLL32 FUNCTION SendB( sBlatString AS STRING ) AS LONG PASCAL ;
      FROM "SendBlat" LIB "Blat.dll" 

DLL32 FUNCTION BlatSend( BlatCMD AS STRING ) AS LONG PASCAL;
      FROM "Send" LIB "Blat.dll" 

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 18 Jul 2011 13:26
por HASA
:))
Olá Leonardo,vou testar e aproveitar essa dica do Rocha, pois teremos clientes com OUTLOOK do XP/7/OFFICE ai fica ruimm, o Blat parece ser a Luz do tunel (ainda não é o fim dele, he he he),

Posto o que deu,

:|<
Hasa

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 20 Jul 2011 17:46
por HASA
:-O
Olá Rochinha, eu tentei no GOOGLE conseguir algum material para estudo da BLAT.DLL mas... não fui muito feliz, tem algum pequeno exemplo em xHarbour, o seu exemplo parece estar em FIVEWin e eu Uso Minigui ai para traduzir de uma para outra me perco (e não é pouco não me perco mesmo :D ), valeu
:xau
Hasa

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 20 Jul 2011 18:02
por frazato
Boa tarde! ate um tempo atras usada atraves do xharbour, mais nao sei porque não funciona mais ai como tinha uma certa urgencia e nao posso mudar o meu xharbour (99.70) estou usando via Blat.

Tenho um rotina no servidor que fica enviando os Xml/PDF gerado pelo ACbrNfeMonitor, que por sua vez tambem tem o recurso de enviar o email mais nao consegui funcionar ainda.. rs

Este e o arquivo com os dados para o BLAT.

Código: Selecionar todos

-body "08892-SADIA S.A. (39)"
-f usuario@bol.com.br                                                         
-to destino1@qq.com.br,destino2@qqq.com.br
-attach F:\JAF_NFE\35110706206061000196550000000000801137733672-nfe.xml
-attach F:\JAF_NFE\35110706206061000196550000000000801137733672.pdf
-subject "SISTEMA JAF ENVIO XML E PDF"
-debug 
-log erro.txt
-server smtps.bol.com.br                                                                
-u usuario@bol.com.br                                                         
-pw suaSenha                                                          
-mailfrom usuario@bol.com.br        

Este e o arquivo em lote(.bat ) que executo.

Código: Selecionar todos

Blat -of email.txt
e bem simples mais funciona bem.


Frazato

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 21 Jul 2011 09:13
por HASA
:))
Bom dia, obriado Frazato, como eu ainda tenho um tempinho vou tentar atravez da DLL, mas... esse fica na manga, valeuuu
:)Pos

Automatizar um envio de relatorio via email [EDITADO]

Enviado: 21 Jul 2011 11:53
por rochinha
Amiguinhos,

Este exemplo é para envio usando BLAT.EXE:

Código: Selecionar todos

function blat( cbody ,;
               cserver ,;
               cto ,;
               cf ,;
               csubject ,;
               cu ,;
               cpw ,;
               cattach, lHtml )
     /* BLAT.EXE  blat.txt
      *           -server mail.fabricapet.com.br
      *           -to irochinha@itelefonica.com.br
      *           -f contato@empresa.com.br
      *           -subject "**** confirmacao de pedido ****"
      *           -u usuario@empresa.com.br
      *           -pw pass123
      *           -log "email.log"
      *           -debug
      *           -attach "EC030017.RTF"
      */
     lHtml := .t.
     BlatCMD := [ blat.txt] + ;
                [ -to ]       + alltrim(cto) + ;
                [ -server ]   + alltrim(cserver) + ;
                [ -mailfrom ] + alltrim(CL_Email) + ;
                [ -subject "] + alltrim(csubject) + ["] + ;
                [ -r ]        + ;
                [ -replyto ] + alltrim(CL_Email) + ;
                [ -returnpath ] + alltrim(CL_Email) + ;
                [ -u ]        + alltrim(lower(cu)) + ;
                [ -pw ]       + alltrim(lower(cpw)) + ;
                [ -log "email.log" -debug ] + ;
                iif( lHtml, [ -html ], [] )
     if empty( cAttach )
     else
        if ValType( cAttach ) == "A"
           For nEle := 1 To Len( cAttach )
               BlatCMD := BlatCMD + [ -attach "] + alltrim(cAttach[ nEle ]) + ["]
           Next
        else
           BlatCMD := BlatCMD + [ -attach "] + alltrim(cAttach) + ["]
        endif
     endif
     if lHtml
        cBody := FormHtml( cSubject, cBody )
     endif
     rMemoWrit( "blat.txt", cbody + "Enviado via BLAT.EXE" )
     rMemoWrit( "blat.bat", BlatCMD )
     fErase( "email.log" )
     //
     cMacro := "BLAT.EXE " + BlatCMD
     rMemoWrit( "blat.bat", cMacro )
     WinExec( cMacro, 0 )
     //
     SysWait(2)
     if file( "email.log" )
        BlatLOG := memoread( "email.log" )
        if "ERROR" $ Upper(BlatLOG)
           MemoEdit( BlatLOG )
           return .f.
        endif
        if "535" $ Upper(BlatLOG)
           ? "Erro: Authentication Failed" + CRLF + CRLF + "Senha/Login de autenticacao com erro." 
           return .f.
        endif
     endif
     RETURN .T.

Function rMemoWrit( _aquivo_, _conteudo_ )
    nHandle := fCreate( _aquivo_ )
    fWrite( nHandle, _conteudo_, LEN( _conteudo_ ) )
    fClose( nHandle )
    RETURN .T.

Function WinExec( oque, num )
    __Run( oque )
    RETURN .T.

Function FormHtml( cSubject, cBody )
   Local cOpen
   cOpen  := '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">' + CRLF 
   cClose := CRLF + 'Nossa empresa envia email somente para pessoas e empresas cadastradas em nosso sistema.' + CRLF + ;
                          'Caso tenha duvidas favor entrar em contato com nossa central de atendimento ao cliente.'
   cHTML := ;
      '<html>'  + CRLF + ;
      '<head>'  + CRLF + ;
      '   <meta http-equiv="Content-Type"' + CRLF + ;
      '         content="text/html; charset=iso-8859-1">' + CRLF + ;
      '</head>' + CRLF + ;
      '<body>'  + CRLF + ;
      '<pre>'   + CRLF + ;
       cBody    + CRLF + ;
      '</pre>'  + CRLF + ;
      '</body>' + CRLF + ;
      '</html>'
   Return cOpen + cHTML + cClose