shell-script-pt
[Top][All Lists]
Advanced

[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?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]