2012-05-24 2 views
1

Я столкнулся с некоторыми проблемами при выполнении рецепта procmail.procmail рецепт для удаления нижнего колонтитула

Вот то, что я так далеко:

: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/ 
     } 

Проблема происходит, когда Procmail читает тело email.it покажет выход так:

+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== 

меня удалось получить выход, но он не работает, если отправитель отправляет меньше 3 строк, так как на выходе будет выводиться нижний колонтитул электронной почты (потому что он находится между диапазоном головки -10).

Я хочу, чтобы тело письма было фильтром (распечатано в текстовом файле) в procmail. Возможно ли это, кто-нибудь может показать мне путь? Я нахожусь в своем уме. Спасибо

+0

Ваш пример выглядит сообщение malformatted. Основание64 наверху - это копия прикрепления тела; это вряд ли правильно? И заголовки MIME вложений отсутствуют, а base64 также мягко убит. – tripleee

ответ

1

Попытка рассматривать MIME multipart как просто кусок текста чревата опасностью. Чтобы правильно обработать тело, вы должны использовать инструмент 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' 

Правильно, заголовки мим Пярта не должно засчитываться число строк.

Это немного умозрительно; Я предполагаю, что под «нижним колонтитулом» вы подразумеваете уродливое базовое кодированное вложение после первой части тела, и, конечно, этот рецепт ничего не будет делать для сообщений с одной частью. Возможно, вы хотите вернуться к своему оригинальному рецепту для них.

+0

Я пытаюсь запустить другой путь. Я использую эту команду ': 0 fwb | formail -I" "' это кажется намного более приятным, так как это удалит все верхние в MIME. Единственное, что сейчас происходит, это удаление или извлеките «Content-Type» –

0

Недавно была аналогичная проблема, и решить ее с этим (адаптировано к OP) ...

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

Пояснения: в общем виде ....

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 
Смежные вопросы