サークル関連のメールをDiscordに転送するようにしてみた

お久しぶりです。kofuk です。
3 日くらい前にメールを Discord に転送するものを作った話を書きます。

コードも貼ろうと思ったんですが、貼るほどのコードがなかったです。欲しい方は連絡ください。
あと、この投稿を読んでも実装の詳細とかはあんまり分かんないです。まあアイデアの共有ということで……。

背景

なんか僕はサークルの連絡担当者ということになっていたんですが、まあこいうのは全員に見えたほうがよいだろうということで、メールを全部 Discord に送り込むことを思いつきました。決して面倒だったからとかそういう理由ではない。んで会長の God に相談したんですが、あんまり乗り気ではなさそうでしたが、どういうものが出てくるのかという興味から (かどうかは知らんが) やっていいと言ってくれたので、適当に作ったという次第です。

構成

何も難しいことはしてないです。IMAP でメールを見に行って、条件に合う未読メールがあったら落としてきて Discord に転送するという感じです。Discord は Webhook の URL に適当に POST するだけでメッセージ送れるから便利ですね。
ひとつ注意点として、このメールアドレスにはサークル関係のメール以外もどんどん来ているので片っ端から転送していると僕の正体が暴かれてしまいます (プライベートのメールが流出してしまうという意味)。アイドルとして (アイドルではない) そのようなことは許されませんね。そのへんをどう実装したかについても後ほど説明します。

実装

メールを見に行く部分

この部分で一番非自明なのは、他の用件のメールとサークル関係のメールを見分けるという部分と、一回転送したメールはそれ以降転送しないという部分だと思います。まあ結果的にこのへんは別に難しいということはなかったんですが。

一番簡単にできる方法を考えた結果、Outlook (そう、Outlook だったのです) のルール機能を使って、適当なフォルダーに放り込んでおいて、そのフォルダーのメールだけを転送対象にするのが楽だということで、そういう実装にしました。ちなみにここのフィルターは「学生団体各位」が入っているかどうかという非常にアドホックなものになっています。Cc に特定のアドレスが入っているかという条件が使えればいいんですけど…。

一回転送したメールをもう一度転送しないというのは、一回ダウンロードしたメールは既読になる仕様らしく、未読メールだけを処理すれば良かったので簡単でした。無知は罪ですね。

ひとつ注意点としては、iso-2022-jp でエンコードしてあるメールがそこそこあるので、その部分をうまく扱わないといけないことです。

Discord に送り込む部分

ここが一番自明な部分です。Discord に Webhook URL を貰ってきて、適当に JSON を POST しています。2000 文字の制限があるらしいので 2000 文字を超えるメールは分割しないといけないんですが、この部分はまだ何もやっていないです。文字数という概念はあまりにも難しすぎる………

その他

一応先頭行の「学生団体各位」という文字列を削ったり、メール末尾にくっついている署名を削ったりはしています。このへんはかなりアドホックなコードが入っています。