Archive

parsedmarc が「No module named 'msgraph'」で動かない件のワークアラウンドなどのメモ

先日 dmarc-visualizer を試そうとしたところ、利用している parsedmarc が例外を吐いて使えない場面に遭遇してワークアラウンドとパッケージング周りの問題を報告&PRを送ったのでその辺をメモしておく

2024-10-26 追記

このブログで説明している内容はすでに最新版の parsedmarc で修正されています。そのため、同様のトラブルが発生する場合は最新の parsedmarc にアップデートしてみると良いと思います。

tl;dr

  • 2024-01-26 時点では parsedmarc を単純にインストールしても「No module named 'msgraph'」という例外が発生し使えない
  • 2024-01-26 時点では急ぎで parsedmarc が使いたい場合、 python -m pip install parsedmarc 'msgraph-core<1.0.0' という具合に msgraph-core の 1.0.0 を避けてインストールすれば利用できる
  • 既にこの問題は本家に報告済みで PR も出した

dmarc-visualizer と parsedmarc とは?

この二つのツールについては以下のブログを見るのが手っ取り早い

簡単に言うなら dmarc-visualizer は「複数の OSS のツールを組み合わせたDMARCレポートをいい感じに表示してくれる便利キット」と解釈すればよくて、 parsedmarc は「dmarc-visualizer が利用している OSS ツールの一つで、名前の通り DMARC レポートをいい感じに変換してくれるツール」と解釈すればよい。

2024-01-26 時点の parsedmarc の問題

発生している現象

2024-01-26 時点で parsedmarc をインストールして利用しようとすると以下の例外が発生し、使えない

$ python -V
Python 3.11.6
$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install parsedmarc
(venv) $ parsedmarc --help
Traceback (most recent call last):
  File "/tmp/parsedmarc/bin/parsedmarc", line 5, in <module>
    from parsedmarc.cli import _main
  File "/tmp/parsedmarc/lib/python3.11/site-packages/parsedmarc/__init__.py", line 31, in <module>
    from parsedmarc.mail import MailboxConnection
  File "/tmp/parsedmarc/lib/python3.11/site-packages/parsedmarc/mail/__init__.py", line 2, in <module>
    from parsedmarc.mail.graph import MSGraphConnection
  File "/tmp/parsedmarc/lib/python3.11/site-packages/parsedmarc/mail/graph.py", line 10, in <module>
    from msgraph.core import GraphClient
ModuleNotFoundError: No module named 'msgraph'

原因: 依存している msgraph-core のバージョン指定方法に問題あり

msgraph というモジュール名を調べたところ、依存しているパッケージである msgraph-core のことであることがわかった。1 この msgraph-core は 2024-01-23 に最新版である 1.0.0 をリリースしており、これは 2021-07-27 ぶりのメジャーリリースで破壊的変更を含んでいる模様。

一方で、 parsedmarc の project.toml をみると、 msgraph-core は >=0.2.2 と指定されている。

このため、新規で parsedmarc をインストールすると msgraph-core のバージョン0.2.2以上のもので最新である 1.0.0 がインストールされてしまい、動かなくなっていると考えられる。

ワークアラウンドによる回避

parsedmarc を使うには msgraph-core の 1.0.0 未満のバージョンがインストールされていればよいので、 parsedmarc のインストール時に次のような感じで msgraph-core のバージョンを指定すればよい

$ python -m pip install parsedmarc 'msgraph-core<1.0.0'

ピンポイントで 0.2.2 を指定してもよいと思う

$ python -m pip install parsedmarc msgraph-core==0.2.2

報告をして、とりあえず動くようにするレベルでPRを出した

この件は parsedmarc の実装を msgraph-core の 1.0.0 に対応させるのが本当の意味で根本的な対応になるだろうが、そんなにシュッとできるとも思えなかったので一端取り急ぎで Issue をあげた

ただ、今の状況が放置されるのも困るので、ひとまず msgraph-core のバージョンを 1.0.0 未満のものを使うように修正するPRもだした


  1. ちなみにリリースバージョンを確認するにあたって、先に紹介したクラウドワークスさんの記事や DMARCレポートツール「parsedmarc」をインストール の記事によって parsedmarc が正常に動いていたであろう時期が予測しやすくなり、大変助けられた。