Pythonの使用email図書館

Pythonの使用email図書館

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_fromgrepが電子メールアドレスを抽出することです。これは前方予測です。一致する文字列の後にある必要がありますが、右山かっこは一致する文字列の一部ではありません。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の外部でコマンドを使用するには、バックスラッシュを削除します。

  • ^
  • "
  • $

関連情報