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:
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í...
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.
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