procmail은 수신 날짜가 포함된 첨부 파일을 파일 이름으로 저장합니다.

procmail은 수신 날짜가 포함된 첨부 파일을 파일 이름으로 저장합니다.

우리는 매일 다음과 같은 이메일을 받습니다.[이메일 보호됨]첨부 파일의 경우 파일 이름은 다음과 같습니다.report.xlsx

받은 날짜로 파일을 저장하는 방법은 무엇입니까? 예를 들어 20180131_report.xlsx제목이나 보낸 사람을 어떻게 필터링합니까?

내 거~/.procmailrc:

:0
*^content-Type:
{
    :fw
    | ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment
}

답변1

Procmail 또는 수신 MTA가 다음과 같이 구성된 경우From_철사이 의사 헤더에는 일반적으로 메시지 자체 이전의 날짜가 이미 포함되어 있습니다. 이를 구문 분석해야 하는데 이는 번거롭기 때문에 이것이 실제로 성능을 최적화해야 하는 시스템이 아닌 한(이 경우 초당 수백 개의 일치 항목이 있습니까?) 가장 간단한 해결책은 를 호출하는 것입니다 date +%Y%m%d.

관련되지 않은 두 헤더 중 하나를 일치시키려면 두 헤더를 정규식에 넣으면 됩니다 |.

:0
* ^Content-type:
* ^From:(.*\<)?foo@example\.tld|^Subject: Your daily report
| ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$(date +%Y%m%d)_report.xslx

(여기에 버그가 있습니다. 아래 업데이트를 참조하세요.)

이 경우 플래그 fw는 의미가 없으므로 제거했습니다(실제로 이 Content-type:조건도 의미가 있는지 확신할 수 없습니다. 요즘 대부분의 메시지에는 어쨌든 플래그가 있을 것입니다).

더 복잡한 조건을 결합하려면 DeMorgan의 법칙이라는 논리의 기본 원리를 사용할 수 있습니다. 아니요직접Procmail의 구문은 "이 조건 또는 저 조건"을 의미하지만이것을 리팩토링 할 수 있습니다"((이 조건이 아님) 및 (저 조건이 아님))"이 아닙니다.

:0
* ! this condition
* ! that condition
{ } # nothing happens here
:0E # else
{ LOG="at least one of them matched
" }

아니면 단순히 등급을 사용하세요.

:0
* 1^0 this condition
* 1^0 that conditon
{ LOG="at least one of them matched
" }

고쳐 쓰다:

처럼 보인다ripmime실제로 개별 첨부 파일의 이름 지정(추출 또는)은 지원되지 않습니다. 가장 간단한 해결책은 cron자정 이전(또는 도착 시간을 알고 있는 경우 예상되는 최종 시간보다 조금 늦은 시간) 이전에 최종 도착 시간의 이름을 바꾸는 것입니다.

 55 23 * * * cd /dir/to/save/attachment && mv report.xslx "$(date +%%Y%%m%%d)"_report.xslx

(구체적으로) 명령에서 백분율 기호를 두 배로 늘려야 하는 방법에 유의하세요 cron! 분명히 위의 Procmail 레시피를 간단히 저장하는 것으로 되돌릴 수 있습니다 ripmime./dir/to/save/attachment

또는 첨부 파일이 도착하자마자 이름을 바꾸면서 동시에 조건을 크게 강화할 수도 있습니다. 다음은 진행 방법에 대한 많은 추측을 담고 있습니다.정확히첨부 파일을 전달하는 메시지는 인코딩됩니다. 여러 가지 콘텐츠 유형, MIME 구조, MIME 헤더 규칙 등 중에서 선택할 수 있으므로 약간의 조정 없이는 작동하지 않을 수 있습니다.

:0
* ^From:(.*\<)?foo@example\.tld
* ^Subject: Your daily report
* HB ?? ^Content-type: application/(octet-stream|vnd\.openxmlformats-officedocument\.spreadsheetml\.sheet|vnd\.ms-here-be-dragons-xslx); filename="?report.xslx
| ( cd dir/to/save/attachment; \
    ripmime --overwrite --no-nameless -i - -d . && \
    mv report.xslx $(date +%Y%m%d)"_report.xslx )

헤더에는 Content-type:파일 이름이 포함되어 있지 않을 수 있습니다. 지정할 수 있지만 이제는 지정해야 Content-Disposition:하지만 많은 발신자는 이전 버전과의 호환성을 위해 두 위치에 배치합니다. 파일 이름은 적절하게 RFC2231로 인코딩되어야 합니다. 이는 다수의 선택적 필드가 채워질 수 있음을 의미합니다. 이는 ASCII 파일 이름이 마을에서 유일한 게임이었을 때처럼 비어 있을 것이라고 편리하게 가정합니다.

또한 내가 보낸 사람에게 어떻게 요청하는지 참고하세요.그리고이제 일치하는 테마입니다. HB ??기본 메시지 헤더나 본문에서 일치하는 항목을 찾으라고 (부정확하게) 표시되어 있습니다 . 정확하게 말하면 후자의 경우 일치 항목은 MIME 본문 부분의 헤더에 있어야 하지만 Procmail에서는 이를 지정하는 쉬운 방법이 없습니다.

답변2

각 질문에 대한 답변:

  1. 레시피에서 외부 명령을 호출할 수 있으므로 다음을 수행하여 변수를 정의할 수 있습니다 TODAY.

    TODAY=`date +%Y%m%d`
    

    그런 다음 레시피에서 이를 참조할 수 있습니다.

    ripmime --overwrite --no-nameless -i - -d /dir/to/save/attachment/$TODAY_report_xlsx
    

    파일 이름을 동적으로 결정해야 하는 경우 그에 따라 레시피를 조정하세요.

  2. 주제 필터링그리고발신자로서 다음을 수행할 수 있습니다.

    :0
    * ^content-Type:
    * ^From:.* [email protected]
    * ^Subject:.*Report
    {
    ....
    

관련 정보