파이썬 사용email도서관

파이썬 사용email도서관

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_fromgrep이 이메일 주소를 추출한다는 것입니다. 이는 전방 예측입니다. 일치하는 문자열 뒤에 있어야 하지만 오른쪽 꺾쇠 괄호는 일치하는 문자열의 일부가 아닙니다.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 외부에서 명령을 사용하려면 백슬래시를 제거하십시오.

  • ^
  • "
  • $

관련 정보