在 Mutt 的索引视图中,我想将发件人的邮件地址复制到系统剪贴板(xclip
例如,使用 )。
有没有办法使用宏或任何其他方式获取当前所选邮件的发件人邮件地址?
答案1
使用Python的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 系统剪贴板上。替换xclip -selection c
为wl-copy
使其与 Wayland 一起使用。
我们假设电子邮件地址位于这样的行上
From: Firstname Lastname <[email protected]>
或者像这样
From: [email protected]
宏的解释:
|grep
:将当前电子邮件传送到 grep。-m 1
: grep 在匹配到第一行后将停止。-o
: grep 只打印匹配的字符串,而不打印整行。P
: 使能够Perl 兼容的正则表达式在 grep 中。我们需要这个来进行正则表达式中的lookbehind。'(?<=\^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
并完成。\n
相当于点击Enter让 Mutt 执行宏。 - 另一方面,如果 grep 不成功,即该部分
after_from
已经是表单中的电子邮件地址[email protected]
(无尖括号)时的情况,我们只需将该地址发送到剪贴板|| echo \"\$after_from\") | xclip -selection c
。右括号标志着我们在创建的子 shell 中执行的命令的结束。这或运算符||
意思是:如果左侧的命令失败(非零退出代码),则执行右侧的命令。
注意:对于 Mutt 的宏,我们必须使用反斜杠转义以下字符。如果您想在 Mutt 之外使用该命令,请删除反斜杠:
^
"
$