2016-09-19 2 views
0

제목 줄을 기반으로 전자 메일을 읽고 base64 첨부 파일을 가져 오거나 직접 첨부 파일을 가져올 수 있습니까? 서버 : Linux 시스템Linux 명령 줄에서 메일 첨부 파일 읽기

+2

'formail' 프로그램을 살펴보십시오.이 질문은 StackExchange 사이트 [** Super User **] (http://superuser.com/) 또는 [** ServerFault **] (http://serverfault.com/)에서 더 적절할 것입니다 –

+0

가능합니까? 명령 줄 만 사용하고 추가 유틸리티는 사용하지 않으시겠습니까? –

+1

메시지 및 첨부 파일이 uuencoded 방식으로 동일한 파일의 별도 부분으로 포함 된 것을 나는 알고 있습니다. (몇 가지 형식이 있지만). 첨부 파일을 읽고 추출 할 수 있도록 uudecode 할 수있는 무언가가 필요합니다. (당신이 7 비트 ASCII를 읽지 않는다면) 한 줄에 하나의 유틸리티로 문자열을 묶을 수는 있지만 그렇게하기 위해 작성된 유틸리티를 사용하는 것이 더 좋다. –

답변

0

귀하의 질문은 단일 첨부 파일이 있고 안정적으로 추출 할 수 있다고 가정하는 것 같습니다. 일반적인 경우 전자 메일 메시지는 기본적으로 무한대의 첨부 파일을 가질 수 있으며 인코딩은 여러 개의 인코딩 중 하나 일 수 있습니다.

그러나 우리는 당신이 지속적으로 처음 base64로 첨부 항상

case $(formail -zcxSubject: <"$message") in 
    "Hello, here is your report for "*) 
     awk 'BEGIN { h=1 } 
      h { if ($0 ~ /^$/) h=0 ; next } # skip headers 
      /^Content-Disposition: attachment/ { a=1 } # find att 
      a && /^$/ { p=1; next } 
      p && /^$/ { exit } 
      p' "$message" | 
     base64 -d ;; 
esac 
이 추출됩니다

처럼 당신이 원하는 하나, 뭔가 될 것입니다 정적 메시지 템플릿을 사용하는 하나의 송신자를 처리한다고 가정하면 Subject: 헤더를 찾고 glob 패턴과 비교하십시오. 나는 이것이 당신이 "주제에 기반 함"을 의미한다는 것을 기대합니다 - 일치하는 제목 헤더를 찾으면이 메시지를 검사하고 그렇지 않으면 무시합니다.

원시 Awk 스크립트는 base64 데이터를 분리하고 추출을 위해 base64 -d으로 전달하려고 시도합니다. 여기에는 메시지 형식에 대한 성가신 및 다소 미숙 한 가정이 포함되어 있으며 중요한 추가 조정이 필요할 수 있습니다. 간단히 말하면 헤더를 건너 뛰고 첨부 파일을 식별하는 MIME 헤더를 찾고 메시지의 다른 모든 내용을 건너 뛰고 인쇄합니다. 이 헤더가 없거나 잘못된 MIME 부분을 식별하면 결과가 없거나 잘못된 결과가 표시됩니다. 또한 /^Content-Disposition:/ 정규 표현식은 MIME 헤더가 아닌 행에서 이론적으로 일치 할 수 있지만 매우 드뭅니다 (예 : 반송 메시지를보고있는 경우 실제로 발생할 수 있음).

보다 강력한 방법은 MIME 추출 도구 또는 아마도 사용자 지정 스크립트를 사용하여 실제로 MIME 구조를 구문 분석하고 원하는 부분을 추출하는 것입니다. 정확히 무엇이 필요한지에 대한 세부 사항이 없으면 나는 그것을 제공 할 수 없습니다. 위의 스크립트는 단순히 디코드 된 페이로드를 표준 출력에 인쇄합니다.

formail은 RFC2047 인코딩에 대해 전혀 모르고 있으므로 제목이 일반 ASCII가 아닌 경우, 스크립트에서 인코딩 된 양식을 지정해야합니다.

+0

안녕하세요, 원시 Awk 스크립트는 base64 데이터를 분리하고 추출을 위해 base64 -d에 전달하려고 시도합니다. - 어떻게 될지. 보낸 사람, 제목 및 첨부 파일 이름을 추출 할 수 있습니다. base64 데이터 추출에 관심이 있습니다. –

+0

질문을 이해할 수 없습니다. Awk 스크립트가하는 일에 대한 자세한 내용이 필요하거나 더 많거나 다른 기능을 가진 스크립트를 원하십니까? – tripleee

+0

/var/spool/mail/user 파일을 읽고 다른 제목을 기반으로 첨부 파일의 세부 정보를 추출하는 방법을 알고 싶습니다. –

0

Gmail은 해당 프로토콜을 지원하는 모든 클라이언트를 사용하여 전자 메일을 가져올 수있는 IMAP 서비스를 제공합니다. 클라이언트가 디스크에서 사용 가능하게 만드는 방법은 다양 할 수 있습니다.

가장 널리 사용되는 명령 행 IMAP 클라이언트는 fetchmail이어야합니다. 우분투에서 쉽게 설치할 수 있습니다. 그런 다음 gmail과 함께 사용하도록 특정 구성을 설정합니다.

fetchmail에서 한 가지 중요한 점은 원격 서버에서 전자 메일을 가져 와서 로컬 MTA를 통해 파이프하는 것입니다. 따라서이 설치가 작동하려면 로컬로 구성된 MTA가 있어야합니다. MTA는 아마/var/mail/$ USER에 전자 메일을 첨부 할 것이므로이 파일을 읽고 처리 할 수 ​​있습니다.

사용할 수있는 다른 도구는 offlineimap입니다. 나는 그것을 사용하지 않았다. 설정은 fetchmail보다 쉽습니다.

이메일에 포함 된 첨부 파일을 저장하려면 mpack을 설치해야합니다. 그런 다음 각 전자 메일에 대한 .txt 파일에서 munpack 명령을 실행하십시오 (예, 첨부 파일의 모든 횡설수설을 포함하는 명령). 첨부 파일을 디코드하여 개별 파일에 저장합니다 :

$ munpack mail.txt 
Invoice.PDF (application/pdf) 
my-picture.png (image/png)