No vídeo de hoje, vamos demonstrar em como gravar um log de disparo de eMail e depois reenviar.
A dúvida de hoje, nos perguntaram, se seria possível gravar em uma tabela um log dos disparos de eMails enviado no sistema, e se houver problema ter a opção de reenviar.
Pensando nisso, montamos um exemplo, onde vamos mostrar em como gravar em uma tabela customizada, e através de um browse em MVC, ter a opção de reenviar.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Totvs.ch"
#Include "FWMVCDef.ch"
//Variveis Estaticas
Static cTitulo := "Logs de eMail"
Static cAliasMVC := "Z38"
/*/{Protheus.doc} User Function zVid0189
Logs de eMail
@author Atilio
@since 11/09/2024
@version 1.0
@type function
@obs No GitHub (https://github.com/dan-atilio/AdvPL) tem um arquivo chamado zVid0189_dicionario.rar nele vai ter
a SX2, a SX3 e SIX caso você queira importar. Só se atente aos seguintes campos quando for importar:
X2_ARQUIVO
X2_TAMFIL
X2_TAMUN
X2_TAMEMP
X3_TAMANHO do campo Z38_FILIAL
Além disso, se a tabela Z38 já existir, troque a numeração para uma disponível na sua base
/*/
User Function zVid0189()
Local aArea := FWGetArea()
Local oBrowse
Private aRotina := {}
//Definicao do menu
aRotina := MenuDef()
//Instanciando o browse
oBrowse := FWMBrowse():New()
oBrowse:SetAlias(cAliasMVC)
oBrowse:SetDescription(cTitulo)
oBrowse:DisableDetails()
//Adicionando as Legendas
oBrowse:AddLegend( "Z38->Z38_RESULT == '1'", "BLUE", "Enviado com Sucesso" )
oBrowse:AddLegend( "Z38->Z38_RESULT == '2'", "RED", "Falha no Envio" )
//Ativa a Browse
oBrowse:Activate()
FWRestArea(aArea)
Return Nil
/*/{Protheus.doc} MenuDef
Menu de opcoes na funcao zVid0189
@author Atilio
@since 11/09/2024
@version 1.0
@type function
/*/
Static Function MenuDef()
Local aRotina := {}
//Adicionando opcoes do menu
ADD OPTION aRotina TITLE "Visualizar" ACTION "VIEWDEF.zVid0189" OPERATION 1 ACCESS 0
ADD OPTION aRotina TITLE "Reenviar eMail" ACTION "U_zReenvMail()" OPERATION 1 ACCESS 0
Return aRotina
/*/{Protheus.doc} ModelDef
Modelo de dados na funcao zVid0189
@author Atilio
@since 11/09/2024
@version 1.0
@type function
/*/
Static Function ModelDef()
Local oStruct := FWFormStruct(1, cAliasMVC)
Local oModel
Local bPre := Nil
Local bPos := Nil
Local bCommit := Nil
Local bCancel := Nil
//Cria o modelo de dados para cadastro
oModel := MPFormModel():New("zMailM", bPre, bPos, bCommit, bCancel)
oModel:AddFields("Z38MASTER", /*cOwner*/, oStruct)
oModel:SetDescription("Modelo de dados - " + cTitulo)
oModel:GetModel("Z38MASTER"):SetDescription( "Dados de - " + cTitulo)
oModel:SetPrimaryKey({})
Return oModel
/*/{Protheus.doc} ViewDef
Visualizacao de dados na funcao zVid0189
@author Atilio
@since 11/09/2024
@version 1.0
@type function
/*/
Static Function ViewDef()
Local oModel := FWLoadModel("zVid0189")
Local oStruct := FWFormStruct(2, cAliasMVC)
Local oView
//Cria a visualizacao do cadastro
oView := FWFormView():New()
oView:SetModel(oModel)
oView:AddField("VIEW_Z38", oStruct, "Z38MASTER")
oView:CreateHorizontalBox("TELA" , 100 )
oView:SetOwnerView("VIEW_Z38", "TELA")
Return oView
/*/{Protheus.doc} zIncMail
Inclusão de Log de eMail
@author Atilio
@since 11/09/2024
@version 1.0
@type function
/*/
User Function zIncMail(lResult, cResulMsg, cRemetente, cAssunto, cDestinat, cMensagem, xAnexos)
Local aArea := FWGetArea()
Local cCodigo := ""
Local cRotina := ""
Local cDescri := ""
Local dDataEnv := sToD("")
Local cHoraEnv := ""
Local cAmbiEnv := ""
Local cUsrEnv := ""
Local cUsrNome := ""
Local cAnexos := ""
Default lResult := .F.
Default cResulMsg := ""
Default cRemetente := ""
Default cAssunto := ""
Default cDestinat := ""
Default cMensagem := ""
Default xAnexos := {}
DbSelectArea("Z38")
Z38->(DbSetOrder(1))
//Monta as variáveis para gravação do log
cCodigo := GetSXENum("Z38", "Z38_CODIGO")
dDataEnv := Date()
cHoraEnv := Time()
cAmbiEnv := GetEnvServer()
cUsrEnv := RetCodUsr()
cUsrNome := UsrRetName(cUsrEnv)
If Empty(xAnexos)
cAnexos := ""
ElseIf ValType(xAnexos) == "C"
cAnexos := xAnexos
Else
cAnexos := CenArr2Str(xAnexos, "|")
EndIf
//Monta a rotina e descrição
fBuscaRot(@cRotina, @cDescri)
//Se deu certo o disparo, zera o log para não confundir
If lResult
cResulMsg := ""
EndIf
//Inclui o registro
RecLock("Z38", .T.)
Z38->Z38_FILIAL := FWxFilial("Z38")
Z38->Z38_CODIGO := cCodigo
Z38->Z38_DESCRI := cDescri
Z38->Z38_DATA := dDataEnv
Z38->Z38_HORA := cHoraEnv
Z38->Z38_ROTINA := cRotina
Z38->Z38_AMBIEN := cAmbiEnv
Z38->Z38_RESULT := Iif(lResult, "1", "2")
Z38->Z38_RESMSG := cResulMsg
Z38->Z38_USRCOD := cUsrEnv
Z38->Z38_USRNOM := cUsrNome
Z38->Z38_REMETE := cRemetente
Z38->Z38_ASSUNT := cAssunto
Z38->Z38_DESTIN := cDestinat
Z38->Z38_MENSAG := cMensagem
Z38->Z38_ANEXOS := cAnexos
Z38->(MsUnlock())
ConfirmSX8()
FWRestArea(aArea)
Return
Static Function fBuscaRot(cRotina, cDescri)
Local nAtu := 0
Local cRotAux := "XXX"
cRotina := "XXX"
cDescri := "Função (menu): " + FunName()
//Enquanto houver funções, vai pegar sempre a última
While ! (Empty(cRotAux))
cRotAux := Upper( Alltrim(ProcName(nAtu)) )
If ! Alltrim(cRotAux) + ";" $ "WFLAUNCHER;U_ZENVMAIL;U_ZINCMAIL;U_ENVIARANE;U_ENVEMAIL;GPEMAIL;"
cRotina := cRotAux
EndIf
nAtu++
EndDo
Return
/*/{Protheus.doc} User Function zReenvMail
Função para reenviar email
@type Function
@author Atilio
@since 22/02/2023
/*/
User Function zReenvMail()
Local aArea := FWGetArea()
Local cPara := Alltrim(Z38->Z38_DESTIN)
Local cAssunto := Alltrim(Z38->Z38_ASSUNT)
Local cCorpo := Alltrim(Z38->Z38_MENSAG)
Local aAnexos := Iif(!Empty(Z38->Z38_ANEXOS), StrTokArr(Alltrim(Z38->Z38_ANEXOS), "|"), {})
Local lMostraLog := .T.
Local lDeuCerto := .F.
//Pergunta se quer reenviar
If FWAlertYesNo("Deseja reenviar o e-Mail posicionado?", "Confirma?")
//Confirma os destinatários
cPara := FWInputBox("Informe os destinatários que irão receber:", cPara)
//Aciona o disparo do e-Mail
Processa({|| ;
lDeuCerto := GPEMail(;
cAssunto,;
cCorpo,;
cPara,;
aAnexos,;
lMostraLog;
);
}, "Disparando o e-Mail")
//Exibe uma mensagem de sucesso ou falha
If lDeuCerto
FWAlertSuccess("Sucesso no envio do eMail", "Sucesso")
Else
FWAlertError("Falha no disparo do e-Mail", "Falha")
EndIf
EndIf
FWRestArea(aArea)
Return
/*/{Protheus.doc} User Function zTstMail
Função de teste de disparo de eMail
@type Function
@author Atilio
@since 11/09/2024
/*/
User Function zTstMail()
Local cAssunto := "eMail de Teste"
Local cCorpo := "<p>Olá, esse é um eMail de Teste</p>"
Local cPara := "contato@atiliosistemas.com"
Local aAnexos := {}
Local lMostraErro := .F.
Local cMsgErro := "N"
Local lDeuCerto := .T.
//Adiciona o arquivo como anexo
aAdd(aAnexos, "\x_imagens\logo.png")
//Dispara o email
lDeuCerto := GPEMail(cAssunto, cCorpo, cPara, aAnexos, lMostraErro, @cMsgErro)
//Grava o log
u_zIncMail(lDeuCerto, cMsgErro, GetMV("MV_RELFROM"), cAssunto, cPara, cCorpo, aAnexos)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Daniel, muito bom!
Só senti falta dessa vez de um exemplo prático no video rs
Bom dia Julio, tudo joia?
Opa, obrigado pelo feedback.
Infelizmente não conseguimos gravar dessa vez, mas anotamos aqui para ficar mais atentos.
Tenha uma ótima e abençoada sexta feira.
Um forte abraço.