Receber e-mail Pop / IMAP e depois encaminhar como criptografado para o gmail

8

Basicamente, eu tenho uma conta de e-mail que eu posso acessar como POP3 ou IMAP. Quero 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 no meu telefone / conta do Gmail e possivelmente descriptografar a mensagem com uma frase secreta - embora esta última etapa não precisa ser implementada inicialmente).

Eu provavelmente poderia escrever um script python para fazer isso, mas usar as ferramentas apropriadas do Linux parece um caminho melhor. Eu tenho postfix (em uma configuração de satélite) já configurado para enviar e-mail de saída.

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

(Para registro: sua política contra trabalho (parcialmente para conformidade com a lei HIPAA dos EUA) para eu enviar versões não criptografadas do meu e-mail para o meu telefone, pois há o potencial para alguém deliberadamente (ou inadvertidamente) enviar dados protegidos por e-mail para meu telefone. O trabalho considera o GPG seguro.)

    
por dr jimbob 19.08.2011 / 22:12

3 respostas

3

Acabei de ver a outra resposta e acho que nunca escrevi a solução que realmente implementei. Acontece que o imaplib python é simples e eu escrevi um script muito rápido. Exceto algumas alterações (por exemplo, anonimizar meus vários USERNAMEs, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Eu também não apenas envio criptografado; mas preencha o assunto com o nome de usuário do remetente e coloque algumas das coisas do cabeçalho antes do GPG (no caso de eu estar lendo no meu telefone e não poder 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 de mail.py dentro de um diretório chamado mail), então ele será executado a cada 5 minutos durante os dias de semana (MF 8-7pm) 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
    
por 14.09.2011 / 18:55
1

Fetchmail!

link

    
por 14.09.2011 / 04:50
1

Eu tive a necessidade de encaminhar os e-mails do root também, e resumi minhas descobertas aqui: link

Talvez isso também possa resolver suas necessidades.

    
por 05.04.2012 / 14:19