mutt에서 이메일 메시지 인쇄하기 - 줄 바꿈을 피하는 방법은 무엇입니까?

mutt에서 이메일 메시지 인쇄하기 - 줄 바꿈을 피하는 방법은 무엇입니까?

나는 mutt를 이메일 클라이언트로 사용하고 있으며 최근에 이메일 인쇄 설정을 수정하기로 결정했습니다.

나는 Muttprint에 대해 알고 있지만 그것을 사용하지 않기로 결정했습니다. 나는 다음을 생각해 냈습니다.

에는 다음이 .muttrc있습니다.

set print_command="grep -v X-Spam-Status | $HOME/bin/mutt_print.sh"

~/bin/mutt_print.sh내가 인터넷에서 찾은 내용을 적용한 스크립트는 다음과 같습니다 .

#!/bin/bash

PDIR="$HOME/tmp/mutt_print" 
OPEN_PDF=zathura

# create temp dir if it does not exist
if [ ! -d "$PDIR" ]; then
    mkdir -p "$PDIR" 2>/dev/null
    if [ $? -ne 0 ]; then
        echo "Unable to make directory '$PDIR'" 1>&2
        exit 2
    fi
fi

infile="`mktemp $PDIR/mutt_XXXXXXXX.txt`"
tmpfile="`mktemp $PDIR/mutt_XXXXXXXX.ps`"
outfile="`mktemp $PDIR/mutt_XXXXXXXX.pdf`"

echo "infile = $infile"
echo "tmpfile = $tmpfile"
echo "outfile = $outfile"

while read line
do
  echo "$line" >> $infile
done < "${1:-/dev/stdin}"

echo "running vim $infile -c \"hardcopy > $outfile | q\""
vim $infile -c "hardcopy > $tmpfile | q"
echo "running ps2pdf $tmpfile $outfile"
ps2pdf $tmpfile $outfile

read
$OPEN_PDF $outfile >/dev/null 2>&1 &
sleep 1
rm $infile $tmpfile $outfile

따라서 메시지를 인쇄하기로 결정하면 Mutt가 Zathura로 메시지를 열고 인쇄하거나 PDF를 저장할 수 있습니다. 이것이 제가 원하는 설정입니다.

그러나 줄을 grep제거했지만 X-Spam-Status항상 작동하는 것은 아닙니다. 때로는 유사한 줄이 인쇄 명령으로 전송되기 전에 깨진 것처럼 보이고 그 일부가 PDF에 표시됩니다.

Date: Wed, 11 May 2016 21:17:14 −0300
From: John Doe <[email protected]>
To: my-email@here
Subject: Re: blah
tests=FREEMAIL_FROM,HTML_MESSAGE,RDNS_NONE,T_DKIM_INVALID

X-Spam-Status원본 메시지의 줄은 다음과 같습니다 .

X-Spam-Status: No, hits=2.4 required=8.0 tests=FREEMAIL_FROM,HTML_MESSAGE,RDNS_NONE,T_DKIM_INVALID

required=8.0와 사이가 깨졌습니다 tests....

그렇다면 어떻게 하면 그 선이 깨지는 것을 피할 수 있을까요?

(스크립트 개선에 대한 제안도 환영합니다)

답변1

X-Spam-Status해당 줄은 여러 줄에 걸쳐 있는 '연속' RFC822 헤더인 것 같습니다 .

헤더는 줄의 첫 번째 문자에서 공백이 아닌 문자로 시작됩니다. 시작 부분에 공백이 있는 비어 있지 않은 줄은 이전 줄의 연속이며, 빈 줄은 헤더를 끝냅니다.

특정 헤더를 필터링하려면 grep. 아마도 perl또는 awk것.

당신은 그것에 대해 뭔가를 할 수도 있습니다

while read line
do
  echo "$line" >> $infile
done < "${1:-/dev/stdin}"

a로 시작하는 줄을 에코하지 않고 X-Spam-Status(플래그를 설정한 후) 새 헤더에 도달할 때까지(그리고 플래그를 지울 때까지) '계속' 줄을 건너뛰는 것과 같습니다.

어느 쪽이든 RFC822 헤더의 형식을 프로그램에서 인식해야 합니다.

어쩌면 당신이 인쇄물에서 해당 헤더를 그렇게 중요하게 생각하는지 스스로에게 물어봐야 할 수도 있습니다.

그래도 필터는 그렇게 어렵지 않아요

#!/user/bin/perl

my $skip=0;

# First do the headers
while(<STDIN>)
{
        #Test for end of headers
        if(/^\s*$/)
        {
                #copy the header ending blank
                printf $_;

                #exit the while loop
                last;
        }

        #Starts with non whitespace, new header
        $skip = 0 if /^\S/;

        #skip stuff if its the header we don't want
        $skip = 1 if /^X-Spam-Status/i;

        #copy lines if we're not skipping
        print $_ if !$skip;
}

# now the rest of the file
while(<STDIN>)
{
        #copy lines
        print $_;
}

답변2

@infixed가 말했듯이 X-Spam-Status 헤더는 여러 줄에 걸쳐 계속됩니다.

설치한 경우 해당 유틸리티를 사용하여 연속 헤더를 연결할 procmail수 있습니다.formail

에서 man formail:

-c 헤더의 연속 필드를 연결합니다. 표준(라인 지향) 텍스트 유틸리티를 사용하여 메일을 후처리할 때 편리할 수 있습니다.

예를 들어:

set print_command="formail -c | grep -v X-Spam-Status: | $HOME/bin/mutt_print.sh"

formail -I더 좋은 점은 다음을 사용하지 않고도 헤더를 제거 할 수 있다는 것입니다 grep -v.

set print_command="formail -I X-Spam-Status | $HOME/bin/mutt_print.sh"

-I 헤더 필드

기존의 유사한 필드가 단순히 제거된다는 점을 제외하면 -i와 동일합니다. headerfield가 field-name으로만 구성된 경우 해당 필드를 효과적으로 삭제합니다.


RE: 스크립트 개선:

  1. vim을 사용하는 이유(그리고하드카피) 도구가 존재하는 경우 a2ps는 언제 enscript입니까?

    두 가지 모두 텍스트 서식과 포스트스크립트 출력에 유용한 모든 종류의 옵션을 제공합니다.

  2. 표준 입력을 파일에 저장하는 데 while read line...사용할 수 있는데 왜 느린 루프가 발생합니까?cat ${1:--} > "$infile"

  3. 변수를 사용할 때는 항상 큰따옴표로 묶어야 합니다. 예를 들어 을 사용하지 말고 대신 $infile사용하세요 "$infile".

  4. 백틱 대신 $(...)를 사용하십시오.

  5. 스크립트는 bash 특정 기능을 사용하지 않으므로 사용하십시오 #!/bin/sh(또는 이미 #!/bin/dash설치되어 있는 경우).

  6. 를 사용하는 경우 mkdir -p디렉터리가 이미 존재하는지 테스트할 필요가 없습니다. mkdir -p이미 당신을 위해 그렇게 하고 있습니다.

  7. gjots2lpr~로부터gjots2패키지는 스크립트가 수행하는 작업의 대부분 또는 전부를 수행하는 것 같습니다.

    스크립트는 gjots2lpr기본값을 재정의하는 데 사용하는 환경 변수를 설정하는 간단한 래퍼로 대체될 수 있습니다(예: a2ps또는 를 사용할지 여부 enscript, 사용할 ps/pdf 뷰어, 사용할 인쇄 명령 등).

    에서 gjots2lpr -h:

사용법: gjots2lpr [-pt ] [ 파일 이름 ... ]

가능한 경우 포스트스크립트나 PDF를 사용하고 사용 가능한 미리 보기 및 프린터 대화 상자를 사용하여 텍스트 파일을 인쇄합니다. 시스템에서 찾을 수 있는 모든 유틸리티를 찾아 사용합니다.

'filename'이 제공되지 않으면 STDIN이 인쇄됩니다.

관련 정보