Empfangen Sie Pop / IMAP-E-Mails und leiten Sie sie verschlüsselt an Google Mail weiter

8

Grundsätzlich habe ich ein E-Mail-Konto, auf das ich als POP3 oder IMAP zugreifen kann. Ich möchte alle eingehenden E-Mails entgegennehmen, verschlüsseln und dann die verschlüsselte Version an mein Google Mail-Konto weiterleiten (damit ich den Betreff / die Benachrichtigungen auf meinem Telefon- / Google Mail-Konto sehen und die Nachricht möglicherweise mit einer Passphrase entschlüsseln kann - obwohl dies die letzte ist Schritt muss zunächst nicht implementiert werden).

Ich könnte wahrscheinlich ein Python-Skript schreiben, um dies zu tun, aber die Verwendung der richtigen Linux-Tools scheint eine bessere Route zu sein. Ich habe bereits ein Postfix (in einer Satellitenkonfiguration) eingerichtet, um ausgehende E-Mails zu senden.

Was ist der einfachste Weg, um POP3 / IMAP auf einer Linux-Box zu lesen und es dazu zu bringen, den Text und die Anhänge der E-Mail (keine Betreff-Header) mit meinem öffentlichen Schlüssel zu verschlüsseln und an mein Google Mail-Konto weiterzuleiten?

(Für die Aufzeichnung; es verstößt gegen die Arbeitsrichtlinie (teilweise aus Gründen der Einhaltung des US-amerikanischen HIPAA-Gesetzes), unverschlüsselte Versionen meiner E-Mail an mein Telefon zu senden, da möglicherweise jemand absichtlich (oder versehentlich) geschützte Daten per E-Mail an mein Telefon sendet. Die Arbeit betrachtet GPG als sicher.)

Dr. Jimbob
quelle
j3e.de/pgp-mime-encrypt-in-procmail.html schlägt eine Lösung mit procmail / formail vor
Olivier Berger

Antworten:

3

Ich habe gerade die andere Antwort gesehen und schätze, ich habe die Lösung, die ich tatsächlich implementiert habe, nie geschrieben. Es stellt sich heraus, dass Python Imaplib unkompliziert ist und ich ein sehr schnelles Skript geschrieben habe. Abgesehen von einigen Änderungen (z. B. Anonymisierung meiner verschiedenen USERNAMEs, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Ich sende es auch nicht nur verschlüsselt; Stellen Sie dem Betreff jedoch den Benutzernamen des Absenders voran und stellen Sie einige der Header vor das GPG (falls ich es auf meinem Telefon lese und nicht entschlüsseln kann).

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

Ich habe dann die folgenden Zeilen zu meiner Crontab hinzugefügt (das obige Skript heißt mail.py in einem Verzeichnis namens mail), sodass es an Wochentagen (MF 20-19 Uhr) alle 5 Minuten während der normalen Stunden und zu anderen Zeiten weniger häufig ausgeführt wird . (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
quelle
1

Die Post holen!

http://www.fetchmail.info/

rjp
quelle
1
Könnten Sie eine Erklärung hinzufügen, wie Sie fetchmail einrichten, um all dies zu tun?
Michael Mrozek
Ich glaube nicht, dass dies den Trick getan hätte. Es scheint leicht genug zu sein, E-Mails zu erhalten und weiterzuleiten, aber ich sehe nicht, wie ich den GPG-Verschlüsselungsschritt vor dem Weiterleiten einfügen würde. Bitte korrigieren Sie mich, wenn ich falsch liege.
Dr. Jimbob
Hey Dr. Jimbob, ich ging davon aus, dass Sie, sobald Sie die Mail lokal hatten, Ihre Postfix-Installation verwenden würden, um sie durch gpg zu leiten und das Ergebnis weiterzuleiten. Ihr Skript macht den Trick, aber in Ihrer Frage haben Sie erwähnt, dass Sie Tools verwenden möchten, die unter Linux verfügbar sind. Ich bin froh, dass du es gelöst hast!
rjp
1

Ich musste auch die E-Mails von root verschlüsselt weiterleiten und habe meine Ergebnisse hier zusammengefasst: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- Roots-Mail-Through-GPG /

Vielleicht kann dies auch Ihre Bedürfnisse lösen.

Olivier Berger
quelle
+1 Danke; obwohl ich wahrscheinlich einfach mit meiner Lösung fortfahren werde.
Dr. Jimbob
Die Skripte, die ich in meinem Blogbeitrag erwähnte, waren aus dem Web verschwunden, aber es scheint, dass archive.org Kopien der Skripte hat. Siehe web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… für Details
Olivier Berger