Nhận email Pop / IMAP và sau đó chuyển tiếp dưới dạng mã hóa sang gmail


8

Về cơ bản, tôi có một tài khoản email mà tôi có thể truy cập dưới dạng POP3 hoặc IMAP. Tôi muốn nhận tất cả các email đến, mã hóa chúng và sau đó chuyển tiếp phiên bản được mã hóa vào tài khoản gmail của mình (để tôi có thể thấy chủ đề / thông báo trên tài khoản điện thoại / gmail của mình và có thể giải mã tin nhắn bằng cụm mật khẩu - mặc dù điều này cuối cùng bước không cần phải được thực hiện ban đầu).

Tôi có thể có thể viết một kịch bản python để làm điều này, nhưng sử dụng các công cụ linux thích hợp có vẻ như là một tuyến đường tốt hơn. Tôi có postfix (trong cấu hình satelite) đã được thiết lập để gửi thư đi.

Cách dễ nhất để đọc POP3 / IMAP trên hộp linux và lấy nó để gpg mã hóa phần thân và tệp đính kèm của email (không phải tiêu đề chủ đề) bằng khóa chung của tôi và chuyển tiếp tới acct gmail của tôi?

(Đối với hồ sơ; chính sách chống lại công việc (một phần vì tuân thủ luật HIPAA của Hoa Kỳ) để tôi gửi các phiên bản email không được mã hóa của mình tới điện thoại của mình; vì có khả năng ai đó cố tình (hoặc vô tình) gửi email dữ liệu được bảo vệ vào điện thoại của tôi. Công việc coi GPG là an toàn.)


j3e.de/pgp-mime-encrypt-in-procmail.html đề xuất giải pháp sử dụng procmail / formail
Olivier Berger

Câu trả lời:


3

Tôi chỉ thấy phản hồi khác và đoán rằng tôi chưa bao giờ viết ra giải pháp tôi thực hiện. Hóa ra python imaplib rất đơn giản và tôi đã viết một kịch bản rất nhanh. Chặn một vài thay đổi (ví dụ: ẩn danh các USERNAME khác nhau của tôi, EMAILPASSWORD, WORKDOMAINNAME, MYGPGKEYID). Tôi cũng không chỉ gửi mã hóa nó; nhưng hãy thêm chủ đề với tên người dùng của người gửi và đặt một số nội dung tiêu đề trước GPG (trong trường hợp tôi đang đọc nó trên điện thoại của mình và không thể giải mã được).

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

Sau đó, tôi đã thêm các dòng sau vào crontab của mình (tập lệnh ở trên được đặt tên là mail.py trong thư mục có tên là mail), do đó, nó sẽ chạy cứ sau 5 phút vào các giờ bình thường vào các ngày trong tuần (MF 8-7pm) và ít thường xuyên hơn vào các giờ khác . (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
Bạn có thể bao gồm một số loại giải thích về cách thiết lập fetchmail để làm tất cả điều này?
Michael Mrozek

Tôi không nghĩ rằng điều này sẽ thực hiện các mẹo. Dường như nhận và chuyển tiếp thư đủ dễ dàng, nhưng tôi không thấy cách mình sẽ chèn bước mã hóa GPG trước khi chuyển tiếp. Vui long sửa cho tôi nêu tôi sai.
dr jimbob

Xin chào jimbob, tôi giả sử rằng một khi bạn đã gửi thư cục bộ, bạn sẽ sử dụng cài đặt postfix của mình để chuyển / hook qua gpg và chuyển tiếp kết quả. Kịch bản của bạn thực hiện thủ thuật, nhưng trong câu hỏi của bạn, bạn đã đề cập đến việc muốn sử dụng các công cụ được tìm thấy trên linux. Vui mừng bạn đã giải quyết nó!
rjp

1

Tôi cũng có nhu cầu chuyển tiếp thư gốc của mã hóa và đã tóm tắt những phát hiện của tôi ở đây: http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of- rễ-mail-qua-gpg /

Có lẽ điều này có thể giải quyết nhu cầu của bạn quá.


+1 Cảm ơn; mặc dù tôi có lẽ sẽ tiếp tục với giải pháp của tôi
dr jimbob

Các tập lệnh mà tôi đã đề cập trong bài đăng trên blog của tôi đã biến mất khỏi Web, nhưng có vẻ như archive.org có các bản sao của các tập lệnh. Xem web.archive.org/web/20100504140526/http://linux.oregpreshaz.hu/ để biết chi tiết
Olivier Berger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.