Mutt

使用宏獲取發件人的郵件地址

  • May 31, 2020

在 Mutt 的索引視圖中,我想將發件人的郵件地址複製到系統剪貼板(xclip例如,使用 )。

有沒有辦法使用宏或任何其他方式獲取目前所選郵件的發件人郵件地址?

來自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 系統剪貼板上。替換xclip -selection cwl-copy使其適用於 Wayland。

我們假設電子郵件地址在這樣的一行

From: Firstname Lastname <firstname.lastname@domain.com>

或者像這樣

From: firstname.lastname@domain.com

宏說明:

  • |grep:通過管道將目前電子郵件發送到 grep。
  • -m 1: grep 匹配第一行後會停止。
  • -o: grep 只列印匹配的字元串,而不是整行。
  • P:在 grep 中啟用Perl 兼容的正則表達式。我們需要這個用於正則表達式的後視。
  • '(?<=\^From: ).+': grep 的正則表達式。獲取以“From:”開頭的行之後的所有字元。該(?<=部分是一個積極的向後看,這意味著該行必須以“From:”開頭,但該字元串不是匹配的一部分。後面的字元是匹配的字元串。
  • 此時, grep 列印Firstname Lastname <firstname.lastname@domain.com>firstname.lastname@domain.com
  • | (read after_from;: 我們將這個字元串傳遞給程序,該程序read將字元串保存在變數中after_from。括號開始一個subshel ​​l 。
  • echo \"\$after_from\" | grep -oP '(?<=<)(.+)(?=>)': 假設是的內容after_fromFirstname Lastname <firstname.lastname@domain.com>grep 提取電子郵件地址firstname.lastname@domain.com(?=>)是一個正向的前瞻:在匹配的字元串之後,必須有一個>,但是這個右尖括號不是匹配字元串的一部分。
  • 如果 grep 成功(退出程式碼 0)匹配尖括號內的電子郵件地址,我們將電子郵件地址通過管道傳輸到xclip並完成。\n相當於 hitEnter使 Mutt 執行宏。
  • 另一方面,如果 grep 不成功,即該部分after_from已經是表單中的電子郵件地址firstname.lastname@domain.com(沒有尖括號),我們只需將該地址發送到剪貼板|| echo \"\$after_from\") | xclip -selection c。右括號標誌著我們在我們創建的子 shell 中執行的命令的結束。or 運算符||意思是:如果左側的命令失敗(非零退出程式碼),則執行右側的命令。

注意:對於 Mutt 的宏,我們必須用反斜杠轉義以下字元。如果您想在 Mutt 之外使用該命令,請刪除反斜杠:

  • ^
  • "
  • $

引用自:https://unix.stackexchange.com/questions/543447