Muttのインデックスビューで、送信者のEメールアドレスをシステムクリップボードにコピーしたい(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送信者のEメールアドレスをクリップボードに配置します。
私はウェイランドにいるので、次のように使用します。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送信者のEメールアドレスを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が山かっこ内のEメールアドレス(終了コード0)と正常に一致したら、Eメールアドレスをリンクして
xclip
完了します。 Muttがマクロを実行するのをクリックする\n
のと同じです。Enter - 一方、grepが失敗した場合(つまり、その部分が
after_from
すでにフォームのEメールアドレスである場合[email protected]
(山かっこなし))、アドレスをクリップボードに送信します|| echo \"\$after_from\") | xclip -selection c
。閉じ括弧は、作成したサブシェルで実行するコマンドの終わりを示します。これまたはオペレータ||
意味:左コマンドが失敗した場合(ゼロ以外の終了コード)、右コマンドを実行します。
注:Muttマクロの場合は、バックスラッシュを使用して次の文字をエスケープする必要があります。 Muttの外部でコマンドを使用するには、バックスラッシュを削除します。
^
"
$