Mutt의 인덱스 보기에서 보낸 사람의 이메일 주소를 시스템 클립보드에 복사하고 싶습니다( xclip
예: 를 사용하여).
매크로나 다른 방법을 사용하여 현재 선택된 이메일의 보낸 사람 이메일 주소를 얻는 방법이 있습니까?
답변1
파이썬 사용email
도서관
이 스크립트를 다음 위치에 넣었습니다 ~/.config/mutt/scripts/get_sender_email.py
.
#!/usr/bin/python3
# Reads an email from standard in and prints the sender's email address.
# E.g.: [email protected]
# Call it from Bash like this: `./get_sender_email.py < your_email`
import sys
import email
from email import policy
# Read the email from standard in
msg = email.message_from_file(sys.stdin, policy=policy.default)
# See https://docs.python.org/3/library/email.headerregistry.html
sender_email_address = msg['from'].addresses[0].addr_spec
print(sender_email_address)
다음을 사용하여 파일을 실행 가능하게 만든 후 chmod +x get_sender_email.py
다음에서 매크로를 정의합니다 muttrc
.
# Avoid the "Press any key to continue..." prompt
set wait_key=no
# Pipe the email content to the script which extracts the sender's email address.
# Then, put the email address into Wayland's clipboard
macro index,pager \cf\
"| $XDG_CONFIG_HOME/mutt/scripts/get_sender_email.py\
| wl-copy\n"\
"Yank sender's email to clipboard"
Mutt의 색인 또는 호출기 보기에서 Ctrl+는 f보낸 사람의 이메일 주소를 클립보드에 배치합니다.
저는 Wayland에 있기 때문에 다음을 사용합니다.wl-copy
시스템 클립보드에 씁니다.
바라보다이것또는이 답변이메일 구문 분석에 대한 추가 정보
이전 버전 사용grep
아래는 이 질문에 대한 원래 답변입니다. 정규식을 사용하여 로 시작하는 줄 뒤의 부분을 가져옵니다 From:
. 문제는 아래 섹션이 From:
여러 줄에 걸쳐 있을 수 있으며 아래 코드에서는 이를 고려하지 않는다는 것입니다.
에서 muttrc
:
# Avoid the "Press any key to continue..." prompt
set wait_key=no
macro index,pager \cf "|grep -m 1 -oP '(?<=\^From: ).+' | (read after_from; echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)' || echo \"\$after_from\") | xclip -selection c\n" "Yank sender's email to clipboard"
이제 Ctrl+ f보낸 사람의 이메일 주소를 X 시스템 클립보드에 넣으세요. Wayland와 함께 작동하도록 xclip -selection c
대체 되었습니다 .wl-copy
이메일 주소가 다음과 같은 줄에 있다고 가정해 보겠습니다.
From: Firstname Lastname <[email protected]>
아니면 이렇게
From: [email protected]
매크로 설명:
|grep
: 현재 이메일을 grep에 전달합니다.-m 1
: grep은 첫 번째 줄을 일치시킨 후 중지됩니다.-o
: grep은 전체 줄이 아닌 일치하는 문자열만 인쇄합니다.P
: 할 수 있게 하다Perl 호환 정규식grep에서. 정규식에서 뒤돌아보기를 위해 이것이 필요합니다.'(?<=\^From: ).+'
: grep의 정규식입니다. "From:"으로 시작하는 줄 뒤의 모든 문자를 가져옵니다. 이(?<=
부분은활성 후면보기즉, 해당 줄은 "From:"으로 시작해야 하지만 해당 문자열은 일치 항목의 일부가 아닙니다. 다음 문자는 일치하는 문자열입니다.- 이 시점에서 grep은 또는 .
Firstname Lastname <[email protected]>
[email protected]
| (read after_from;
: 이 문자열을 프로그램에 파이프합니다.read
문자열을 변수에 저장합니다after_from
. 브래킷 시작서브쉘.echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)'
: 가상의 내용은after_from
grep이 이메일 주소를 추출한다는 것입니다. 이는 전방 예측입니다. 일치하는 문자열 뒤에 있어야 하지만 오른쪽 꺾쇠 괄호는 일치하는 문자열의 일부가 아닙니다.Firstname Lastname <[email protected]>
[email protected]
(?=>)
>
- grep이 꺾쇠 괄호 안의 이메일 주소(종료 코드 0)와 성공적으로 일치하면 이메일 주소를 연결하여
xclip
완료합니다. Mutt가 매크로를 실행하도록\n
클릭하는 것과 같습니다 .Enter - 반면에 grep이 실패하면(즉, 해당 부분이
after_from
이미 양식의 이메일 주소인 경우[email protected]
(꺾쇠 괄호 없음)) 주소를 클립보드로 보냅니다|| echo \"\$after_from\") | xclip -selection c
. 닫는 괄호는 우리가 만든 하위 쉘에서 실행하는 명령의 끝을 표시합니다. 이것또는 운영자||
의미: 왼쪽 명령이 실패하면(0이 아닌 종료 코드) 오른쪽 명령을 실행합니다.
참고: Mutt 매크로의 경우 백슬래시를 사용하여 다음 문자를 이스케이프해야 합니다. Mutt 외부에서 명령을 사용하려면 백슬래시를 제거하십시오.
^
"
$