Página 1 de 1

HB_SendMail

Enviado: 20 Set 2016 16:12
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.

HB_SendMail

Enviado: 21 Set 2016 08:59
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 253 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

HB_SendMail

Enviado: 21 Set 2016 13:12
por NiltonGM
Valeu amigão, vou analisar e adapta-la para meu sistema e testar, aviso aqui assim que conseguir.

Obrigado e até mais...

HB_SendMail

Enviado: 21 Set 2016 13:38
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

HB_SendMail

Enviado: 21 Set 2016 15:00
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()    

HB_SendMail

Enviado: 21 Set 2016 16:46
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 )

HB_SendMail

Enviado: 21 Set 2016 17:24
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

HB_SendMail

Enviado: 22 Set 2016 20:50
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?

HB_SendMail

Enviado: 22 Set 2016 21:17
por JoséQuintas
hb_cwd()

HB_SendMail

Enviado: 23 Set 2016 11:09
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....

HB_SendMail

Enviado: 23 Set 2016 11:41
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.

HB_SendMail

Enviado: 23 Set 2016 11:46
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.

HB_SendMail

Enviado: 23 Set 2016 14:29
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

HB_SendMail

Enviado: 23 Set 2016 15:25
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