Página 1 de 1

Usando Microsoft CDO pra emails

Enviado: 05 Jun 2024 11:22
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.

Usando Microsoft CDO pra emails

Enviado: 05 Jun 2024 11:42
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.

Usando Microsoft CDO pra emails

Enviado: 05 Jun 2024 12:30
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.

Usando Microsoft CDO pra emails

Enviado: 06 Jun 2024 06:27
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!

Usando Microsoft CDO pra emails

Enviado: 06 Jun 2024 10:32
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

Usando Microsoft CDO pra emails

Enviado: 08 Jun 2024 16:49
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.

Usando Microsoft CDO pra emails

Enviado: 10 Jun 2024 15:46
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.

Usando Microsoft CDO pra emails

Enviado: 10 Jun 2024 16:00
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.

Usando Microsoft CDO pra emails

Enviado: 10 Jun 2024 16:20
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.