2012-05-24 4 views
1

procmail 제조법을 수행 할 때 몇 가지 문제가 발생했습니다. 내가 얻을 관리가footer를 제거하는 procmail 제조법

+96szV6aBDlD/F7vuiK8fUYVknMQPfPmPNikB+fdYLvbwsv9duz6HQaDuwhGn6dh9w2U 
    1sABcykpdyfWqWhLt5RzCqppYr5I4yCmB1CNOKwhlzI/w8Sx1QTzGT32G/ERTlbr91BM VmNQ== 
    MIME-Version: 1.0 
    Received: by 10.52.97.41 with SMTP id dx9mr14500007vdb.89.1337845760664; Thu, 
    24 May 2012 00:49:20 -0700 (PDT) 
    Received: by 10.52.34.75 with HTTP; Thu, 24 May 2012 00:49:20 -0700 (PDT) 
    Date: Thu, 24 May 2012 15:49:20 +0800 
    Message-ID: <[email protected]om> 
    Subject: 60136379500 
    From: my email <my [email protected]> 
    To: your email <your [email protected]> 
    Content-Type: multipart/alternative; boundary=20cf307f380654240604c0c37d07 

    --20cf307f380654240604c0c37d07 
    Content-Type: text/plain; charset=ISO-8859-1 

    hi 
    there 
    how 
    are 
    you 

    --20cf307f380654240604c0c37d07 
    +96szV6aBDlD/F7vuiK8fUYVknMQPfPmPNikB+fdYLvbwsv9duz6HQaDuwhGn6dh9w2U 
    1sABcykpdyfWqWhLt5RzCqppYr5I4yCmB1CNOKwhlzI/w8Sx1QTzGT32G/ERTlbr91BM VmNQ== 

다음 email.It의 몸을 읽는 프록이 같은 출력을 보여줍니다 때

:0 
    * ^X-Loop: [email protected]\.com 
    /dev/null 

    :0 

    # filtering email by number 60 
    * ^Subject:.*(60) 
    { 
     :0c: 
     ${DEFAULT} 

     #trying to take out input from the body 
     :0fb 
     | head -10 

     #Forward it to the other folder 
     :0 
     mytest/ 
     } 

이 문제가 발생합니다 지금까지 얻을 무엇을 여기

송신자가 3 줄 미만의 메일을 보내면 출력은 작동하지 않습니다. 메일의 머리말이 인쇄되기 때문에 머리말의 범위가 -10이기 때문에 출력하지 않습니다.

이메일 본문 만 procmail에서 필터링 (텍스트 파일로 출력)하고 싶습니다. 누구나 나를 보여줄 수 있습니까? 내 순발력이 있습니다. 감사합니다.

+0

귀하의 예를 들어 메시지가 malformatted 보인다 : – tripleee

답변

1

MIME 멀티 파트를 텍스트의 덩어리로 취급하는 것은 위험합니다. 본문을 제대로 처리하려면 MIME 인식 도구를 사용해야합니다. 그러나 첫 번째 부분이 텍스트 부분이고 다른 모든 부분을 삭제한다고 가정하고 싶다면 상당히 간단하고 강력한 것을 만들 수 있습니다.

# Truncate everything after first body part: 
# Change second occurrence of --$MATCH to --$MATCH-- 
# and trim anything after it 
:0fb 
* ^Content-type: multipart/[a-z]+; boundary="\/[^"]+ 
| sed -e "1,/^--$MATCH$/b" -e "/^--$MATCH$/!b" -e 's//&--/' -eq 

우아함 포인트의 경우, 같은 시간에 당신의 10 라인 신체 절단 액션을 구현하는 스크립트를 개발할 수있을 수도 있지만, 적어도,이 희망은 시작한다. (나는이 시점에서 awk 또는 Perl로 전환 할 것입니다.)

:0fb 
* ^Content-type: multipart/[a-z]+; boundary="\/[^"]+ 
| awk -v "b=--$MATCH" ' \ 
    ($0 == b || $0 == b "--") && seen++ { printf "%s--\n", $0; exit } \ 
    !seen || p++ < 10' 

제대로, MIME 부분의 헤더는 라인 카운트에 포함되지해야합니다.

이것은 약간의 추측입니다. "footer"는 첫 번째 본문 부분 다음에 Base64로 인코딩 된 첨부 파일을 의미합니다. 물론이 방법은 단일 부분 메시지에 대해서는 아무 것도하지 않습니다. 어쩌면 당신은 원래 조리법으로 돌아가고 싶을 것입니다. 일반적인 형태의 ....

sed -n '/begin/,/end/ { /begin/b; /end/b; p }' 

-n:   --> turn printing off 
/begin/  --> begin of pattern range (remainder commands only apply inside range) 
,/end/  --> , end of sed pattern range 
{ /begin/b; --> /b branch causes lines with pattern /begin/ to skip remaining commands 
/end/b;  --> (same as above), these lines will skip the upcoming (p)rint command 
p }'  --> prints lines that in pattern that made it to this command 
+0

다른 방법으로 실행하려고합니다.이 명령을 사용합니다. : 0 fwb | formail -I ""이것은 MIME의 모든 상단을 삭제하므로 훨씬 더 멋지게 보입니다. 유일한 방법은 제거 또는 제거하는 방법입니다. "Content-Type" –

0

최근 ...

#trying to take out input from the body 
:0fb 
| sed -n '/^Content-Type/,/^--/ { /^Content-Type/b; /^--/b; p }' 

설명을 비슷한 문제를 가지고이 (OP에 적응)와 그것을 해결. 맨 위에있는 base64는 본문의 첨부 파일 사본입니다. 그것은 거의 정확하지 않습니까? 그리고 첨부 파일의 MIME 헤더가 누락되어 base64도 가볍게 도살되었습니다.