Pop/IMAP 이메일을 수신하고 암호화하여 Gmail로 전달

Pop/IMAP 이메일을 수신하고 암호화하여 Gmail로 전달

기본적으로 POP3 또는 IMAP을 통해 액세스할 수 있는 이메일 계정이 있습니다. 수신 이메일을 모두 받아 암호화한 다음 암호화된 버전을 내 Gmail 계정으로 전달하고 싶습니다(그래서 내 휴대전화/Gmail 계정에서 주제/알림을 볼 수 있고 암호문을 사용하여 메일을 해독할 수도 있음). 처음에 구현할 필요는 없습니다).

이를 위해 Python 스크립트를 작성할 수도 있지만 적절한 Linux 도구를 사용하는 것이 더 나은 방법인 것 같습니다. 보내는 메일을 보내기 위해 postfix(위성 구성)를 설정했습니다.

Linux 시스템에서 POP3/IMAP을 읽고 gpg가 내 공개 키를 사용하여 이메일의 본문과 첨부 파일(제목 헤더 아님)을 암호화하여 내 Gmail 계정으로 전달하도록 하는 가장 쉬운 방법은 무엇입니까?

(참고로 제가 암호화되지 않은 버전의 이메일을 내 휴대폰으로 보내는 것은 업무 정책(일부 미국 HIPAA 법률 준수)에 위배됩니다. 누군가가 의도적으로(또는 실수로) 보호된 데이터를 이메일로 보낼 가능성이 있기 때문입니다. 내 전화는 GPG가 안전하다고 생각합니다).

답변1

방금 다른 답변을 보았는데 제가 실제로 구현한 솔루션에 대해 쓴 적이 없는 것 같습니다. Python imaplib는 쉽고 매우 빠른 스크립트를 작성했다는 것이 밝혀졌습니다. 일부 변경이 이루어지지 않는 한(예: 다양한 사용자 이름, 이메일 비밀번호, 업무 도메인 이름, 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', ['[email protected]', '-s', subject])
        shlf[num] = datetime.now()


M.close()
M.logout()

그런 다음 내 crontab에 다음 행을 추가했습니다(위 스크립트는 mail이라는 디렉토리에 mail.py라고 함). 이는 일반적인 주중 시간(월요일~금요일 오후 8시~오후 7시) 동안 5분마다 실행되고 다른 시간에는 덜 자주 실행됩니다. 타임스. (크론탭 -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

답변2

메일을 받으세요!

http://www.fetchmail.info/

답변3

또한 암호화된 루트 메일을 전달해야 하며 여기에 결과를 요약했습니다.http://www-public.it-sudparis.eu/~berger_o/weblog/2006/01/20/secure-forwarding-of-roots-mail-through-gpg/

아마도 이것이 귀하의 요구 사항도 해결해 줄 것입니다.

관련 정보