Reciba correo electrónico Pop / IMAP y luego reenvíe como cifrado a gmail


8

Básicamente, tengo una cuenta de correo electrónico a la que puedo acceder como POP3 o IMAP. Quiero tomar todos los correos electrónicos entrantes, encriptarlos y luego reenviar la versión encriptada a mi cuenta de gmail (para que pueda ver el asunto / notificaciones en mi teléfono / cuenta de gmail; y posiblemente descifrar el mensaje con una frase de contraseña, aunque esta última el paso no necesita ser implementado inicialmente).

Probablemente podría escribir un script de Python para hacer esto, pero usar las herramientas de Linux adecuadas parece una mejor ruta. Tengo postfix (en una configuración satelital) ya configurado para enviar correo saliente.

¿Cuál es la forma más fácil de leer POP3 / IMAP en una caja de Linux y hacer que gpg cifre el cuerpo y los archivos adjuntos del correo electrónico (no los encabezados de asunto) con mi clave pública y lo reenvíe a mi cuenta de Gmail?

(Para el registro; está en contra de la política del trabajo (en parte por el cumplimiento de la ley HIPAA de EE. UU.) Que envíe versiones sin cifrar de mi correo electrónico a mi teléfono; ya que existe la posibilidad de que alguien envíe datos protegidos por correo electrónico de manera deliberada (o inadvertida). El trabajo considera que GPG es seguro).


j3e.de/pgp-mime-encrypt-in-procmail.html sugiere una solución usando procmail / formail
Olivier Berger

Respuestas:


3

Acabo de ver la otra respuesta y supongo que nunca escribí la solución que realmente implementé. Resulta que python imaplib es sencillo y escribí un script muy rápido. Salvo algunos cambios (por ejemplo, anonimizar mis diversos USERNAME, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Tampoco solo envío cifrado; pero anteponga el asunto con el nombre de usuario del remitente y coloque algunas de las cabeceras antes del GPG (en caso de que lo esté leyendo en mi teléfono y no pueda descifrarlo).

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

Luego agregué las siguientes líneas a mi crontab (el script anterior se llama mail.py dentro de un directorio llamado mail), por lo que se ejecutará cada 5 minutos durante las horas normales de lunes a viernes (MF 8-7pm) y con menos frecuencia en otras 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

1

1
¿Podría incluir algún tipo de explicación sobre cómo configurar fetchmail para hacer todo esto?
Michael Mrozek

No creo que esto hubiera funcionado. Parece obtener y reenviar el correo fácilmente, pero no veo cómo insertaría el paso de cifrado GPG antes de reenviarlo. Por favor corrígeme si estoy equivocado.
dr jimbob

Hola Dr. Jimbob, supuse que una vez que tuviera el correo localmente, usaría su instalación de postfix para canalizarlo / conectarlo a través de GPG y reenviar el resultado. Su script hace el truco, pero en su pregunta mencionó querer usar las herramientas que se encuentran en Linux. ¡Me alegro de que lo hayas resuelto!
rjp

1

También tuve la necesidad de reenviar el correo de root encriptado y resumí mis hallazgos aquí: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- root-mail-through-gpg /

Quizás esto también pueda resolver tus necesidades.


+1 gracias; aunque probablemente continuaré con mi solución.
dr jimbob

Los guiones que estaba mencionando en mi blog habían desaparecido de la Web, pero parece que archive.org tiene copias de los guiones. Ver web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… para más detalles
Olivier Berger,
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.