Recevoir des e-mails Pop / IMAP, puis les transférer sous forme cryptée vers Gmail

8

Fondamentalement, j'ai un compte de messagerie auquel je peux accéder en tant que POP3 ou IMAP. Je veux prendre tous les e-mails entrants, les chiffrer, puis transférer la version chiffrée vers mon compte gmail (afin que je puisse voir le sujet / les notifications sur mon téléphone / compte gmail; et éventuellement déchiffrer le message avec une phrase de passe - bien que cette dernière étape n'a pas besoin d'être implémentée initialement).

Je pourrais probablement écrire un script python pour ce faire, mais utiliser les bons outils Linux semble être une meilleure voie. J'ai postfixé (dans une configuration satellite) déjà configuré pour envoyer du courrier sortant.

Quelle est la façon la plus simple de lire POP3 / IMAP sur une boîte Linux et de le faire chiffrer par gpg le corps et les pièces jointes de l'e-mail (pas les en-têtes de sujet) avec ma clé publique et le transmettre à mon compte gmail?

(Pour mémoire; c'est contre la politique de travail (en partie pour se conformer à la loi américaine HIPAA) pour moi d'envoyer des versions non cryptées de mon courrier électronique à mon téléphone; car il est possible que quelqu'un envoie délibérément (ou par inadvertance) des données protégées par courrier électronique à mon téléphone. Le travail considère que GPG est sécurisé.)

dr jimbob
la source
j3e.de/pgp-mime-encrypt-in-procmail.html suggère une solution utilisant procmail / formail
Olivier Berger

Réponses:

3

Je viens de voir l'autre réponse et je suppose que je n'ai jamais rédigé la solution que j'ai réellement mise en œuvre. Il s'avère que python imaplib est simple et j'ai écrit un script très rapide. Sauf quelques modifications (par exemple, anonymisation de mes différents NOM D'UTILISATEUR, MOT DE PASSE EMAIL, NOM DE TRAVAIL, MYGPGKEYID). Je ne l'envoie pas seulement crypté; mais ajoutez le sujet avec le nom d'utilisateur de l'expéditeur et placez une partie de l'en-tête avant le GPG (au cas où je le lirais sur mon téléphone et ne peux pas déchiffrer).

#!/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()

J'ai ensuite ajouté les lignes suivantes à ma crontab (le script ci-dessus est nommé mail.py dans un répertoire appelé mail), il s'exécutera donc toutes les 5 minutes pendant les heures normales de la semaine (MF 20h-19h) et moins fréquemment à d'autres heures. . (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
la source
1

Fetchmail!

http://www.fetchmail.info/

rjp
la source
1
Pourriez-vous inclure une sorte d'explication sur la façon de configurer fetchmail pour faire tout cela?
Michael Mrozek
Je ne pense pas que cela aurait fait l'affaire. Il semble obtenir et transférer du courrier assez facilement, mais je ne vois pas comment j'insérerais l'étape de chiffrement GPG avant de le transférer. Corrigez-moi si j'ai tort, s'il-vous plait.
dr jimbob
Hé dr jimbob, j'ai supposé qu'une fois que vous aviez le courrier localement, vous utiliseriez votre installation postfix pour le canaliser / le raccorder via gpg et transmettre le résultat. Votre script fait l'affaire, mais dans votre question, vous avez mentionné vouloir utiliser des outils trouvés sur linux. Heureux que vous l'ayez résolu!
rjp
1

J'ai également eu besoin de transmettre le courrier de root crypté, et j'ai résumé mes conclusions ici: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- racines-mail-par-gpg /

Peut-être que cela peut également répondre à vos besoins.

Olivier Berger
la source
+1 Merci; mais je vais probablement continuer avec ma solution.
dr jimbob
Les scripts que je mentionnais dans mon article de blog avaient disparu du Web, mais il semble que archive.org ait des copies des scripts. Voir web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… pour plus de détails
Olivier Berger