HB_SendMail

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

Moderador: Moderadores

Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Amigos,

Uso algum tempo a função hb_SendMail sem a linha:

Código: Selecionar todos

/*
REQUEST __HBEXTERN__HBSSL__
*/
porque não compila, dá o erro de referencia inválida para "__HBEXTERN__HBSSL__", porem agora preciso que envie e-mail de uma conta gmail, já habilitei pop, imap e aplicativos menos seguros no google gmail, usando o exemplo em "C:\hmg.3.4.3\HARBOUR\contrib\hbtip\tests" mas não consigo enviar por conta gmail por causa desse erro e se eu comentar essa linha acima, aí compila mas a função tip_SSL() sempre retorna .F.
Na pasta do aplicativo estão:
hbssl.ch
hbssl.hbc
libeay32.dll
libssl32.dll
ssleay32.dll

Coloquei uma conta provisória em meu cliente da Locaweb para enviar e-mail, mas a Locaweb bloqueia quase todos e-mails pq o IP Externo do cliente está no black list por causa de clientes que clicaram por engando dizendo que era SPAM os email dos envios de CTE's!
Por isso precisava usar a conta deles do GMAIL.

Utilizo HMG 3.4.3 Harbour 3.2.0dev compilado UNICODE ver 1.1
Segue anexo o aplicativo de testes que estou usando.
Anexos
SendMail.rar
(610.25 KiB) Baixado 198 vezes
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

HB_SendMail

Mensagem por rubens »

Bom dia Nilton...

Eu tentei usar o SendMail e não consegui...

Daí garimpei muito aqui no fórum e juntei em uma rotina usando CDO.
Se quiser dar uma olhada tá aí...
email.prg
(11.38 KiB) Baixado 252 vezes
Eu mando normalmente pelo gmail, e quando o cliente não tem crio uma conta no gmail para ele só para o envio de e-mail.

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Valeu amigão, vou analisar e adapta-la para meu sistema e testar, aviso aqui assim que conseguir.

Obrigado e até mais...
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

HB_SendMail

Mensagem por janio »

Com CDO funciona sem medo, pode ir confiante! hehehe

Menos...

Para hotmail com a porta 587 (que exige conexao SSL).
Para hotmail com porta 25, CDO tbm funciona. Todavia, depende do seu provedor de internet ter ou nao bloqueado esta porta. Se ainda estiver liberada, vai tranquilo!

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

HB_SendMail

Mensagem por asimoes »

Minha função de envio de email:
As Dll´s da SSL estão no zip

PRIVATE AzulHTML := '<span style="color:#0000FF">'
PRIVATE VermelhoHTML := '<span style="color:#FF0000">'
PRIVATE QuebraHTML := "<br>"

Código: Selecionar todos

oEmail:=ClEmailSSL():New()
oEmail:cUser     :="usuario_email"
oEmail:cPassword :="senha_email"
oEmail:cFrom     :="remetente@gmail.com"
oEmail:cAlias    :="Sistema AsaPrev <"+oEmail:cFrom+"> "
oEmail:aTo       :={"Alexandre Simões <asimoesluz@gmail.com>"}
oEmail:aCC       :={"Alexandre Simões <a_1964_luz@yahoo.com.br>"}
oEmail:cHost     :="smtp.gmail.com"
oEmail:cAssunto  :="Log de atualização de sistema em: "+hb_DtoC(Date(), "DD/MM/YYYY")+" "+cTime
oEmail:cMensagem :=AzulHTML +"Log de confirmação de atualização de arquivo(s) : " + QuebraHTML + QuebraHTML +;
                   cArq + QuebraHTML +;
                   "Em: " + hb_DtoC(Date(), "DD/MM/YYYY") + " " + cTime + " " + QuebraHTML +;
                   "Estação: "+hb_GetEnv("computername")+QuebraHTML +;
                   VermelhoHTML+"Feito pelo Monitor AsaPrev Versão 3. SSL + FTP" + QuebraHTML
oEmail:cUrlImagem:='https://lh3.googleusercontent.com/-1STLYuQgAlo/V0L-vdc8gRI/AAAAAAAABOI/wIlYAdl-Z8wMpNNPOmZ7G_z-enVMiv2XQCCo/s100/icon-saas-update-300x216.png'
oEmail:nPorta    :=465
oEmail:lSSL      :=(oEmail:nPorta == 465)
oEmail:Send()    
Anexos
EMAIL.zip
Fonte classe email
(1.28 MiB) Baixado 167 vezes
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Rubens,

Adaptei e funcionou belezinha no teste que estou mostrando abaixo, agora é só adaptar para o meu sistema mesmo!
Simão, como eu disse acima lá no início, no meu HMG não compila com __HBEXTERN__HBSSL__, dá pau!
Agradeço também aos demais, tem várias formas de enviar mas essa funcionou blzinha...
Abraços...

Código: Selecionar todos

#include <hmg.ch>

Function Main()

        Load Window Main
        Main.Center
        Main.Activate

Return

Procedure main_button_ipexterno_action()
          //Main.Label_IPExterno.Value := Pega_IP_Externo()
Return

Procedure main_button_1_action()
          Local cServer   := Main.Text_server.Value
          Local cUser     := Main.Text_from.Value
          Local cFrom     := cUser                     // Normalmente o From é o mesmo que o User
          Local cPassword := Main.Text_psw.Value
          Local cTo       := Main.Text_to.Value
          Local cCC       := cBCC := ''
          Local cSubject  := Main.Text_subject.Value
          Local lAuth     := Main.Check_Auth.Value
          Local lSSL      := Main.Check_SSL.Value
          Local nPort     := Main.Text_port.Value
          Local cBody     := AllTrim(Main.Edit_body.Value)

          if My_SendMail(cServer, nPort, lAuth, lSSL, cUser, cPassword, cFrom, cTo, cCC, cBCC, cSubject, cBody, .T. )
             //MsgInfo('E-Mail enviado com sucesso.', 'Sucesso!')
          else
             //MsgExclamation('E-Mail NÃO FOI enviado.', 'Erro!')
          end

Return
e a função usada foi esta:

Código: Selecionar todos

/*

 *****************************************************************************************
 * Função personalizada para  envio  de  e-Mail  usando
 * Componente CDOsys da Microsoft em servidores Windows
 *       2016/09/21  -  by Nilton G. Medeiros
 *
 * Nota: ENVIO DA MENSAGEM NO FORMATO TEXTO (e-mail simples)
 *       PARA ENVIO DA MENSAGEM NO FORMATO HTML, ALTERE O TextBody PARA HtmlBody
 *       e procure informações sobre o componente CDOsys Microsoft e TAG's HTMLs
 *
 * fonte: http://search.msdn.microsoft.com/search/default.aspx?siteId=0&tab=0&query=cdosys
 *
 *****************************************************************************************

 */

#include <hmg.ch>
#include <hbcompat.ch>

Function  My_SendMail( cSmtpServer, nSmtpServerPort, lSmtpAuthenticate, lSmtpUseSSL, cSendUserName, cSendPassword, cFrom, cTo, cCC, cBCC, cSubject, cTextBody, lAlerta )
          Local lRet := .F.
          Local oCfg := win_OleCreateObject( "CDO.Configuration" )
          Local oErroMail, oMsg

          DEFAULT lAlerta := .F.

          //--> CONFIGURAÇOES DE E-MAIL

          TRY

             WITH OBJECT oCfg:Fields
               :Item("http://schemas.microsoft.com/cdo/configuration/smtpserver"):Value   	   := cSmtpServer
               :Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport"):Value   := nSmtpServerPort
               :Item("http://schemas.microsoft.com/cdo/configuration/sendusing"):Value        := 2      // sendusing : cdoSendUsingPort, valor 2, para enviar a mensagem usando a rede
               :Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"):Value := lSmtpAuthenticate
               :Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl"):Value       := lSmtpUseSSL
               :Item("http://schemas.microsoft.com/cdo/configuration/sendusername"):Value     := cSendUserName
               :Item("http://schemas.microsoft.com/cdo/configuration/sendpassword"):Value     := cSendPassword
               :Update()
             END WITH

             lRet := .T.

          CATCH oErroMail

             if (lAlerta)
                MsgExclamation({'Houve erro ao configurar o e-mail.', CRLF, CRLF  ,       ;
                                'Error:     ', Transform(oErroMail:GenCode  , nil), CRLF, ;
                                'SubC:      ', Transform(oErroMail:SubCode  , nil), CRLF, ;
                                'OSCode:    ', Transform(oErroMail:OsCode   , nil), CRLF, ;
                                'SubSystem: ', Transform(oErroMail:SubSystem, nil), CRLF, ;
                                'Mensagem:  ', oErroMail:Description}, 'Erro configurando e-mail!')
             end

          END

          //--> FIM DAS CONFIGURAÇOES.

          if ( lRet )

             // --> ENVIA E-MAIL

             TRY

               //MsgStatus("Aguarde, processando o envio do email.")

               oMsg := win_OleCreateObject( "CDO.Message" )

               WITH OBJECT oMsg
                  :Configuration := oCfg
                  :From          := cFrom
                  :To            := cTo
                  :Cc            := cCC
                  :BCC           := cBCC
                  :Subject       := cSubject

/*
                  * ------------------------------------------------------------
                  * Aqui adiciona a imagem ao corpo da mensagem qdo formato HTML
                  * ------------------------------------------------------------
                  IF !Empty(cImagem)
                   :AddRelatedBodyPart(hb_DirBase()+"img"+hb_PS()+cImagem, cImagem, 1)
                   :Fields:Item("urn:schemas:mailheader:Content-ID"):Value := "<"+cImagem+">"
                   :Fields:Item("urn:schemas:mailheader:Content-Disposition"):Value := "inline"
                   :Fields:Update()
                  ENDIF

                  :HTMLBody := cMsg // + QuebraHTML + IF(!Empty(cImagem), cImagem1, "")
                  * ------------------------------------------------------------------------------------------------
*/

                  :TEXTBody := cTextBody
/*
                  FOR X := 1 TO Len( aFiles )
                   :AddAttachment(AllTrim(aFiles[x]))
                   *DO EVENTS
                  NEXT
*/
                  :Fields("urn:schemas:mailheader:disposition-notification-to"):Value := cFrom
                  :Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"):Value := lSmtpAuthenticate
                  :Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl"):Value := lSmtpUseSSL
                  :Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver"):Value := cSmtpServer
                  :Fields:update()
                  *DO EVENTS
                  :Send()
               END WITH

               if ( lAlerta )
                  MsgInfo( 'E-mail enviado com sucesso.', 'Sucesso!')
               end

             CATCH oErroMail

               if ( lAlerta )
                 MsgExclamation( {'Não foi possível enviar a mensagem: ' + cSubject, CRLF, ;
                                  'para o email: ', cTo, '.', CRLF, ;
                                  'Erro: ', oErroMail:Description}, 'Erro!' )
               end

               lRet := .F.

             END

          end

Return ( lRet )
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

HB_SendMail

Mensagem por JoséQuintas »

Pra usar SSL depende de gerar o Harbour com SSL, que depende de instalar algo mais pra geração, e também distribuir nos clientes DLL.
Achei mais prático usar uma conta de email grátis do terra.... rs
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
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Pessoal,

Só para constar:
Quando uso anexo ao email dá pau! Erro: O protocolo especificado desconhecido (0x800C000D)
apanhei pra descobrir que era por causa da propriedade :AddAttachment, já testei de tudo que é maneira, quando comento essa linha, aí o email vai. Fuçando no google muita gente teve esse problema e sem solução, um camarada conseguiu resolver quando colocou o path correto.

Já testei das seguintes formas:

Código: Selecionar todos

   :AddAttachment('anexos\35160813361914000120550010000125591205200067-procNfe.xml')    // Achei que era o Path 'anexos\' essa linha da erro
            :AddAttachment('35160813361914000120550010000125591205200067-procNfe.xml')               // Tirei o Path e movi o arquivo xml para raiz do programa, também dá o mesmo erro
            :AddAttachment('build.log')                                                                                                   // Tentei com um arquivo mais simples, o mesmo erro.
            :AddAttachment('F:\harbour\testes\CDO_eMail\build.log')                                                       // DESCOBRI, AQUI FUNCIONA COM O PATH ABSOLUTO!! 
E agora, como faço para pegar o Path absoluto? Em cada cliente o aplicativo roda em pastas diferentes, tem alguma função tipo GetPath_Da_Aplicacao() absoluto?
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

HB_SendMail

Mensagem por JoséQuintas »

hb_cwd()
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
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Rubens ou quem mais usa conta no gmail, criei uma nova conta e ao enviar email acusou que excedi o limite de emails, o sistema não chegou a enviar nem uns 50 contando com CC e BCC...
A resposta do smtp foi:
"O código de erro de transporte foi 0x800ccc69. A resposta do servidor foi 550 5.4.5 Daily user sending quota exceeded. a192sm3756951qkc.26 - gsmtp"
O que será realmente q está acontecendo? Olhei no Google e o limite diário para envio pelo gmail é de 3000 (tres mil) emails!
José Quintas, essa conta no Terra gratuita, vc cria para cada cliente e envia as NFe por elas? Não tem problemas com bloqueio? Eu era feliz usando a conta da Locaweb até q uns 3 meses atras começaram usar politica de segurança contra SPAM e força manualmente liberar cada email....
Nilton Medeiros
nilton@sistrom.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

HB_SendMail

Mensagem por JoséQuintas »

No meu provedor o limite são uns 120 e-mails por hora, então limito a um email por minuto, por precaução.

120 por hora * 24 horas = 2.880

É quase o mesmo limite do gmail.

Mas não pode enviar muitos de uma vez, ou tudo isso em uma hora.

Provavelmente o gmail seja igual ou parecido.
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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

HB_SendMail

Mensagem por Kapiaba »

bom dia, conforme informações dos usuários, gmail tem limite de envio. O cliente tem que entrar em contato com o provedor gmail e fechar um contrato mensal para x qtde emails por mês ou ano se não me falha a memória, pois, não é grátis.
GMAIL.png
Abs.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

HB_SendMail

Mensagem por rubens »

Nilton...

Meus clientes não costumam mandar este tanto de e-mail !!!
Quando acontecer vou estar em apuros também !!! kkkkk
Daí creio que vocês também já terão encontrado a solução e compartilhado .... Ok?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
NiltonGM
Usuário Nível 3
Usuário Nível 3
Mensagens: 397
Registrado em: 05 Jun 2014 23:47
Localização: Caieiras/SP

HB_SendMail

Mensagem por NiltonGM »

Descobri, o limite diário é de 100 e-mails no gmail, e justamente hoje acumulou envio de CTE e XML de uma semana, deu mais de 100 e-mails, isso só ocorre uma vez por mês no fechamento das faturas e qdo o infeliz do usuário deixou acumular as emissões pra fazer tudo num só dia!
Resolvi de uma maneira palhativa, criei duas contas no gmail, ao enviar e-mail alterno entre uma conta e outra...

Código: Selecionar todos

              if (lAlternaServer)
                 cFrom  := 'ap.tms.cloud.cte@gmail.com'
                 cLogin := 'ap.tms.cloud.cte@gmail.com'
              else
                 cFrom  := 'ap1.tms.cloud.cte@gmail.com'
                 cLogin := 'ap1.tms.cloud.cte@gmail.com'
              end

              lAlternaServer := !lAlternaServer
Nilton Medeiros
nilton@sistrom.com.br
Responder