Получать электронную почту Pop / IMAP, а затем пересылать ее в зашифрованном виде в gmail

8

По сути, у меня есть учетная запись электронной почты, к которой я могу получить доступ как POP3 или IMAP. Я хочу принять все входящие электронные письма, зашифровать их, а затем переслать зашифрованную версию в мою учетную запись gmail (чтобы я мог видеть тему / уведомления в моей учетной записи телефона / gmail; и, возможно, расшифровать сообщение парольной фразой - хотя это последнее шаг не должен быть реализован изначально).

Я, вероятно, мог бы написать скрипт Python для этого, но использование подходящих инструментов linux кажется лучшим путем. У меня уже есть постфикс (в конфигурации спутника) для отправки исходящей почты.

Какой самый простой способ прочитать POP3 / IMAP на компьютере с Linux и заставить его gpg зашифровать тело письма и вложения (не заголовки темы) с помощью моего открытого ключа и переслать его в мой gmail acct?

(Для справки: это противоречит политике работы (частично в соответствии с законодательством США HIPAA), чтобы я отправлял незашифрованные версии моей электронной почты на мой телефон, поскольку есть вероятность того, что кто-то намеренно (или непреднамеренно) отправит защищенные данные по электронной почте на мой телефон. Работа считает GPG безопасным.)

доктор джимбоб
источник
j3e.de/pgp-mime-encrypt-in-procmail.html предлагает решение с использованием procmail / formail
Оливье Бергер,

Ответы:

3

Я только видел другой ответ и думаю, что никогда не писал решения, которое я на самом деле реализовал. Оказывается, что python imaplib прост, и я написал очень быстрый скрипт. Запрет на внесение нескольких изменений (например, анонимизация различных имен пользователей, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Я также не просто отправляю в зашифрованном виде это; но предварительно добавьте тему с именем пользователя отправителя и поместите некоторые заголовки перед GPG (на случай, если я читаю это на своем телефоне и не могу расшифровать).

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

Затем я добавил следующие строки в свой crontab (приведенный выше скрипт с именем mail.py внутри каталога с именем mail), поэтому он будет запускаться каждые 5 минут в обычное время в будние дни (MF 8-7pm) и реже в другие часы. , (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

Fetchmail!

http://www.fetchmail.info/

RJP
источник
1
Не могли бы вы включить какое-то объяснение того, как настроить fetchmail для всего этого?
Майкл Мрозек
Я не думаю, что это помогло бы. Кажется, что получать и пересылать почту достаточно легко, но я не понимаю, как бы я вставил шаг шифрования GPG перед пересылкой. Пожалуйста, поправьте меня, если я ошибаюсь.
Доктор Джимбоб
Привет, доктор Джимбоб, я предположил, что, как только вы получите почту локально, вы будете использовать вашу установку postfix, чтобы передать / перехватить ее через gpg и переслать результат. Ваш скрипт делает свое дело, но в своем вопросе вы упомянули о желании использовать инструменты, найденные в Linux. Рад, что вы решили это!
RJP
1

У меня была необходимость пересылать почту root в зашифрованном виде, и я подытожил свои выводы здесь: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- корни почта сквозной-GPG /

Может быть, это может решить ваши потребности тоже.

Оливье Бергер
источник
+1 Спасибо; хотя я, вероятно, просто продолжу свое решение.
Доктор Джимбоб
Сценарии, о которых я упоминал в своем блоге, исчезли из Интернета, но, похоже, на archive.org есть копии этих сценариев. См. Web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… для подробностей
Оливье Бергер,