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 := '<p>Olá.</p>'
cCorpo += '<p></p>'
cCorpo += '<p>Esse é um <strong>e-Mail de teste</strong> gerado pelo <font color="red">ERP Protheus</font>.</p>'
cCorpo += '<p></p>'
cCorpo += '<p>Data <em>' + dToC(Date()) + '</em> às <em>' +Time() + '</em>.</p>'
//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.