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