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

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

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

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

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

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

少し宣伝:Parseurのご紹介

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

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

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

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

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

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

1. メールの取得

現時点では、メールは従業員個々の受信トレイやチームのメーリングリスト、会社の全体メールボックスなどに届いています。

最初のステップは、これらすべてのメールボックスを集約するメールアカウントを用意することです。あるいは場合によっては、独自のメールサーバー、つまりSmtpサーバーをセットアップすることになるかもしれません。

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

  • Exim:無料・オープンソースのメール転送エージェント(メールサーバーの別名でもあります)。Eximは最も人気のあるSMTPサーバーで、次点のPostfixよりもやや速いペースで普及しています。
  • Postfix:こちらも無料・オープンソースで、可用性と安定性に優れ、「とにかくよく動く」ことで評判です。サーバーシェア統計(2023年版)によると、EximとPostfixでメールサーバーの80%以上をカバーしています。
  • Exchange:Microsoft系のメールサーバーで、EWSで接続できますし、POP3IMAPなど従来の方法でも利用可能です。Exchange Onlineというクラウドホスティングサービスも利用できます(有料)。
  • 独自構築:この道を選ぶと長い道のりになりますが、多くの学びを得られます。結果としてサーバーが自社ニーズにぴったり合う可能性があります。ただし、世の中に無数にあるメールクライアントとの互換性はあまり期待できません。どうしても独自構築するなら、Pythonにはその出発点となるsmtpdモジュールが標準で用意されています。

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

また近年、独自メールサーバー環境の構築人気は低下傾向にあります。クラウドやSaaSが台頭し、煩雑な運用から解放されるホスティング型Eメールサービスが多くなりました。代表的なサービスは:

  • Postmark:配信到達率・信頼性が高く、無料プランあり
  • Mandrill:早期から普及し人気。マーケティングやトランザクションメール特化
  • Sendgrid:こちらもマーケティング・通知系に強い
  • Mailgun:開発者やAPI用途に特化、無料プランあり

Parseur チームではPostmarkを最も推奨しています。API設計も非常に優れており、ドキュメントも充実。主要なプログラミング言語向けのSDKも多数提供されています。

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

メールのフォーマットは非常に歴史が長く、「スターウォーズ以前」から存在する古い規格であり、現代用途には向かない課題が多くあります。例えば国際化(非米国文字)対応は最初の仕様には含まれていませんでした。特殊文字、例えば€などを扱うには、以下のような複数の技術文書(RFCとも呼ばれます)に準拠する必要があります:

  • RFC 2047:ヘッダー内の国際化された名前や件名のサポート
  • RFC 5890:DNS内での国際化ドメイン名のサポート
  • RFC 6532:メールヘッダー内でUTF-8(国際化テキストの保存方式)の利用を許可

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

今後統計処理など非逐次処理が一切不要という前提がある場合はMongoDBなどNoSQL系も選択肢にできますが、このブログ記事の通り注意が必要です。

たいていはSQLベースのリレーショナルDBMSでまかなえます。最低限、メール用テーブルと添付ファイル格納用テーブルを定義すれば十分運用できます。

主なリレーショナルDBの選択肢:

  • MySQL およびその推奨系MariaDB(オラクルがMySQLを買収してからはサポートがやや弱体化)
  • Postgresql(より多機能でスケーラビリティあり。ただし構築はMySQLより難しめ)
  • 商用ではOracle(機能豊富・大企業向き・高コスト。本当に必要か要検討を)
  • Microsoft SQL Server(近年機能向上しており、Oracleの競合候補になりつつある)

ここまでで「メール全文を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)

この難題を克服する典型的なアプローチをいくつかご紹介します。

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

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

この手法はセンチメント分析に適しています。たとえば「喜んでいる顧客」カテゴリと「激怒している顧客」カテゴリを用意し、単語解析で「喜んでいる顧客」のメールは上司へ、「激怒している顧客」のメールはゴミ箱へ…といった処理も考えられます(もちろん冗談ですが、イメージは伝わると思います)。

ただし、人間同士のコミュニケーションは曖昧さ・文脈依存が強く、現状のAIやパーシング技術だけでは完全な自動化には到達しません。誤分類や認識の揺れが避けられない場合も多いです。

正規表現

自動生成された定型メールの場合、このアプローチは非常に有効です。

例えばアメリカン航空の予約メールを100万通解析し、搭乗者名だけ抜き出したい場合、正規表現でメール全体に一致し、搭乗者名だけキャプチャする式を作れます。ですが、他の本文パーツも変化する場合や、複数名分など予想外のレイアウトが現れるケースでは管理や保守性が問題になることも。

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 rated 5/5 on GetApp
Parseur rated 4.5/5 on Trustpilot