PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Como receber e-mails e tratar seus anexos
Como receber e-mails e tratar seus anexos
Débuté par Bastiaan, 02 aoû. 2017 02:14 - 4 réponses
Membre enregistré
37 messages
Popularité : +5 (5 votes)
Posté le 02 août 2017 - 02:14
Oi pessoal

Estou desenvolvendo uma aplicação para enviar e receber e-mails.
OK - tem um exemplo completo no WinDEV, mas este exemplo está complicado demais para entender (pelo menos para mim que estou começando).

Já consegui desenvolver toda a parte de envio de e-mails, inclusive com tratamento de anexos.

Estou com problema para entender como montar o mecanismo de recebimento de e-mails, mais precisamente como acessar e recuperar os anexos dos e-mails a serem recebidos.

Já entendi como recuperar as informações genéricas dos e-mails recebidos (assunto, mensagem, sender etc...)

Mesmo lendo os Helps não estou conseguindo montar o código para receber e tratar estes anexos de e-mails.
Afinal preciso poder mostrá-los aos usuários e depois deixar que eles possam acessar os mesmos.

Com o código abaixo, consigo receber os e-mails, mas não sei como usar Email.Attach[I]) para tratar os anexos.

Por favor alguém poderia me ajudar, com um exemplo de código simples mas funcional, ou então me dizer o que falta no meu código abaixo.

meus antecipados agradecimentos - Bastiaan




MyMessage is Email
MyPOP3Session is EmailPOP3Session
// POP3 session
MyPOP3Session..ServerAddress ="pop.xxxxxxxxxxxx.com.br"
MyPOP3Session..Name ="sistema@xxxxxxxxxxxxxxx.com.br"
MyPOP3Session..Password ="zzzz"//
MyPOP3Session..Port=110
// inicio POP3 session
IF NOT EmailStartSession(MyPOP3Session) THEN
// Erro
Error("Problema no POP3 session.", ErrorInfo())
ELSE

// leitura da mensagens
EmailReadFirst(MyPOP3Session, MyMessage)
nContador is int
nContador=0
I is int = 0
EmailNbMessage(MyPOP3Session)
WHILE NOT Email.Out
// Processa leituras das mensagens de e-mail
nContador=nContador+1
// OK consigo obter as informações de cada e-mails
Trace(nContador,MyMessage..Subject, MyMessage..Sender, MyMessage..Message)
//
// mas
// estou tentando buscar a lista de anexos existentes para cada e-mail
// estou usando as linhas abaixo mas não está funcionando
// como faço para obter os arquivos anexos
//

FOR I = 1 TO Email.NbAttach
ListAdd(LIST_lista_de_anexos, Email.Attach[I])
END

IF MyMessage..Subject="" THEN
BREAK
END
// Read the next message
EmailReadNext(MyPOP3Session, MyMessage)
END


// Disconnect from the session
EmailCloseSession(MyPOP3Session)

END
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 02 août 2017 - 10:16
Bom dia

O attached mesmo não usado deve estar declarado com 1

Ok

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/
Membre enregistré
37 messages
Popularité : +5 (5 votes)
Posté le 03 août 2017 - 17:39
Boller - grato pelo retorno mas me parece que não era esta a questão

Depois de muita pesquisa finalmente cheguei ao código que :

Cria a conexão como servidor POP3
Lê os e-mails que Ainda Não foram Lidos
Grava as informações dos e-mails 2m 2 tabelas
Na tabela e-mails, grava as informações para identificar o e-mail recebido
Na tabela E_mais_anexo, grava as informações de cada anexo (se houver) que está ligado ao respectivo E_mail (ou seja se o anexo for por um PDF, este PDF, um JPG etc.. ficara gravado para posterior recuperação
Após receber e gravar a rotina ainda apaga o e-mail lido do servidor POP3, para que ele não venha a ser recebido novamente.

Se alguém tiver a mesma necessidade que eu tive, adaptando o exemplo, poupará muito tempo e dor de cabeça.

Se alguém tiver um reparo ou aperfeiçoamento a fazer , seria muito bom para a comunidade -

Um abraço - Bastiaan


Segue código

// enquanto os e-mails são recebidos muda cursor para indicar rotina em andamento

HourGlass()

// seleciona as contas de e-mail do usuário
HExecuteQuery(QRY_Seleciona_contas_de_1_usuario,hQueryDefault,gnCODIGO_USUARIO_LOGADO)
HReadFirst(QRY_Seleciona_contas_de_1_usuario)

MyMessage is Email
MyPOP3Session is EmailPOP3Session
nQTDE_ANEXOS is int
Attachment is EmailAttach
memo_size is int
gsInformacao_do_campo_memo is string

EmailProgressBar(PROGBAR_recebendo_emails)
// Varre contas de e-mail do usuário
WHILE HOut(QRY_Seleciona_contas_de_1_usuario)=False
// processa a leitura de e-mails de cada conta do usuário
MyPOP3Session..ServerAddress =QRY_Seleciona_contas_de_1_usuario.Servidor_entrada_POP_Imap //"// "pop3.mycompany.us"
MyPOP3Session..Name =QRY_Seleciona_contas_de_1_usuario.E_mail_do_dono_da_conta //"user"
MyPOP3Session..Password =QRY_Seleciona_contas_de_1_usuario.Senha_servidor_entrada_POP_IMAP
MyPOP3Session..Port=QRY_Seleciona_contas_de_1_usuario.Porta_Servidor_entrada_POP_IMAP //110
// Inicia sessão POP3
//
IF NOT EmailStartSession(MyPOP3Session) THEN
// Error starting the IMAP session
Error("êrro na conexão com o servidor da conta POP : "+QRY_Seleciona_contas_de_1_usuario.E_mail_do_dono_da_conta+" Aguarde e tente novamente + tarde - "+ErrorInfo())
ELSE
// processa e-mails recebidos
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
EmailReadFirst(MyPOP3Session, MyMessage)
//
nQTDE_ANEXOS = MyMessage..Attach..Occurrence
nContador is int
nContador=0
I is int = 0
EmailNbMessage(MyPOP3Session)

WHILE NOT MyMessage.Out
// grava dados dos e-mais recebidos na tabela E_mails
HReset(E_Mails)
E_Mails.Configura_Contas_de_EmailID=QRY_Seleciona_contas_de_1_usuario.Configura_Contas_de_EmailID
E_Mails.CODIGO_USUARIO=gnCODIGO_USUARIO_LOGADO

E_Mails.Recipient=ArrayToString(MyMessage.Recipient)
E_Mails.Sender=MyMessage.Sender
E_Mails.SubJect=MyMessage.Subject
E_Mails.Date=MyMessage.ReceiveDate
HAdd(E_Mails)
//>>>>>>>>>>>>>>>>>>>>>>>>>>
// Apura Qtde de anexos a este e-mail
nQTDE_ANEXOS = MyMessage..Attach..Occurrence

FOR I = 1 TO nQTDE_ANEXOS
//FileToSave = fSelect("C:\1_anexo_email", "", Attachment..Name, "All files (*.*)" + TAB + "*.*", "", fselCreate)
//EmailSaveAttachment(MyMessage.Attach[I], FileToSave)
// grava anexos na tabela E_mails_Anexos
HReset(E_mail_Anexos)
E_mail_Anexos.Configura_Contas_de_EmailID=QRY_Seleciona_contas_de_1_usuario.Configura_Contas_de_EmailID
E_mail_Anexos.E_MailsID=E_Mails.E_MailsID
E_mail_Anexos.Nome_arquivo_anexo=MyMessage.Attach[I].Name
E_mail_Anexos.Dados_do_anexo=MyMessage.Attach[I].Content
//memo_size apura o tamanho do anexo que está sendo arquivado
gsInformacao_do_campo_memo=HInfoMemo(E_mail_Anexos, Dados_do_anexo)
memo_size= Val(ExtractString(gsInformacao_do_campo_memo, 3, TAB))
E_mail_Anexos.Tamanho_do_anexo=memo_size
HAdd(E_mail_Anexos)

END

EmailDeleteMessage(MyPOP3Session, MyMessage)
//>>>>>>>>>>>>>>>>>>>>>>>>>>
nContador=nContador+1

IF MyMessage..Subject="" THEN
BREAK
END
// Read the next message
EmailReadNext(MyPOP3Session, MyMessage)
END
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


// fecha conexão
EmailCloseSession(MyPOP3Session)

END
//
//EmailProgressBar(PROGBAR_recebendo_emails)
HReadNext(QRY_Seleciona_contas_de_1_usuario)
END

// exibe a tabela E-mails
HExecuteQuery(QRY_E_Mails_recebidos_p_usuario,hQueryDefault,gnCODIGO_USUARIO_LOGADO)
TableDisplay(TABLE_QRY_E_Mails_recebidos_p_usuario)
//
Message modifié, 03 août 2017 - 17:43
Membre enregistré
37 messages
Popularité : +5 (5 votes)
Posté le 03 août 2017 - 17:44
Boller - grato pelo retorno mas me parece que não era esta a questão

Depois de muita pesquisa finalmente cheguei ao código que :

Cria a conexão como servidor POP3
Lê os e-mails que Ainda Não foram Lidos
Grava as informações dos e-mails 2m 2 tabelas
Na tabela e-mails, grava as informações para identificar o e-mail recebido
Na tabela E_mais_anexo, grava as informações de cada anexo (se houver) que está ligado ao respectivo E_mail (ou seja se o anexo for por um PDF, este PDF, um JPG etc.. ficara gravado para posterior recuperação
Após receber e gravar a rotina ainda apaga o e-mail lido do servidor POP3, para que ele não venha a ser recebido novamente.

Se alguém tiver a mesma necessidade que eu tive, adaptando o exemplo, poupará muito tempo e dor de cabeça.

Se alguém tiver um reparo ou aperfeiçoamento a fazer , seria muito bom para a comunidade -

Um abraço - Bastiaan


Segue código

// enquanto os e-mails são recebidos muda cursor para indicar rotina em andamento

HourGlass()

// seleciona as contas de e-mail do usuário
HExecuteQuery(QRY_Seleciona_contas_de_1_usuario,hQueryDefault,gnCODIGO_USUARIO_LOGADO)
HReadFirst(QRY_Seleciona_contas_de_1_usuario)

MyMessage is Email
MyPOP3Session is EmailPOP3Session
nQTDE_ANEXOS is int
Attachment is EmailAttach
memo_size is int
gsInformacao_do_campo_memo is string

EmailProgressBar(PROGBAR_recebendo_emails)
// Varre contas de e-mail do usuário
WHILE HOut(QRY_Seleciona_contas_de_1_usuario)=False
// processa a leitura de e-mails de cada conta do usuário
MyPOP3Session..ServerAddress =QRY_Seleciona_contas_de_1_usuario.Servidor_entrada_POP_Imap //""// "pop3.mycompany.us"
MyPOP3Session..Name =QRY_Seleciona_contas_de_1_usuario.E_mail_do_dono_da_conta //"" //"user"
MyPOP3Session..Password =QRY_Seleciona_contas_de_1_usuario.Senha_servidor_entrada_POP_IMAP //"/ "secret"
MyPOP3Session..Port=QRY_Seleciona_contas_de_1_usuario.Porta_Servidor_entrada_POP_IMAP //110
// Inicia sessão POP3
//
IF NOT EmailStartSession(MyPOP3Session) THEN
// Error starting the IMAP session
Error("êrro na conexão com o servidor da conta POP : "+QRY_Seleciona_contas_de_1_usuario.E_mail_do_dono_da_conta+" Aguarde e tente novamente + tarde - "+ErrorInfo())
ELSE
// processa e-mails recebidos
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++
EmailReadFirst(MyPOP3Session, MyMessage)
//
nQTDE_ANEXOS = MyMessage..Attach..Occurrence
nContador is int
nContador=0
I is int = 0
EmailNbMessage(MyPOP3Session)

WHILE NOT MyMessage.Out
// grava dados dos e-mais recebidos na tabela E_mails
HReset(E_Mails)
E_Mails.Configura_Contas_de_EmailID=QRY_Seleciona_contas_de_1_usuario.Configura_Contas_de_EmailID
E_Mails.CODIGO_USUARIO=gnCODIGO_USUARIO_LOGADO

E_Mails.Recipient=ArrayToString(MyMessage.Recipient)
E_Mails.Sender=MyMessage.Sender
E_Mails.SubJect=MyMessage.Subject
E_Mails.Date=MyMessage.ReceiveDate
HAdd(E_Mails)
//>>>>>>>>>>>>>>>>>>>>>>>>>>
// Apura Qtde de anexos a este e-mail
nQTDE_ANEXOS = MyMessage..Attach..Occurrence

FOR I = 1 TO nQTDE_ANEXOS
//FileToSave = fSelect("C:\1_anexo_email", "", Attachment..Name, "All files (*.*)" + TAB + "*.*", "", fselCreate)
//EmailSaveAttachment(MyMessage.Attach[I], FileToSave)
// grava anexos na tabela E_mails_Anexos
HReset(E_mail_Anexos)
E_mail_Anexos.Configura_Contas_de_EmailID=QRY_Seleciona_contas_de_1_usuario.Configura_Contas_de_EmailID
E_mail_Anexos.E_MailsID=E_Mails.E_MailsID
E_mail_Anexos.Nome_arquivo_anexo=MyMessage.Attach[I].Name
E_mail_Anexos.Dados_do_anexo=MyMessage.Attach[I].Content
//memo_size apura o tamanho do anexo que está sendo arquivado
gsInformacao_do_campo_memo=HInfoMemo(E_mail_Anexos, Dados_do_anexo)
memo_size= Val(ExtractString(gsInformacao_do_campo_memo, 3, TAB))
E_mail_Anexos.Tamanho_do_anexo=memo_size
HAdd(E_mail_Anexos)

END

EmailDeleteMessage(MyPOP3Session, MyMessage)
//>>>>>>>>>>>>>>>>>>>>>>>>>>
nContador=nContador+1

IF MyMessage..Subject="" THEN
BREAK
END
// Read the next message
EmailReadNext(MyPOP3Session, MyMessage)
END
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++


// fecha conexão
EmailCloseSession(MyPOP3Session)

END
//
//EmailProgressBar(PROGBAR_recebendo_emails)
HReadNext(QRY_Seleciona_contas_de_1_usuario)
END

// exibe a tabela E-mails
HExecuteQuery(QRY_E_Mails_recebidos_p_usuario,hQueryDefault,gnCODIGO_USUARIO_LOGADO)
TableDisplay(TABLE_QRY_E_Mails_recebidos_p_usuario)
//
Membre enregistré
3 651 messages
Popularité : +175 (223 votes)
Posté le 03 août 2017 - 18:04
Parabéns Batiaan

Admiro pessoas persistentes!

Sucesso meu amigo!

:merci:

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/