Receba e-mails pop / IMAP e encaminhe como criptografado para o gmail

8

Basicamente, tenho uma conta de email que posso acessar como POP3 ou IMAP. Desejo receber todos os e-mails recebidos, criptografá-los e encaminhar a versão criptografada para minha conta do Gmail (para que eu possa ver o assunto / notificações na minha conta de telefone / gmail; e possivelmente descriptografar a mensagem com uma senha - embora esta última etapa não precisa ser implementada inicialmente).

Provavelmente eu poderia escrever um script python para fazer isso, mas usar as ferramentas linux adequadas parece uma rota melhor. Eu tenho o postfix (em uma configuração via satélite) já configurado para enviar e-mails enviados.

Qual é a maneira mais fácil de ler POP3 / IMAP em uma caixa Linux e fazer com que ele gpg criptografe o corpo e os anexos do email (sem os cabeçalhos do assunto) com minha chave pública e encaminhe-a para o meu conta do gmail?

(Para constar; é contra a política do trabalho (parcialmente por conformidade com a lei HIPAA dos EUA) que eu envie versões não criptografadas do meu email para o meu telefone; pois existe o potencial de alguém enviar deliberadamente (ou inadvertidamente) os dados protegidos por email para o meu telefone. O trabalho considera o GPG seguro.)

dr jimbob
fonte
j3e.de/pgp-mime-encrypt-in-procmail.html sugere uma solução usando procmail / formail
Olivier Berger

Respostas:

3

Acabei de ver a outra resposta e acho que nunca escrevi a solução que realmente implementei. Acontece que o python imaplib é direto e eu escrevi um script muito rápido. Exceto algumas alterações (por exemplo, anonimizando meus vários USERNAMEs, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Eu também não apenas o envio criptografado; mas inclua o assunto com o nome de usuário do remetente e coloque algumas das informações do cabeçalho antes do GPG (caso esteja lendo no meu telefone e não consiga descriptografar).

#!/usr/bin/python

import imaplib
import email
from datetime import datetime,timedelta
import shelve
from subprocess import Popen, PIPE

def piped_call(command1, arg1_list, command2, arg2_list):
    """
    if arg1_tuple = (a10, a11, a12); arg2_tuple is (a20, a21)    
    This executes "command1 a10 a11 a12 | command2 a20 a21 a22"
    """
    if type(arg1_list) not in (list, tuple):
        arg1_list = [arg1_list,]
    if type(arg2_list) not in (list, tuple):
        arg2_list = [arg2_list,]
    p1 = Popen([command1,]+list(arg1_list), stdout=PIPE)
    p2 = Popen([command2,]+list(arg2_list), stdin=p1.stdout, stdout=PIPE)
    p1.stdout.close()
    return p2.communicate()[0]

shlf = shelve.open('/home/USERNAME/mail/mail.shlf')
# This shelf (a persistent python dictionary written to file) has as its key 
# the IMAP message ids of all emails that have been processed by this script.
# Every time the script runs, I fetch all emails from the current day
# (except from midnight to 1am, where I fetch all emails since yesterday)
# and then send all emails that haven't been sent previously 
# by checking message ids against the python shelf.

M = imaplib.IMAP4_SSL(host='imap.WORKDOMAINNAME.com', port=993)
M.login('EMAILUSERNAME', 'EMAILPASSWORD')
M.select()
dt = datetime.now() - timedelta(0,5*60*60) 
# Only search for messages since the day of an hour earlier.  
# This way messages from yesterday don't get lost at midnight; as well as limiting the number of messages to process through to just todays.    
typ, uid_data = M.uid('search', None, '(SINCE %s)' % dt.strftime('%d-%b-%Y'))

for num in uid_data[0].split():
    typ, data = M.uid('fetch', num, '(RFC822)')
    e = email.message_from_string(data[0][1])
    print 'Message %s\n%s\n' % (num, e['subject'])
    if num not in shlf:
        sender_email = e['return-path']
        for s in ('<', '>', '@WORKDOMAINNAME.com'):
            sender_email = sender_email.replace(s,'')
        subject = "%s: %s" % (sender_email, e['Subject'])
        body = ("From: %s\n"
                "To: %s\n"
                "Cc: %s\n"
                "Subject: %s\n\n" % (e['From'], e['To'], e['Cc'], e['subject']))
        payload = e.get_payload()
        if type(payload) in (list, tuple):
            payload = str(payload[0])
        else:
            payload = str(payload)
        encrypted_payload = piped_call('echo', (payload,),
                                       'gpg', ('-e', '-a', '-r', 'MYGPGKEYID'))
        body += encrypted_payload
        piped_call('echo', (body,), 
                   'mail', ['[email protected]', '-s', subject])
        shlf[num] = datetime.now()


M.close()
M.logout()

Em seguida, adicionei as seguintes linhas ao meu crontab (o script acima é chamado mail.py dentro de um diretório chamado mail), para que ele seja executado a cada 5 minutos durante o horário normal durante a semana (MF 20-27) e com menos frequência em outras horas . (crontab -e)

# Every 5 minutes, M-F from 8am - 7pm.    
*/5 8-19 * * 1-5  cd /home/USERNAME/mail && ./mail.py >> /home/USERNAME/mail/mail.log 2>&1
# Every 30 minutes, Sat&Sun from 8am-7pm
0,30 8-19 * * 6,7  cd /home/USERNAME/mail && ./mail.py >> /home/USERNAME/mail/mail.log 2>&1
# Every 30 minutes, M-F 8pm-2am; (no emails 2am-8am)
0,30 0-2,20-23 * * 1-5  cd /home/USERNAME/mail && ./mail.py >> /home/USERNAME/mail/mail.log 2>&1
# Every 60 minutes, Sat&Sun hours 8pm-2am; (no emails 2am-8am)
0 0-2,20-23 * * 6-7  cd /home/USERNAME/mail && ./mail.py >> /home/USERNAME/mail/mail.log 2>&1
dr jimbob
fonte
1

Fetchmail!

http://www.fetchmail.info/

rjp
fonte
1
Você poderia incluir algum tipo de explicação sobre como configurar o fetchmail para fazer tudo isso?
Michael Mrozek
Eu não acho que isso teria feito o truque. Parece receber e encaminhar emails com bastante facilidade, mas não vejo como inserir a etapa de criptografia GPG antes de encaminhar. Por favor me corrija se eu estiver errado.
precisa saber é o seguinte
Ei, dr jimbob, eu assumi que uma vez que você receba o e-mail localmente, você usaria a instalação do postfix para canalizá-lo / conectá-lo ao gpg e encaminhar o resultado. Seu script faz o truque, mas na sua pergunta você mencionou querer usar as ferramentas encontradas no Linux. Que bom que você resolveu!
rjp 15/09
1

Também tive a necessidade de encaminhar as mensagens de root criptografadas e resumi minhas descobertas aqui: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- roots-mail-through-gpg /

Talvez isso possa resolver suas necessidades também.

Olivier Berger
fonte
+1 Obrigado; embora eu provavelmente continue com a minha solução.
dr jimbob
Os scripts que eu mencionei na minha postagem no blog desapareceram da Web, mas parece que o archive.org tem cópias dos scripts. Veja web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… para obter detalhes
Olivier Berger