Terima email Pop / IMAP dan teruskan sebagai terenkripsi ke gmail

8

Pada dasarnya, saya memiliki akun email yang dapat saya akses sebagai POP3 atau IMAP. Saya ingin mengambil semua email masuk, mengenkripsi mereka, dan kemudian meneruskan versi terenkripsi ke akun gmail saya (sehingga saya dapat melihat subjek / pemberitahuan di ponsel / akun gmail saya, dan mungkin mendekripsi pesan dengan kata sandi - meskipun ini terakhir langkah awalnya tidak perlu diimplementasikan).

Saya mungkin bisa menulis skrip python untuk melakukan ini, tetapi menggunakan alat linux yang tepat sepertinya rute yang lebih baik. Saya memiliki postfix (dalam konfigurasi satelite) yang sudah diatur untuk mengirim surat keluar.

Apa cara termudah untuk membaca POP3 / IMAP pada kotak linux dan mendapatkannya untuk gpg mengenkripsi tubuh dan lampiran email (bukan header subjek) dengan kunci publik saya, dan meneruskannya ke acc saya gmail?

(Sebagai catatan; ini bertentangan dengan kebijakan kerja (sebagian untuk kepatuhan terhadap hukum HIPAA AS) bagi saya untuk mengirim versi email saya yang tidak terenkripsi ke telepon saya; karena ada potensi bagi seseorang untuk sengaja (atau tidak sengaja) mengirim data yang dilindungi email ke telepon saya. Pekerjaan menganggap GPG aman.)

dr jimbob
sumber
j3e.de/pgp-mime-encrypt-in-procmail.html menyarankan solusi menggunakan procmail / formail
Olivier Berger

Jawaban:

3

Saya hanya melihat jawaban yang lain dan saya kira saya tidak pernah menulis solusi yang saya implementasikan. Ternyata python imaplib sangat mudah dan saya menulis skrip yang sangat cepat. Cegah beberapa perubahan (misalnya, menganonimkan berbagai USERNAME saya, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Saya juga tidak hanya mengirimnya terenkripsi; tapi tambahkan subjek dengan nama pengguna pengirim dan letakkan beberapa item header sebelum GPG (kalau-kalau saya membacanya di ponsel saya dan tidak dapat mendekripsi).

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

Saya kemudian menambahkan baris-baris berikut ke crontab saya (skrip di atas bernama mail.py di dalam direktori yang disebut mail), jadi itu akan berjalan setiap 5 menit selama jam normal di hari kerja (MF 8-7 malam) dan lebih jarang di jam lain . (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
sumber
1

Fetchmail!

http://www.fetchmail.info/

rjp
sumber
1
Bisakah Anda memasukkan semacam penjelasan tentang cara mengatur fetchmail untuk melakukan semua ini?
Michael Mrozek
Saya tidak berpikir ini akan berhasil. Tampaknya mendapatkan dan meneruskan surat cukup mudah, tetapi saya tidak melihat bagaimana saya akan memasukkan langkah enkripsi GPG sebelum meneruskan. Harap perbaiki saya jika saya salah.
dr jimbob
Hai dr jimbob, saya berasumsi bahwa begitu Anda memiliki surat secara lokal, Anda akan menggunakan instalasi postfix Anda untuk menyalurkan / menghubungkannya melalui gpg dan meneruskan hasilnya. Script Anda melakukan trik, tetapi dalam pertanyaan Anda Anda menyebutkan ingin menggunakan alat yang ditemukan di linux. Senang Anda menyelesaikannya!
rjp
1

Saya memiliki kebutuhan untuk meneruskan surat root yang dienkripsi juga, dan merangkum temuan saya di sini: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- root-mail-through-gpg /

Mungkin ini bisa menyelesaikan kebutuhan Anda juga.

Olivier Berger
sumber
+1 Terima kasih; meskipun saya mungkin hanya akan melanjutkan dengan solusi saya.
dr jimbob
Skrip yang saya sebutkan di posting blog saya telah menghilang dari Web, tetapi tampaknya archive.org memiliki salinan skrip. Lihat web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/… untuk detailnya
Olivier Berger