すでにnotmuchdbにあるmaildirメッセージファイル名からnotmuchmessage-idとthread-idを取得するにはどうすればよいですか?

Aug 24 2020

ファイルを返すクエリをあまり行わないと仮定しましょう。

$ notmuch search --output=files tag:inbox from:love

これにより、Maildirメッセージを指すファイルのリストが返されます。今、私はこれらのファイルの1つを選びます(すでに多くのデータベースにありません)、例えば

FILENAME=$(notmuch search --output=files tag:inbox from:love | fzf)

そして、私はそのメッセージIDとスレッドIDをnotmuchデータベースで取得したいと思います。変数$ FILENAMEから、メッセージIDをそれほど多く見つけたいと思います。

これを行うための非常にずさんな方法は、ファイルを解析し、ヘッダーを/ subject / dateから読み取り、それほど多くのクエリを作成しないことnotmuch search from:{...} subject:{...} date:{..}です。しかし、ファイル名はすでにデータベースに保存されているので、ファイル名からメッセージIDを取得するための標準的で堅牢な方法があるはずです。

ありがとう!

回答

JakubJindra Aug 24 2020 at 15:49

NOTMUCH-SEARCH-TERMS(7)でmaildirファイル名に基づいてnotmuchデータベースを検索する方法が見つかりませんでした

メッセージIDを繰り返すことで、検索から直接メッセージIDとそれほど多くのスレッドIDを取得できません。

for message_id in $(notmuch search --output=messages 'tag:inbox from:love') do thread_id=$(notmuch search --output=threads $message_id) echo "$thread_id - $message_id"
done

または、スレッドを繰り返し処理して、関連付けられたメッセージIDを取得することもできます。

for thread_id in $(notmuch search --output=threads 'tag:inbox from:love')
do
  # sed is here only to provide the output in the same format as in the first example
  notmuch search --output=messages $thread_id | sed "s/^/$thread_id - /"
done

あなたのニーズにより良く合うものは何でも。両方のforループの出力は、次の形式になります。

thread:THREAD_ID - id:MESSAGE_ID
…

FromDateSubjectヘッダーを取得したい場合は、formail(1)または同様のツールを使用してmaildirファイルを解析することなく、jqを使用してnotmuchデータベースから直接抽出することもできます。

notmuch search --format=json id:MESSAGE_ID | jq -r '.[].subject'
jlewk Aug 26 2020 at 04:46

私は最終的に、それほど多くないpythonバインディングを介して方法を見つけました。を参照してください。 https://notmuch.readthedocs.io/projects/notmuch-python/en/latest/database.html?highlight=filename#notmuch.Database.find_message_by_filename

ワーキングバッシュワンライナーは

threadId=$(python3 -c "import notmuch; db = notmuch.Database(); print(db.find_message_by_filename('$FILENAME').get_thread_id())");

解凍されたpython3コードは

import notmuch
db = notmuch.Database()
msg = db.find_message_by_filename('filename of the maildir message')
msg.get_thread_id()