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