나는 이메일 클라이언트로 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: 스크립트 개선:
vim을 사용하는 이유(그리고하드 카피
a2ps
) 도구는 언제 좋아하고enscript
존재했습니까?두 가지 모두 텍스트 및 포스트스크립트 출력 형식을 지정하는 데 유용한 다양하고 유용한 옵션을 제공합니다.
while read line...
cat ${1:--} > "$infile"
표준입력을 파일에 저장하는 것만 으로 사용할 수 있는데 왜 루프가 그렇게 느린가요?변수를 사용할 때는 항상 큰따옴표로 묶어야 합니다. 예를 들어 을 사용하지
$infile
말고"$infile"
사용하세요.백틱 대신 $(...)를 사용하세요.
이 스크립트는 bash 관련 기능을 사용하지 않으므로 대신 사용하십시오
#!/bin/sh
(또는#!/bin/dash
이미 설치되어 있는 경우).를 사용하는 경우
mkdir -p
디렉터리가 이미 존재하는지 테스트할 필요가 없습니다.mkdir -p
이미 완료되었습니다.gjots2lpr
~에서조츠 2패키지는 스크립트가 수행하는 작업의 대부분 또는 전부를 수행하는 것 같습니다.스크립트는 기본값을 재정의하는 데 사용되는 환경 변수를 설정하는 간단한 래퍼로 대체될 수 있습니다 (예: OR
gjots2lpr
사용 여부 , 사용할 PS/PDF 뷰어, 사용할 인쇄 명령 등).a2ps
enscript
에서
gjots2lpr -h
:
사용법: gjots2lpr [-pt] [파일 이름...]
텍스트 파일 인쇄 - 가능하다면 사용 가능한 미리 보기 및 프린터 대화 상자가 있는 포스트스크립트나 PDF를 사용하십시오. 시스템에서 찾을 수 있는 모든 유틸리티를 찾아서 사용합니다.
"filename"이 제공되지 않으면 STDIN이 인쇄됩니다.