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 헤더인 것 같습니다 .

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

특정 헤더를 필터링하려면 .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와 동일합니다. 헤더 필드에 필드 이름만 포함되어 있으면 해당 필드가 효과적으로 제거됩니다.


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~에서조츠 2패키지는 스크립트가 수행하는 작업의 대부분 또는 전부를 수행하는 것 같습니다.

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

    에서 gjots2lpr -h:

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

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

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

관련 정보