Montando e disparando emails com TMailMessage e TMailManager – Maratona AdvPL e TL++ 497

Nesse vídeo demonstraremos a utilização das classes TMailMessage e TMailManage, que servem para realizar a conexão com um servidor de email e assim disparar mensagens de email.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe497
Realiza um disparo de e-Mail manualmente
@type Function
@author Atilio
@since 04/04/2023
@see https://tdn.totvs.com/display/tec/Classe+TMailMessage e https://tdn.totvs.com/display/tec/Classe+TMailManager
@obs 

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe497()
    Local aArea      := FWGetArea()
    Local cPara      := "daniel@atiliosistemas.com; contato@atiliosistemas.com"
    Local cAssunto   := ""
    Local cCorpo     := ""
    Local aAnexos    := {}
    Local lExibeHelp := .T.

    //Monta o corpo do e-Mail
    cCorpo := '

Olá.

' cCorpo += '

' cCorpo += '

Esse é um e-Mail de teste gerado pelo ERP Protheus.

' cCorpo += '

' cCorpo += '

Data ' + dToC(Date()) + ' às ' +Time() + '.

' //Faz o disparo via função cusotmizada cAssunto := "Envio de Teste (TMailMessage e TMailManager)" lEnvio := fEnvia(cPara, cAssunto, cCorpo, aAnexos, lExibeHelp, .T.) If lEnvio FWAlertSuccess("Sucesso no disparo do e-Mail", "Teste TMailMessage e TMailManager") Else FWAlertError("Falha no disparo do e-Mail", "Teste TMailMessage e TMailManager") EndIf FWRestArea(aArea) Return Static Function fEnvia(cPara, cAssunto, cCorpo, aAnexos, lMostraLog, lUsaTLS) Local aArea := FWGetArea() Local nAtual := 0 Local lRet := .T. Local oMsg := Nil Local oSrv := Nil Local nRet := 0 Local cFrom := Alltrim(GetMV("MV_RELACNT")) Local cUser := SubStr(cFrom, 1, At('@', cFrom)-1) Local cPass := Alltrim(GetMV("MV_RELPSW")) Local cSrvFull := Alltrim(GetMV("MV_RELSERV")) Local cServer := Iif(':' $ cSrvFull, SubStr(cSrvFull, 1, At(':', cSrvFull)-1), cSrvFull) Local nPort := Iif(':' $ cSrvFull, Val(SubStr(cSrvFull, At(':', cSrvFull)+1, Len(cSrvFull))), 587) Local nTimeOut := GetMV("MV_RELTIME") Local cLog := "" Default cPara := "" Default cAssunto := "" Default cCorpo := "" Default aAnexos := {} Default lMostraLog := .F. Default lUsaTLS := .F. //Se tiver em branco o destinatário, o assunto ou o corpo do email If Empty(cPara) .Or. Empty(cAssunto) .Or. Empty(cCorpo) cLog += "001 - Destinatario, Assunto ou Corpo do e-Mail vazio(s)!" + CRLF lRet := .F. EndIf If lRet //Cria a nova mensagem oMsg := TMailMessage():New() oMsg:Clear() //Define os atributos da mensagem oMsg:cFrom := cFrom oMsg:cTo := cPara oMsg:cSubject := cAssunto oMsg:cBody := cCorpo //Percorre os anexos For nAtual := 1 To Len(aAnexos) //Se o arquivo existir If File(aAnexos[nAtual]) //Anexa o arquivo na mensagem de e-Mail nRet := oMsg:AttachFile(aAnexos[nAtual]) If nRet < 0 cLog += "002 - Nao foi possivel anexar o arquivo '"+aAnexos[nAtual]+"'!" + CRLF EndIf //Senao, acrescenta no log Else cLog += "003 - Arquivo '"+aAnexos[nAtual]+"' nao encontrado!" + CRLF EndIf Next //Cria servidor para disparo do e-Mail oSrv := tMailManager():New() //Define se irá utilizar o TLS If lUsaTLS oSrv:SetUseTLS(.T.) EndIf //Inicializa conexão nRet := oSrv:Init("", cServer, cUser, cPass, 0, nPort) If nRet != 0 cLog += "004 - Nao foi possivel inicializar o servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF lRet := .F. EndIf If lRet //Define o time out nRet := oSrv:SetSMTPTimeout(nTimeOut) If nRet != 0 cLog += "005 - Nao foi possivel definir o TimeOut '"+cValToChar(nTimeOut)+"'" + CRLF EndIf //Conecta no servidor nRet := oSrv:SMTPConnect() If nRet <> 0 cLog += "006 - Nao foi possivel conectar no servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF lRet := .F. EndIf If lRet //Realiza a autenticação do usuário e senha nRet := oSrv:SmtpAuth(cFrom, cPass) If nRet <> 0 cLog += "007 - Nao foi possivel autenticar no servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF lRet := .F. EndIf If lRet //Envia a mensagem nRet := oMsg:Send(oSrv) If nRet <> 0 cLog += "008 - Nao foi possivel enviar a mensagem: " + oSrv:GetErrorString(nRet) + CRLF lRet := .F. EndIf EndIf //Disconecta do servidor nRet := oSrv:SMTPDisconnect() If nRet <> 0 cLog += "009 - Nao foi possivel disconectar do servidor SMTP: " + oSrv:GetErrorString(nRet) + CRLF EndIf EndIf EndIf EndIf //Se tiver log de avisos/erros If !Empty(cLog) cLog := "zEnvMail - "+dToC(Date())+ " " + Time() + CRLF + ; "Funcao - " + FunName() + CRLF + CRLF +; "Existem mensagens de aviso: "+ CRLF +; cLog //Se for para mostrar o log visualmente e for processo com interface com o usuário, mostra uma mensagem na tela If lMostraLog .And. ! IsBlind() Aviso("Log", cLog, {"Ok"}, 2) EndIf EndIf FWRestArea(aArea) 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.

Deixe uma resposta

Terminal de Informação