도전
현재 mutt에서 보고 있는 메일의 로컬 경로를 확인하고 메일을 로컬 프로젝트 폴더에 저장하기 전이나 후에 bash 스크립트로 전송하고 싶습니다.
개념
나는 영구적인 인터넷 연결의 필요성으로부터 내 메일 인프라를 분리하기 위해 을 사용 mutt
하고 있습니다. 이 작업을 수행할 때 메일 파일 구조에서 내 메시지를 찾았는데, 각 메시지 는 아마도 자체 로컬 폴더 구조에 있을 것입니다.offlineimap
msmtp
<PROJECT>
<ACCOUNT>
Mail/
|-- <PROJECT>/
| |-- cur/
| | |-- 1584016380.RPi-18:2,
| | |-- 1595241604.RPi-18:2,
| | |-- 1603636018.RPi-18:2,
| | `-- 1612159655.RPi-18:2,
| |-- new/
| `-- tmp/
|-- <ACCOUNT>/
| |-- DRAFTS/
| | |-- cur/
| | |-- new/
| | `-- tmp/
| |-- INBOX/
...
메일을 탐색할 때(mutt의 인덱스 또는 호출기 보기 사용) 스케치 폴더 구조에서 mutt가 읽는 해당 메일 요소를 선택, 표시, 삭제 등을 할 수 있습니다.
이제 mutt의 함수를 사용하여 현재 메시지를 저장하고 싶습니다 save-message
. 하지만 그 전에(또는 저장한 후에) 이메일의 첨부 파일을 자동으로 추출하고 이메일 내용에 대해 다른 작업을 수행하고 싶습니다.
~/Mail/<PROJECT>/cur/1584016380.RPi-18:2
메일 파일의 경로(예 : 매개변수)를 읽은 다음 명령을 사용하여 미리 정의된 위치에 메일 첨부 파일을 저장 하는 bash 스크립트를 작성했습니다 mu
.
질문
나는 현재 보고 있는 메일 파일의 실제 위치를 알려주는 모든 것을 찾기 위해 사용 가능한 mutt 변수( folder
, spoolfile
, , ...)를 조사했습니다. from
하지만 아무것도 찾을 수 없습니다. 그래서 로컬에서 메일을 찾을 수 있도록 bash 스크립트에 어떤 경로를 전달해야 할지 모르겠습니다.
여기서 사용할 수 있는 것이 있나요?
답변1
이 질문이 꽤 커지고 해결하려면 질문 아래 댓글에서 토론이 필요하기 때문에 답변을 작성하기로 결정했습니다.
알겠어요프로젝트발신자, 제목 또는 본문 내용에 따라 다릅니다.
여기에는 두 개의 매크로가 필요합니다.Neomutt는 매크로 키를 누르면 파일을 추가하는 명령을 실행합니다.
첫 번째 매크로는 작업을 수행하며 별도의 파일에 있어야 합니다. 셸 부분이 매크로 정의를 확장하기 때문입니다. 그렇기 때문에 첫 번째 매크로의 두 번째 매크로를 정의하여 다시 정의하고 실행해야 합니다.
~/.mutt/dynamic_macro
"<pipe-message>/path/to/your/script<enter>\
<save-message>`cat /tmp/mutt_project`<enter>" \
"pipe message to extract attachments and save message"
~/.mutt/muttrc
macro index ,S \
"<enter-command>source ~/.mutt/dynamic_macro<enter>\
<enter-command>push ,s<enter>" \
"redefine macro and run it"
/path/to/your/script
이제 작동하지 않는 의사코드(bash와 유사한) 예가 있습니다. 스크립트는 표준 입력에서 메시지를 읽고 헤더나 본문을 구문 분석하여 결정합니다.프로젝트이름(사서함 이름)을 지정하고 부분을 반복하여 첨부 파일을 저장합니다. 항목별로 특정 디렉터리 및 하위 디렉터리에 저장할 수도 있습니다.
detect_project(){
# parse $content to detect project from body/headers
# save the project name to /tmp/mutt_project for the 1st macro
# and output on stdout for save_attachemnts()
echo $result > /tmp/mutt_project
echo $result
}
save_attachments(){
# parse $content, iterate over parts of message from $content,
# extract attachments, decode, save to:
#/root_directory_with_attachments/$project/$your_filename
}
main(){
content=$(cat) # read the stdin and save it into variable
project=$(detect_project)
save_attachments
}
main
제안:
- 이메일 처리를 위한 라이브러리가 있는 언어를 사용하면 이러한 부분에 액세스하고 디코딩할 수 있습니다.
- 다른 프로젝트의 여러 메시지에 태그를 지정하려는 경우 위의 예가 태그 접두사에서 작동하지 않을 것이라고 확신합니다. 그 이유는 매크로가 한 번 실행되고 모든 메시지가 즉시 /path/to/your/script로 파이프되지만 매개변수에는
<save-message>
마지막 메시지에서 감지된 항목이 포함되기 때문입니다.
다양한 솔루션: mutt에서 neomut으로, mu에서 notmuch로 마이그레이션. Neomutt에는 not much에 대한 뛰어난 지원 기능이 내장되어 있습니다. 여기에 있는 모든 작업은 몇 가지 새로운 후크를 사용하여 수행할 수 있습니다. 사용 사례에 적합하고 백그라운드에서 실행되며 neomutt 매크로가 필요하지 않으며 원래 솔루션 태그 접두사의 제한 사항을 제거합니다. Nomtuch post-new 후크는 메시지가 동기화될 때마다 실행됩니다.
- 보낸 사람/받는 사람/참조/제목 헤더 본문 콘텐츠 또는 기타 태그를 기반으로 메시지에 태그를 지정할 수 있습니다.
- 첨부 파일은 post-new 후크를 통해 저장할 수도 있습니다.
관심이 있으신 경우 여기에 의견을 남겨주시면 답변을 확대해 드리겠습니다.