ゼロからメールパーサーを作成する方法

Portrait of Sylvain Josserand
執筆者 Sylvain Josserand
2 分で読了
最終更新日

あなたの上司が突然、会社の「メール問題」を今すぐ解決するよう指示してきました。毎朝膨大な件数の自動送信メールが従業員の受信ボックスを埋め尽くし、手作業でデータを転記しています。

あなたはスマートで効率重視。すぐに「メールパーサーの作成」で課題を根本解決できると気づきました。素晴らしい発想ですが、単純なスクリプトとやる気だけでは十分ではありません。ここではメールパーサーの作成によるメールデータ入力ワークフロー自動化のための6つのステップを解説します。

始める前に: パースとパーシングの定義

コンピュータサイエンスにおけるパーシングとは、特定のルールに従い、テキストを構造化されたサブパーツへ分解することです。

メールパーサーとは、電子メールを解析し、指定ルールで自動的に処理するソフトウェアまたはシステムを指します。この仕組みにより、メールから関連情報を自動抽出し、各種業務システムへデータを渡すことができます。メールパーサーの詳細はこちらの記事もあわせてご覧ください。

少し宣伝:Parseurのご紹介

自作メールパーサー構築は、内部仕組みの理解にも役立つ実践的なプロジェクトです。

ただし、かなり工数がかかることも事実です。

無料アカウントを作成
Parseurで時間と労力を節約。ドキュメント処理を自動化しましょう。

Parseurは2015年末からゼロベースで開発が始まり、バックエンドだけで約5,000人時・6年かかっています。フロントエンド(UI全般やテンプレート編集機能)はさらに数千人時分の開発が進行しました。Parseurの開発チームは、20年以上のプロフェッショナル経験を持つエンジニアたちで構成されています。

開発はいまだ継続しており、「十分に使える」メールパーサーの作成には想像よりはるかに時間が必要です。

もしすぐに結果が必要なら、Parseurをぜひお試しください。Parseurは管理型で使いやすいメールパーサーで、構築より大幅に時間短縮できます。Parseurの充実した機能の詳細はこちらもご参照ください。

1. メールの取得

通常、メールは従業員個人のメールボックスや、共有のメーリングリスト、企業宛ての代表アドレスなどに送られてきます。

まず最初のステップは、「解析対象のすべてのメールを受信する専用メールアカウント」を用意することです。必要に応じて専用のSmtpサーバーを構築する選択肢も考えられます。

もし構築の経験があれば、おすすめのSMTPサーバーは以下の通りです:

  • Exim:無料・オープンソースのメール転送エージェントで、現在トップシェアを誇ります。
  • Postfix:こちらも無料・オープンソースで、可用性と安定性に優れています。サーバーシェア統計(2023年版)によると、EximとPostfixでメールサーバーの80%以上をカバーしています。
  • Exchange:Microsoft系のメールサーバーで、EWSで接続できますし、POP3IMAPも利用可能です。Exchange Onlineというクラウド版も提供されています。
  • 独自構築:ニッチですが学びも大きい方法です。Pythonにはsmtpdという便利な標準モジュールがあります。

なお、メール大量送信時のブラックリスト回避や安定運用は、専門家でも奥深い領域です。

近年、独自メールサーバー構築は減少傾向です。現在はクラウドやSaaS型メールサービスを使う企業が増えています。代表的なサービスは:

  • Postmark:配信到達率・信頼性が高く、無料プランあり
  • Mandrill:素早い導入・高人気。マーケティング/取引通知専用
  • Sendgrid:マーケや通知送信に最適
  • Mailgun:開発者API中心、無料プランあり

Parseur チームではPostmarkを最も推奨しています。API設計も優秀で、各種言語向けSDK・豊富なドキュメントが整備されています。

2. メールを扱いやすいデータ形式へ変換する

メールのフォーマットは非常に歴史が長く、現代用途には向かない課題が多くあります。たとえば国際化対応は後付けの仕様で、€記号や特殊文字を扱う場合、以下のような複数のRFC仕様への対応が必要です:

こうした変換やエンコーディング処理も、「Postmark」や「Mailgun」等のメールAPIを使えば、自動的に適切な形式(たとえばUTF-8のJSON)へ変換してくれます。UTF-8、MIME、cp1252の面倒を自前で見る必要はありません。

Mailgunなら受信後、RFC準拠のわかりやすいJSONデータに変換し、あなたが指定したWebhook(URL)へHTTP POSTリクエストで送信してくれます。

興味があれば、SMTP関連RFCの一覧もご覧ください。

Mailgun経由で届くシンプルなメールの例:

{
  "subject": "My favorite café",
  "sender": "John Doe <[email protected]>",
  "recipient": "Mr. Parseur <[email protected]>",
  "message": "It's called Awesome Café! See directions in the attachment. Bye.",
  "attachements": [
    { "name": "directions.pdf", "content": "https://url.with.content" },
    { "name": "cappucino.jpg", "content": "https://another.content.url" }
  ]
  /*... other interesting pieces of data here (read the doc, Luke) ...*/
}

対して、従来のメールフォーマットの例:

  MIME-Version: 1.0
  Received: by 102.29.23.176 with HTTP; Sat, 12 Aug 2016 14:13:31 -0700 (PDT)
  Date: Sat, 12 Aug 2016 14:13:31 -0700
  Delivered-To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Message-ID: <CAAJL_=kPAJZ=fryb21wBOALp8-XOEL-h9j84s3SjpXYQjN3Z3A@mail.gmail.com>
  Subject: =?ISO-8859-1?Q?My=20Favorite=20Caf=E9
  From: =?ISO-8859-1?Q?John Doe <[email protected]>
  To: =?ISO-8859-1?Q?Mr. Parseur <[email protected]>
  Content-Type: multipart/mixed; boundary=mixed
  ==mixed
  Content-Type: multipart/alternative; boundary=alternative
  ==alternative
  Content-Type: text/plain; charset="utf-8"
  It's called Awesome Caf=C3=A9! See directions in the attachm= ent. Bye.
  ==alternative
  Content-Type: text/html; charset="utf-8"
  It's called <b>Awesome Caf=C3=A9</b>! See directions in the = attachment. Bye. ==alternative== ==mixed
  Content-Type: document/pdf; name="directions.pdf"
  Content-Disposition: attachment; filename="directions.pdf"
  Content-Transfer-Encoding: base64
  iVBORw [... the whole encoded attachment here ...] RK5CYII=
  ==mixed
  Content-Type: image/jpg; name="capuccino.jpg"
  Content-Disposition: attachment; filename="capuccino.jpg"
  Content-Transfer-Encoding: base64
  G+aHAAAA [... another attachment encoded here ...] ORK5CYII=
  ==mixed==

幸運なことに、多くのプログラミング言語にはメール解析用の標準ライブラリが備わっています。たとえばPythonはemail、RubyはRubyMailなど豊富なライブラリが入手できます。

3. データベースへデータを格納

ここからは、取得したHTTPリクエストを任意のプログラミング言語で好きなデータベースに格納するだけです。

近年人気の言語・フレームワークの例:

業務アプリ等とのデータフォーマット調整が必要な場合、先に要件確認を。また、一般的交換形式としてはCSVJSONが主流ですが、一部の業務ソフトでは独自のバイナリ形式等を使う場合もあります。

自社利用やシンプルなストレージの場合は、どのように保存するかを決めればOKです。

一方、将来的な統計処理不要・単純保存目的であれば、NoSQL系DB(MongoDBなど)も候補にできますが、このブログ記事のような理由で注意が必要です。

多くの場合はSQLベースのリレーショナルDBMSで十分。最低限、メール用テーブルと、添付ファイルを保存する場合は添付用テーブルの2つ程度を定義すれば運用可能です。

従来の主要なリレーショナルDBMS:

ここまでで「メール全文をDBへ保存する」作業は完了です。

ただ、本番で価値を最大化したい場合、メール本文から本当に必要なデータ(例えば請求書・注文情報等)だけを自動抽出する処理を組み込むと、業務自動化効果が大きくなります。

4. 各メールから必要なテキストデータを抽出

ここがメールパーサーの真価です。理想の流れはこうなります:

A screen capture of email parser overview
Schematics of an email parser transforming a received email into structured data (for example, a spreadsheet, or a database)

この難題を克服する代表的な2手法を紹介します。

統計的ワード分析(ワードカウント)

人間が自由記述する本文分析には、単語頻度統計による分類(ワードカウント)が使えます。カテゴリごとに単語リストを設定し、出現単語数でメールの種類や感情を推定します。

たとえば「肯定」や「苦情」などのメールを自動でカテゴライズしたり、システムに自動振り分けを行ったりする用途に有効です。

ただし、人間言語特有のあいまいさや文脈依存は、現時点のAI・解析技術だけで完全にカバーするのは困難です。十分な精度を担保したいなら他手法も併用しましょう。

正規表現

定型化・自動生成された本文には、正規表現による抽出がとても有効です。

たとえば、航空会社の予約メールから搭乗者氏名のみを抽出したい場合などに、正規表現を活用できます。しかし、メール構造が頻繁に変わったり、複数名や特殊レイアウトが混在する場合はメンテナンスが煩雑になりがちです。

Python標準の正規表現ライブラリ、RubyのRegexpモジュール、JavaScriptの正規表現オブジェクトなどの利用がおすすめです。

正規表現は一時的には有用ですが、仕様変更に弱いので長期運用には十分な管理体制が求められます。Parseurのお客様でも最初は自作正規表現パーサーを導入したものの、運用で限界を感じて乗り換えた事例が多数あります。

5. 管理型ソリューションも。Parseurで効率化!

もし必要なデータが自動でExcelやデータベースの正しい列に自動転記されたら便利ですよね。

それを実現するのがParseurです。「ポイント&クリック」のUIで一度ルールを作れば、あとは同種のメールを送信するだけで、指定した各項目を自動抽出・表形式化。毎回手作業で抜き出す必要がなくなります。

ゼロからメールパーサーを作成する手間は不要です。一度テンプレートを定義すれば、それ以降の類似メールは自動でExcelの行やDBレコードへ変換されていきます。

6. 業務システムとの連携

最終的にデータがExcel等に整然と並んだら、後は既存の業務システムに自動連携させましょう。

ZapierMakeなどの連携自動化サービスを活用すれば、抽出データを数クリックで他システムへ渡せます。コネクタさえ用意できれば、ほとんどの業界標準アプリやクラウドサービス・オンプレミスソフトと即座に連携可能です。

ParseurはGoogle Sheets、Zapier、Integromat(Makeへの旧称)、Microsoft Power Automateなどと連携し、抽出データを数クリックで何千ものアプリへ自動で送信できます。

皆様の業務効率化の成功をお祈りします!

最終更新日

AIによるデータ抽出ソフトウェア。
今すぐParseurを始めよう。

メール、PDF、スプレッドシートからのテキスト抽出を自動化。
手作業の工数を数百時間削減。
AIによる業務自動化を体験しましょう。

Parseur rated 5/5 on Capterra
Parseur.com has the highest adoption on G2
Parseur.com has the happiest users badge on Crozdesk
Parseur rated 5/5 on GetApp
Parseur rated 4.5/5 on Trustpilot