Realiza conexão a uma conta de e-Mail e faz download das mensagens / anexos
Exemplo 1- Acessando uma caixa de entrada e baixando arquivos com extensão .txt (via IMAP):
Static Function fProcessa() Private cDirBase := GetSrvProfString("RootPath", "") Private cDirPad := "\x_importacao\" Private cConta := '' Private cSenha := '' Private cSrvFull := '' Private cServer := '' Private nPort := 0 cConta := "email@dominio.com.br" cSenha := "senha" cSrvFull := "servidor:993" cServer := Iif(':' $ cSrvFull, SubStr(cSrvFull, 1, At(':', cSrvFull)-1), cSrvFull) nPort := Iif(':' $ cSrvFull, Val(SubStr(cSrvFull, At(':', cSrvFull)+1, Len(cSrvFull))), 110) //Se o último caracter não for barra, retira ela If SubStr(cDirBase, Len(cDirBase), 1) == '\' cDirBase := SubStr(cDirBase, 1, Len(cDirBase)-1) EndIf //O diretório cheio, será o caminho absoluto + conteúdo do parâmetro, por exemplo, D:\TOTVS\TOTVS Protheus\Protheus_Data\x_importacao_email cDirFull := cDirBase + cDirPad //Chama a importação fBaixa() Return Static Function fBaixa() Local aArea := GetArea() Local cArqINI Local cBkpConf Local nRet Local nNumMsg Local nMsgAtu Local oManager Local oMessage Local nAnexoAtu Local nTotAnexo Local aInfAttach Local lOk Local lEntrou //Altera o arquivo appserver.ini, deixando como IMAP cArqINI := GetSrvIniName() cBkpConf := GetPvProfString( "MAIL", "Protocol", "", cArqINI ) WritePProString('MAIL', 'PROTOCOL', 'IMAP', cArqINI) //Cria a conexão base no gerenciamento oManager := tMailManager():New() oManager:SetUseSSL(.T.) oManager:SetUseTLS(.T.) oManager:Init(cServer, "", cConta, cSenha, nPort, 0) //Caso não consiga setar 120 segundos como timeout (2 minutos), não continua If oManager:SetPopTimeOut(120) != 0 //ConOut("[zBxMail] Falha ao setar o timeout" ) Else //Faz a conexão com IMAP nRet := oManager:IMAPConnect() //Se não conseguir conectar, mostra qual é a mensagem de erro If nRet != 0 //ConOut("[zBxMail] Falha ao conectar" ) //ConOut("[zBxMail][ERROR] " + StrZero(nRet, 6), oManager:GetErrorString(nRet)) Else //ConOut("[zBxMail] Sucesso ao conectar" ) //Busca o número de mensagens na caixa de entrada nNumMsg := 0 oManager:GetNumMsgs(@nNumMsg) //Se houver mensagens a serem processadas If nNumMsg > 0 ProcRegua(nNumMsg) //Percorre o número de mensagens For nMsgAtu := 1 To nNumMsg IncProc("Baixando e-Mail " + cValToChar(nMsgAtu) + " de " + cValToChar(nNumMsg) + "...") //Buscando a mensagem atual oMessage := tMailMessage():new() oMessage:Clear() oMessage:Receive(oManager, nMsgAtu) //Busca o total de Anexos nTotAnexo := oMessage:GetAttachCount() //Limpando a flag lOk := .T. lEntrou := .F. //Percorre todos os anexos For nAnexoAtu := 1 To nTotAnexo //Busca as informações do anexo aInfAttach := oMessage:GetAttachInfo(nAnexoAtu) //Se tiver conteúdo, e for do tipo TXT e vier do email teste@dominio.com If ! Empty(aInfAttach[1]) .And. Upper(Right(AllTrim(aInfAttach[1]),4)) == '.TXT' .And. "TESTE@DOMINIO.COM" $ Upper(oMessage:cFrom) lEntrou := .T. //Salva o arquivo na pasta correta If oMessage:SaveAttach(nAnexoAtu, cDirFull + aInfAttach[1]) //ConOut("+================================+") //ConOut("[zBxMail] e-Mail Lido com Anexo: ") //ConOut("e-Mail Origem: " + cConta) //ConOut("Número da Mensagem: " + cValToChar(nMsgAtu)) //ConOut("De: " + oMessage:cFrom) //ConOut("Cópia: " + oMessage:cCc) //ConOut("Assunto: " + oMessage:cSubject) //ConOut("Número Anexo: " + cValToChar(nAnexoAtu)) //ConOut("Anexo " + StrZero(nAnexoAtu, 3) + ": " + aInfAttach[1] ) //ConOut("Corpo: " + oMessage:cBody) //ConOut("+================================+") Else lOk := .F. //ConOut("[zBxMail] Erro ao salvar anexo " + cValToChar(nAnexoAtu) + ": " + aInfAttach[1] ) EndIf EndIf Next nAnexoAtu //Se o anexo tiver sido salvo com sucesso If lOk If lEntrou If ! (oManager:MoveMsg(nMsgAtu, "Importados")) //ConOut("[zBxMail] Não foi possível mover a mensagem - " + cValToChar(nMsgAtu) + "...") EndIf Else If ! (oManager:MoveMsg(nMsgAtu, "Processados")) //ConOut("[zBxMail] Não foi possível mover a mensagem - " + cValToChar(nMsgAtu) + "...") EndIf EndIf EndIf //ConOut(CRLF) Next nMsgAtu Else //ConOut("[zBxMail] Não existem mensagens para processamento...") EndIf //Desconecta do servidor IMAP oManager:IMAPDisconnect() EndIf EndIf //Volta a configuração de Protocol no arquivo appserver.ini WritePProString('MAIL', 'PROTOCOL', cBkpConf, cArqINI) RestArea(aArea) Return
Exemplo em Vídeo:
Clique nesse link para ver um exemplo em Vídeo da nossa Maratona de Exemplos.