📧

parsedmarcでgmail apiオプションを使用してgmailからdmarcレポートを直接取得する

2024/06/17に公開

parsedmarcとは

https://github.com/domainaware/parsedmarc
OSSのdmarcレポートのパースツールです。リブセンスではparsedmarcでパースしたデータをOpenSearchに格納し、Grafanaを用いて可視化を行なっています。詳細については以下記事をどうぞ。

https://made.livesense.co.jp/entry/2024/04/02/080000

この記事では、以下の流れでdmarcレポートを以下の流れで取り込んでいました。

本記事では、gmail_apiオプションを使うことでgmailから直接parsedmarcを用いてETL処理できたので、その方法を共有いたします。

gmail上でのラベル設定

dmarcレポートが集約されるgmailのラベルを設定します。以下のスクリーンショットにおいてはdmarcラベルにdmarcレポートが届く想定です。
gmail_apiオプションを用いてparsedmarcを動かすと、dmarc-archiveラベルと4つの子ラベルが作られ、dmarcラベルに届いたメールのうちETL処理が終わったものがdmarc-archiveラベルの対応した子ラベルに格納されていきます。

設定方法

tokenの入手

https://developers.google.com/gmail/api/quickstart/python?hl=ja
gmail apiのクイックスタートのpythonを用意し、以下のように変更してください。

- SCOPES = ["https://www.googleapis.com/auth/gmail.readonly"]
+ SCOPES = ["https://www.googleapis.com/auth/gmail.modify"]

クイックスタートの通りに実行すると、pythonと同階層にtoken.jsonが生成されているはずです。

iniファイル

実際に使っているものです、参考にどうぞ。重要なのは[mailbox][gmail_api]です。

[general]
save_aggregate = True
save_forensic = True
debug = True
log_file = /dev/stdout # docker環境のため

[opensearch]
hosts = https://user:secret@hogehoge.com

[mailbox]
watch = True # メールが届き次第処理するか否か
delete = False # 処理が終わったメールを削除するか否か
reports_folder = dmarc # レポートが届く想定のラベル
archive_folder = dmarc-archive # 処理が終わった後に移動するラベル

[gmail_api]
credentials_file = /etc/parsedmarc/credentials.json  # クイックスタートで入手したcredentials.jsonを設定する
token_file = /etc/parsedmarc/token.json # 上記で入手したtokenを設定する
include_spam_trash = True # dmarcレポートは低確率で迷惑メールになるので迷惑メールも見るようにする
paginate_messages = True  # レポートが多いとapi制限で直近のレポートしか読まないため、多くない場合はFalseで良い
scopes = https://www.googleapis.com/auth/gmail.modify # readonlyで動かすとエラーになるので非推奨です

DockerFileの例

以下のようなコンテナを用意し、Fargateで運用しています。

FROM python:3.11.8-alpine3.19
WORKDIR /app
RUN apk add --update --no-cache libxml2-dev libxslt-dev && apk add --update --no-cache --virtual .build_deps build-base libffi-dev

COPY ./requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

COPY parsedmarc.ini /etc/parsedmarc.ini

COPY credentials.json /etc/parsedmarc/credentials.json
COPY token.json /etc/parsedmarc/token.json

CMD ["parsedmarc", "-c", "/etc/parsedmarc.ini"]

parsedmarcにコントリビュートしました

完全に余談ですが、この件でドキュメントの更新と、壊れたCIの修復を行いました。
https://github.com/domainaware/parsedmarc/pulls?q=is%3Apr+is%3Aclosed+author%3Ayjszk

宣伝

2024/07/16(火)にリブセンスでメール技術の勉強会をします。
私はDMARCのレポートシステムを作り、実際に運用した結果について話します。
他にはインフラGのEMによるメールサーバの移行の発表もあるので、是非きてください。
https://livesense.connpass.com/event/320302/

Livesense Engineers

Discussion