0
0

#01 C# WinFormsによるメール受信検索アプリ

Posted at

「受信したメールを細かく検索したい」

この言葉が始まりであった‥

使用しているメーラーは細かい検索ができない。
なんならブラウザのメーラーなんて検索機能がまともに機能しない。
細かい検索 ANDやらOR条件でメール件名やら本文やらに検索ワードが含まれていたらそのメールをフィルターし表示させたかった。
例えば

Mail
フォルダ名: メルマガ
送信日付: 2024年9月15日
件名: 9月号ニュースレター
送信者: ABCニュースレター
送信者メールアドレス: newsletter@abcnews.com
To: suzuki.hanako@example.com
Cc: -
本文:
鈴木様

ABCニュースレター9月号をご覧いただき
ありがとうございます。
今月の特集記事では、秋の旅行先ベスト10
をご紹介しています。

また、最新のテクノロジー動向やお得な
キャンペーン情報もお見逃しなく。

詳細は下記リンクよりご確認ください。

引き続きご愛顧のほど、よろしくお願い申し上げます。

ABCニュースレター編集部

添付ファイル名: ABC_Newsletter_September.pdf

みたいなメールを受信してたら
(検索は全て含む検索)
件名と本文に
(「秋」かつ「旅行」) かつ (「9月」または「10月」または「11月」)
を検索した時に対象のメールを抽出する機能が欲しかった。
あとは添付メールがあるのかメールの送信日時を指定した抽出をする必要もある。

何を使って実現するのか

VBAで作れないか考えたが、色々調べて無理そうとなった…(てかこんなのVBAで作るなよ…)

ってわけで勉強がてらC# WinFormを使ってみることに
(WindowsFormアプリケーションの略称はWinForm?きっと伝わる)

色々調べたら「MailKit」というオープンソースを発見
NuGetパッケージマネージャーで簡単に導入できるしサクッと導入し開発を開始
(インストール方法やらは他の方々が詳しく記載してるのでそちらを参照してください)

使用した環境

言語
C# .NET 6.0
開発ツール
Visual Studio 2022
ライブラリ
MailKit 4.7.1.1

メール受信

まずはメールを受信するところから。
メールの接続設定・メールサーバーへの接続はMailKitのドキュメントの通り。
簡単に設定変更ができるようにメール設定からメールホスト・ユーザーID・パスワード・ポートを設定できるように作成

受信のプロセス

ちなみにメーラーのようにローカルに受信メールを保存して表示させる方法ではなく、メールサーバーからメール情報を都度取得→CSVに出力
という形でメールを受信している
(他でもデータを利用したい場合に便利そうなので一旦こういうことにしました)

画面上での操作は、取得したい日付範囲とCSVを保存するフォルダを選択してボタンを押すだけ。
この時メール全部を取り込みながらチェックをすると鬼のようにメールがあるとレスポンスが悪くなってしまうため、受信取り込みの段階で日付範囲指定を行います。

🌾メールサーバーへの接続は行われている状態とする
ちなみに私の場合は、メール受信クラスを作成し接続情報をクラス内で保持しています。
これを行うことで、メール接続の管理を簡単にできます。
(この辺りも解説予定:解説記事書いた時にURL貼ります)

MailReceives.cs
    // 日付範囲でメール情報を取得する部分のみ抜粋
        DateTime FromDate = DateClass.FromDate;
        DateTime ToDate = DateClass.ToDate;

        //IMAPフォルダを開く
        folder.Open(FolderAccess.ReadOnly);

        // 指定した日付範囲内のメールを検索
        var query = SearchQuery.DeliveredAfter(FromDate).And(SearchQuery.DeliveredBefore(ToDate));
        var uids = folder.Search(query);
        

この日付範囲指定をして抽出することで大幅にレスポンスを向上させることが可能です。

取得したメール情報をCSVに出力

CSVに1行ずつ入れ込むのも大変なので、CSVHelperを使用しました
メール情報クラスに必要情報を保存し、CSVに吐き出してもらいます

必要な情報(最低限)

  1. 送信日
  2. 送信メールアドレス
  3. 送信者
  4. 件名
  5. 本文

このクラスに情報を載せ替えます。
そしてCSVに出力

CSVを見て気づいたこと

文字化けしてる…?
メール送信者が変な文字コードで送信してると文字化けしてることが判明例えば
GB18030…中国の文字コード…
いや内容日本語やん

ということがあり、変換を試みる。
が、なぜか変換されない…

調べてみるも全くと言っていいほどこの辺りのドキュメントが見つからない…
送信の情報はたくさんあるのに…

現在対応している文字コードは

  • UTF-8
  • ISO-2022-JP(JIS)
    の二つ。
    GB18030と同じくSJIS(Shift-JIS)もなぜかうまく変換されなかった…

改善の必要あり

文字化けしていると検索に引っかからないので文字化けしていない状態にする必要がある。
現状それぞれの文字コードをメール情報から取得(CharSet)しその情報に合わせて変換を実施している。

この対応だとなぜか変換されない文字コードがあり文字化けのまま出力される…
(メーラーがいろんな文字コード表示できてるからもっといい方法がありそうと言うか、絶対ある…)

次回「文字コードは変換できたのか」
この記事を書いてる段階ではまだ解決してません。
捜査中です。。。。

解決したら再度記事として載せていきます。
MailKitの受信方法について案外情報がなかったので、参考になればと思い作成しております。

今回はなぜ作り始めたのかを書いています。
次回から細かく技術的な内容を書いていきたいと思います。

この方法ならいけるんじゃないか等ご存じの方居ましたら
是非コメントで教えていただけますと幸いです。。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0