Enviar um e-Mail quando alguém fizer login no APSDU

Hoje vamos mostrar como disparar um e-Mail para alguém, quando algum usuário fizer login no APSDU.

Recentemente pessoal, o grande Thalys Juvenal (LinkedIn), desenvolveu um exemplo onde, quando algum usuário faz login no Protheus, é disparado uma mensagem avisando os responsáveis.

A função funciona, chamando o ponto de entrada SDULogin, e logo em seguida enviando o e-Mail, confira o fonte abaixo:

#INCLUDE 'protheus.ch'
#INCLUDE 'Ap5Mail.ch'

/*/{Protheus.doc} User Function SduLogin
Enviar email de aviso que acessou o apsdu
@author Thalys Augusto
@since 15/07/2020
@version 1.0
@type function
/*/

User Function SduLogin()
	Local lRet := .T.
	Local cAssunto := 'Login no APSDU'
	Local cDestinatario := ''
	Local cMensagem := ''
	Local cUser := ParamIXB
	
	//Monta a mensagem do e-Mail
	cMensagem	:=	"Usuário Protheus <b>" +Alltrim(cUser)+ "</b> efetuou login no APSDU através do usuário de rede "
	cMensagem	+=	"<b>" + Alltrim(LogUserName()) + "</b> em " + DtoC( Date()) + " às " + Time() 
	cMensagem	+=	" na máquina <b>" + Lower(ComputerName()) + Upper(" (IP "+ GetClientIP()+" / PC: " +GetComputerName()+")</b>")

	//Dispara o e-Mail para o destinatario configurado
	cDestinatario := 'email@teste.com'
	fSendMail(cDestinatario, cAssunto, cMensagem)
Return .T.

/*/{Protheus.doc} Static Function fSendMail
Função que realiza o envio do e-mail
@author Thalys Augusto
@since 15/07/2020
@version 1.0
@type function
/*/

Static Function fSendMail(cPara , cSubject, cMsg)
	Local oMail , oMessage
	Local lRet := .T.
	Local cSMTPServer := 'smtp.teste.com'
	Local cSMTPUser := 'conta_email@teste.com'
	Local cSMTPPass := 'senha@123'
	Local cMailFrom := 'conta_email@teste.com'
	Local nPort := 587
	Local lUseAuth := .T.
	Local cCopia := 'email_CC@teste.com'
	Local cMailError := ""
	Local nErro, nErroAuth
	
	//Faz a conexão com o eMail
	MsgRun('Conectando com SMTP ', ' ', {||oMail := TMailManager():New()})
	oMail:setUseSSL( .T. ) // Usa SSL na conexao, contas do GMAIL usam SSL.
	oMail:SetUseTLS( .T. )
	MsgRun('Inicializando SMTP', '', {|| oMail:Init( '', cSMTPServer , cSMTPUser, cSMTPPass, 0, nPort )})
	MsgRun('Setando Time-Out', '', {||oMail:SetSmtpTimeOut( 30 )})
	MsgRun('Conectando com servidor...', '', {||nErro := oMail:SmtpConnect()})
	MsgRun('Status de Retorno = ' +  Str(nErro, 6), '', {||})
	
	//Se usa autenticacao
	If lUseAuth
		nErroAuth := 0
		MsgRun('Autenticando Usuario [' + cSMTPUser + '] senha ********* ', '', {||nErroAuth := oMail:SmtpAuth(cSMTPUser , cSMTPPass)})
		MsgRun('Status de Retorno = ' + str(nErroAuth, 6), '', {||})
		
		//Se houve erro, busca ele
		If nErroAuth <> 0
			cMailError := oMail:GetErrorString(nErroAuth)
			cMailError := Iif(Empty(cMailError), '***Unknown Error***', cMailError)
			//ConOut('Erro de Autenticacao ' + str(nErroAuth, 4) + ' (' + cMAilError + ')')
			lRet := .F.
		EndIf
	EndIf
	
	//Se houve algum outro erro
	If nErro <> 0
		// Recupera erro
		cMailError := oMail:GetErrorString(nErro)
		cMailError := Iif(Empty(cMailError), '***Unknown Error***', cMailError)
		//ConOut(cMAilError)
		//ConOut('Erro de Conexão SMTP ' + str(nErro, 4))
		//ConOut('Desconectando do SMTP')
		oMail:SMTPDisconnect()
		lRet := .F.
	EndIf
	
	//Se tudo estiver ok para o envio
	If lRet
		//ConOut('Compondo mensagem em memória')
		oMessage := TMailMessage():New()
		oMessage:Clear()
		oMessage:cFrom := cMailFrom
		oMessage:cTo := cPara
		If !Empty(cCopia)
			oMessage:cCc := cCopia
		EndIf
		oMessage:cSubject := cSubject
		oMessage:cBody := cMsg
		
		//Tenta realizar o disparo
		MsgRun('Enviando Mensagem para [' + cPara + '] ', '', {|| nErro := oMessage:Send( oMail )})
		If nErro <> 0
			cMailError := oMail:GetErrorString(nErro)
			cMailError := Iif(Empty(cMailError), '***Unknown Error***', cMailError)
			//ConOut('Erro de Envio SMTP ' + str(nErro, 4) + ' (' + cMailError + ')')
			lRet := .F.
		EndIf
		
		//ConOut('Desconectando do SMTP')
		oMail:SMTPDisconnect()
	EndIf
	
Return lRet

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Claudio disse:

    Show de Bola, já apliquei na minha base.

Deixe uma resposta para ClaudioCancelar resposta

Terminal de Informação