Usando Microsoft CDO pra emails

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

Ainda não me acertei com ele.
Andam acontecendo algumas falhas sem sentido.
Faz tempo tenho ele no aplicativo, mas só agora tentando colocar em uso.

Minha classe é antiga, do tempo que BLAT.EXE ou BLAT.DLL ainda eram opção.
Tem a opção de usar harbour, blat ou cdo.

Código: Selecionar todos

#define CDO_SEND_USING_PICKUP           1 // email client program
#define CDO_SEND_USING_PORT             2 // direct to internet
#define CDO_ANONYMOUS                   0
#define CDO_BASIC                       1 // clear text
#define CDO_NTLM                        2
#define CDO_DSN_DEFAULT                 0 // none
#define CDO_DSN_NEVER                   1 // none
#define CDO_DSN_FAILURE                 2 // failure
#define CDO_DSN_SUCCESS                 4 // success
#define CDO_DSN_DELAY                   8 // delay
#define CDO_DSN_SUCCESS_FAIL_OR_DELAY   14 // none + success + failure + delay

METHOD SendUsingCDO() CLASS ze_SendMailClass

   LOCAL oMessage, oConfiguration, oElement, lOk, cText, e

   oConfiguration := win_OleCreateObject( "CDO.Configuration" )
   WITH OBJECT oConfiguration
      :Fields( "http://schemas.microsoft.com/cdo/configuration/sendusing" ):Value             := CDO_SEND_USING_PORT
      :Fields( "http://schemas.microsoft.com/cdo/configuration/smtpserver" ):Value            := ::cServer
      :Fields( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value      := CDO_BASIC
      :Fields( "http://schemas.microsoft.com/cdo/configuration/smtpserverport" ):Value        := ::nPort
      :Fields( "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout" ):Value := ::nTimeOut / 1000
      :Fields( "http://schemas.microsoft.com/cdo/configuration/smtpusessl" ):Value            := ::lWithSSL
      :Fields( "http://schemas.microsoft.com/cdo/configuration/sendusername" ):Value          := ::cFrom
      :Fields( "http://schemas.microsoft.com/cdo/configuration/sendpassword" ):Value          := ::cPassword
      //:Fields( "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate" ):Value      := .T.
      :Fields:Update()
   ENDWITH

   oMessage       := win_OleCreateObject( "CDO.Message" )
   WITH OBJECT oMessage
      :Configuration := oConfiguration
      :To            := ArrayToList( ::acTo, ";" )
      :From          := ::cFrom
      :Subject       := ::cSubject
      // 0 default no dsn commands
      // 1 no dsn commands at all
      // 2 return a dsn if fail
      // 4 return a dsn if sucess
      // 8 return a dsn if delayed
      // 14 return a dsn for all
      :DSNOptions := 0
      IF File( ::cFileBody )
         :HtmlBody := MemoRead( ::cFileBody )
      ELSE
         :HtmlBody := ::cFileBody
      ENDIF
      FOR EACH oElement IN ::acAttachment
         :AddAttachment( iif( "\" $ oElement, "", hb_cwd() ) + oElement )
      NEXT
      :Fields( "urn:schemas:mailheader:disposition-notification-to" ):Value := ::cFrom
      :Fields:Update()
      lOk := .F.
      BEGIN SEQUENCE WITH __BreakBlock()
         oMessage:Send()
         lOk := .T.
      RECOVER USING e
         IF ValType( e:Description ) == "C"
            Errorsys_WriteErrorLog( e:Description, 2 )
         ENDIF
      ENDSEQUENCE
      IF ! lOk
         cText := "Error on email " + ::cFrom + hb_Eol() + ::cSubject + hb_Eol() + hb_ValToExp( ::acTo ) + hb_Eol()
         IF ! Empty( cText )
            Errorsys_WriteErrorLog( cText )
         ENDIF
         lOk := .T.
      ENDIF
   ENDWITH

   RETURN lOk
Como exemplo: tem email com zip que não vai mas com harbour vai, ao mesmo tempo que com outro email vai.
A última linha de configuração comentada acrescentei depois, ainda na dúvida sobre qual opção usar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

IMAP:
Servidor: imap.terra.com.br
Porta: 993
Criptografia: SSL/TLS
POP:
Servidor: pop.terra.com.br
Porta: 995
Criptografia:
SSL/TLS
SMTP:
Servidor: smtp.terra.com.br
Porta: 587
Criptografia: STARTTLS
Esse acima por exemplo.
O envio não precisa SSL, mas se precisar autenticar sim.
Também só tem uma porta a ser definida, nesse caso seriam duas.
Confuso isso.
Talvez no endereço? imap.terra.com.br:993, pop.terra.com.br:995, smtp.terra.com.br:587
Mas aí depende do que a rotina de email vai acrescentar nisso, e não temos acesso pra modificar.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

Sei lá....
Por enquanto fica assim:

Código: Selecionar todos

METHOD Send() CLASS ze_SendMailClass

   LOCAL oElement, lOk := .F.

   IF ::nHowToSend == SEND_USING_HARBOUR .AND. ! ::lWithSSL
      lOk := ::SendUsingHarbour()
   ELSEIF ::nHowToSend == SEND_USING_BLAT
      lOk := ::SendUsingBlatEXE()
   ELSEIF ::nHowToSend == SEND_USING_CDO .OR. ::lWithSSL
      lOk := ::SendUsingCDO()
   ENDIF
   FOR EACH oElement IN ::acTempFile
      fErase( oElement )
   NEXT

   RETURN lOk
Com SSL só pelo CDO.
Sem SSL só pelo Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Usando Microsoft CDO pra emails

Mensagem por ANDRIL »

JoséQuintas escreveu:Com SSL só pelo CDO.
Sem SSL só pelo Harbour.
Passei por esse dilema a pouco tempo atrás. Ainda deve levar em consideração que o CDO em alguns PCs não funciona, simplesmente não envia.
O que reparei, se voce for usar a porta 587 no seu provedor, o aplicativo ideal seria o Blat, porem, alguns provedores não aceitam mais devido o TLS, para funcionar tem que criar um tunelamento como o uso do aplicativo Stunnel, isso atrapalha demais por que precisa configurar em cada cliente.

Se voce usar a porta 465 o ideal seria usar o CDO com SSL ativado, porem, cai no que disse acima, alguns PCs não funcionam, talvez por falta de alguma configuração no Windows (notei mais no Win7 essa ocorrência).

Já postei em alguns posts como resolvi o problema de envio de email usando PHP, até agora, tudo certo!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

ANDRIL escreveu:Passei por esse dilema a pouco tempo atrás. Ainda deve levar em consideração que o CDO em alguns PCs não funciona, simplesmente não envia.
O que reparei, se voce for usar a porta 587 no seu provedor, o aplicativo ideal seria o Blat, porem, alguns provedores não aceitam mais devido o TLS, para funcionar tem que criar um tunelamento como o uso do aplicativo Stunnel, isso atrapalha demais por que precisa configurar em cada cliente.

Se voce usar a porta 465 o ideal seria usar o CDO com SSL ativado, porem, cai no que disse acima, alguns PCs não funcionam, talvez por falta de alguma configuração no Windows (notei mais no Win7 essa ocorrência).
Como eu já disse por aqui, tudo da Microsoft passou a ser NET Framework, todo resto está ficando sem atualização e sem documentação, até sumir do mapa. CDO e CDONT estão nisso.
Talvez no W7 seja o outlook atrapalhando, lembro de ter visto algo sobre isso nestes dias.

Pra porta 587 o harbour funciona normalmente, não precisa alternativa.

Pra SSL entra gerar harbour de outra forma, com possível uso de DLLs.

Em linux talvez mais fácil, geralmente só configurar servidor e enviar email até pelo prompt.

Código: Selecionar todos

FUNCTION EnviaEmail( cDestino, cAssunto, cTexto, aAnexos )

   LOCAL cCmd, nCont

   hb_Default( @cDestino, "xxxx@jxxx.com.br" )
   hb_Default( @cAssunto, "teste" )
   hb_Default( @cTexto, "corpo do email" )
   hb_Default( @aAnexos, {} )

   MemoWrit( "/temp/erros.txt", cTexto )
   IF Len( aAnexos ) == 0
      cCmd := [mail -s "xxx ] + cAssunto + [" ] + cDestino + [< /temp/erros.txt]
   ELSE
      cCmd := [mutt -s "xxx ] + cAssunto + ["]
      FOR nCont = 1 TO Len( aAnexos )
         cCmd += [ -a ] + aAnexos[ nCont ]
      NEXT
      cCmd += " -- " + cDestino + [ < /temp/erros.txt]
   ENDIF
   RUN ( cCmd )
   Inkey(3)
   fErase( "/temp/erros.txt" )

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

Só voltando nisso:

Minha rotina é a mesma desde o começo, com opção de usar BLAT, harbour ou CDO.
No começo só blat, depois só harbour, muitos anos só com harbour.
Apenas não removi as outras.

Só agora o provedor do cliente alterou pra SSL, e o harbour básico deixou de ser opção.

Com opcionais o harbour deve funcionar com SSL, mas nunca usei nada opcional.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

Achei hoje isto.

https://stackoverflow.com/questions/375 ... ail-server

sobre isto:

Código: Selecionar todos

      :Fields("http://schemas.microsoft.com/cdo/configuration/sendtls").Value                 := :lWithTLS
No harbour parece ser automático, por isso não se percebe a falta.
Ainda não testei.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

Agora achei outro, reduz a um objeto, e tem a opção de codepage.

https://stackoverflow.com/questions/274 ... ding-issue

Código: Selecionar todos

Dim ObjSendMail
Set ObjSendMail = CreateObject("CDO.Message") 

ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "myserver"
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
ObjSendMail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

ObjSendMail.Configuration.Fields.Update

ObjSendMail.To = to_email
ObjSendMail.Subject = subject
ObjSendMail.From = from_email

'ObjSendMail.TextBody = mensaje   'tipo texto
ObjSendMail.HTMLBody = mensaje   'tipo html

ObjSendMail.TextBodyPart.Charset = "utf-8"  'support symbols á ñ ¡

ObjSendMail.Send

Set ObjSendMail = Nothing
Pois é....
Tá disponível pra todo mundo, mas nem todo mundo pesquisa....
Sei lá....
Tem neguinho que adora usar AnsiToOem() ou OEMToAnsi(), fazer o que....
Até página de internet eu seto codepage.... UTF8 e outros que se lasquem....meu negócio é BRASIL.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Usando Microsoft CDO pra emails

Mensagem por JoséQuintas »

E mais um

https://www.tek-tips.com/viewthread.cfm?qid=1787016

Texto é de um jeito, html é de outro.
E o resultado que vai no email pode ser de outro, até mesmo UTF-8.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder