[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ler e baixar aquivos de e-mail
From: |
Cristiano |
Subject: |
Re: ler e baixar aquivos de e-mail |
Date: |
Mon, 03 May 2010 00:00:44 -0000 |
User-agent: |
eGroups-EW/0.82 |
--- Em address@hidden, Francisco - Yahoo <pinguim@...> escreveu
>
> Bom dia a todos,
> gostaria de saber se pode ser feito uma rotina em shell scrip para que
> leia e-mails e salve os arquivos XML anexados em um determinado diretorio.
> eu tenho uma conta de e-mail que os fornecedores enviam os arquivos das
> NFE em formato XML, essa conta serve unica e exclusivamente para esse
> fim, qualquer outro e-mail ou arquivo que venha anexado vai ser
> excluido, ou seja se tiver algum e-mail sem nenhum anexo, esse e-mail
> vai ser excluido, se tiver algum e-mail que tenha anexo e esse anexo nao
> for arquivo XML, esse arquivo vai ser excluido, em resumo vai baixar
> apenas os anexos XML em um local determinado. Pode haver e-mail com
> varios arquivos XML entao vai ser salva todos os arquivos XML.
> O que eu achei na internet foi referente ao SENDMAIL, mas eu quero
> gerenciador de e-mail, quero apenas ler o e-mail, verificar se existe
> arquivos XML anexado e salvar esses arquivos.
>
> Agradeco a todos se me derem uma dica de como fazer isso, qual comando
> devo procurar
Francisco, como dizem os sábios: "não pergunte SE dá para fazer algo no shell.
Pergunte COMO fazer".
Há pelo menos meia dúzia de caminhos para se fazer isso. Alguns deles, por
exemplo, sem nem mesmo usar shell, mas isso foge ao escopo da lista. <off
topic> Exclusivamente a título de ilustração, até no mundo windows você pode
fazer isso, baixando as mensagens através do outlook e usando um, deus me
livre, VBScript para salvar os anexos de mensagens em uma pasta específica. Se
quiser saber como: http://www.vbaexpress.com/kb/getarticle.php?kb_id=522
</offtopic>
Porém o camimho para fazer isso no linux é muito mais florido. Aliás, há vários
caminhos para fazer isso no linux.
Sendo a mensagem de e-mail com anexo um mero arquivo em texto puro, com o anexo
codificado em um determinado podrão e dividida em partes indicadas por um
marcador (boundary), você consegue, com maior ou menor grau de dificuldade e
complexidade, ler o conteúdo das mensagens, separar as que contem o anexo XML
que você deseja e, nestas mensagens, extrair o anexo.
Tudo isso, através de um shell script. E, você pode fazer isso "unha", ou
utilizando algumas ferramentas. A opção é sua.
Novamente, apenas a título de ilustração, uma opção para se fazer 'na unha', é
conectar-se ao servidor pop3 de via telnet e baixar o texto da mensagem em um
arquivo (ou variável) e processá-la para identificar as partes que contêm os
anexos, decodificá-las e salvá-las, usando os recursos do shell.
Se este for o seu caminho, nos links abaixo você encontra boas informações
sobre como conversar com seu servidor pop3:
http://www.yuki-onna.co.uk/email/pop.html
http://www.pnambic.com/Goodies/POP3Ref.html
http://www.freesoft.org/CIE/RFC/1725/3.htm
http://www.electrictoolbox.com/article/networking/pop3-commands/
Entretanto, fazer isso via telnet é mais útil como exercício do que realmente
produtivo. É como reinvetar a roda: alguém já fez isso, você não precisa fazer
também.
Se você não tiver acesso direto ao servidor de e-mail, IMHO, a melhor
alternativa é montar um MDA (mail delivery agent) usando algo como getmail ou
fetchmail, armazenando as mensagens em um diretório específico e processá-las
para extrair os anexos.
Se os seus XML chegam por uma conta de e-mail específica para este fim (ex:
nfe@seu_dominio.com.br), é mais fácil, pois basta você descarregar toda a caixa
e processar todas as mensagens, salvando os anexos.
Porém, se as mensagens com os arquivos chegam junto com outras mensagens, você
talvez queira testar cada mensagem que entra para saber se ela deve ou não ter
seus anexos salvos.
Uma boa opção para se fazer isso é usar o maildrop
(http://www.courier-mta.org/maildrop/) que te permite escolher não apenas onde
entregar as mensagens de e-mail como também filtrar seu conteúdo.
Uma vez que você tem as mensagens gravadas em um diretório, extrair os anexos é
muito fácil: munpack.
O comando munpack lê uma mensagem de e-mail (que nada mais é que um arquivo
texto salvo dentro de um diretório) e salva seus anexos. Você pode, inclusive,
passar a mensagem via STDIN para ele e deixá-lo fazer o trabalho, caso deseje
fazer isso 'on the fly' enquanto a mensagem estiver sendo baixada.
Eu imagino a seguinte situação:
Você configura o getmail para baixar as mensagens via POP3 do seu servidor e as
entrega para o maildrop. Então, usa o comando "xfilter" do maildrop para
indicar o shell script que irá salvar os anexos, usando o munpack. O comando
xfilter aponta para um script (no nosso caso um shell script, mas pode ser
outra coisa, por exemplo, um python script) que receberá o conteúdo da mensagem
através da STDIN e deverá retorná-la, devidamente processada a seu gosto, para
a STDOUT. Depois dele, o maildrop grava a mensagem que recebeu da STDOUT do
script indicado pelo xfilter no diretório indicado.
Com isso, você pode configurar seu shell script para jogar o conteúdo recebido
do maildrop através da STDIN para o munpack (que automaticamente irá salvar os
anexo) e devolver o conteúdo intacto para ser salvo no servidor.
Assim, os anexos são salvos e a mensagem é entregue normalmente.
E, você ainda pode testar, pelo conteúdo da mensagem, se você quer ou não jogar
o texto da mensagem ao munpack para ele salvar os anexos, caso receba mais do
que apenas arquivos XML de NFe através da mesma conta de e-mail.
Se você tem acesso direto ao servidor de e-mail, basta executar o script nas
mensagens que entram no seu Maildir. Quando, onde e como fazer isso, vai
depender do servidor que você usa.
Ajudou?