Ricevi e-mail Pop / IMAP e poi inoltra come crittografato a Gmail


8

Fondamentalmente, ho un account e-mail a cui posso accedere come POP3 o IMAP. Voglio prendere tutte le e-mail in arrivo, crittografarle e quindi inoltrare la versione crittografata al mio account Gmail (in modo da poter vedere l'oggetto / notifiche sul mio telefono / account Gmail; e possibilmente decifrare il messaggio con una passphrase, anche se quest'ultima non è necessario implementare inizialmente il passaggio).

Probabilmente potrei scrivere uno script Python per farlo, ma usare gli strumenti linux appropriati sembra una strada migliore. Ho Postfix (in una configurazione satellitare) già impostato per inviare la posta in uscita.

Qual è il modo più semplice per leggere POP3 / IMAP su una scatola di Linux e farlo crittografare il corpo dell'e-mail e gli allegati (non le intestazioni dell'oggetto) con la mia chiave pubblica e inoltrarlo al mio account di Gmail?

(Per la cronaca; è contro la politica del lavoro (in parte per la conformità con la legge HIPAA degli Stati Uniti) per me di inviare versioni non crittografate della mia e-mail al mio telefono; poiché c'è il potenziale per qualcuno di inviare deliberatamente (o inavvertitamente) dati protetti al mio telefono. Il lavoro considera GPG sicuro.)


j3e.de/pgp-mime-encrypt-in-procmail.html suggerisce una soluzione usando procmail / formail
Olivier Berger

Risposte:


3

Ho appena visto l'altra risposta e suppongo di non aver mai scritto la soluzione che ho effettivamente implementato. Si scopre che imaplib di Python è semplice e ho scritto una sceneggiatura molto veloce. Salvo alcune modifiche (ad esempio, anonimizzando i miei vari USERNAME, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Inoltre non lo mando solo crittografato; ma anteponi l'argomento con il nome utente del mittente e metti alcuni elementi dell'intestazione prima del GPG (nel caso in cui lo stia leggendo sul mio telefono e non riesca a decifrare).

#!/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', ['USERNAME@gmail.com', '-s', subject])
        shlf[num] = datetime.now()


M.close()
M.logout()

Ho quindi aggiunto le seguenti righe al mio crontab (lo script sopra è chiamato mail.py all'interno di una directory chiamata mail), quindi verrà eseguito ogni 5 minuti durante le normali ore nei giorni feriali (MF 8-7pm) e meno frequentemente nelle altre ore . (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

1

1
Potresti includere una sorta di spiegazione su come impostare fetchmail per fare tutto questo?
Michael Mrozek

Non penso che questo avrebbe funzionato. Sembra ricevere e inoltrare la posta abbastanza facilmente, ma non vedo come inserire il passaggio di crittografia GPG prima dell'inoltro. Per favore correggimi se sbaglio.
dr jimbob,

Ehi dottor Jimbob, ho pensato che una volta che avessi avuto la posta localmente avresti usato la tua installazione postfix per instradarla / agganciarla tramite gpg e inoltrare il risultato. Il tuo script fa il trucco, ma nella tua domanda hai detto di voler usare gli strumenti che si trovano su Linux. Sono contento che tu l'abbia risolto!
rjp,

1

Ho avuto anche la necessità di inoltrare la posta di root crittografata e ho riassunto i miei risultati qui: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- radici-mail-through-gpg /

Forse questo può risolvere anche le tue esigenze.


+1 Grazie; anche se probabilmente continuerò con la mia soluzione.
dr jimbob,

Gli script di cui parlavo nel mio post sul blog erano scomparsi dal Web, ma sembra che archive.org abbia copie degli script. Vedi web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… per dettagli
Olivier Berger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.