教材

【RPA入門】UiPathの使い方6~複数の受信メールからのデータ抽出(正規表現)

uipath extract mail

RPAの入門として、UiPathの使い方を紹介していきます。今回は、複数の受信メールから指定したデータを抽出する処理を自動化したいと思います。データの抽出には正規表現(パターンマッチング)を使用します。

1. UiPathの初期設定

【RPA入門】UiPathの使い方1~Webデータ取得(テキスト編)」の記事のStep.1からStep2までを実行してください。

 

2. 受信メールの作成

先ずは、下記のようなメールを受信トレイに3つ用意します。各メールで、予約内容のデータを適当に変更しておいてください。今回は、メール本文から以下のデータを抽出することにします。

  • 予約番号
  • 日付
  • 開始時刻
  • 終了時刻
  • 利用料金

create mail

 

受信トレイにはダミーメールも2つ入れておきます。なお、メール本文はHTMLメールではなく、テキストメール(プレーンテキスト)にしてください。

mail list

 

3. 出力ファイルの作成

メールから抽出したデータを保存するために、下記のようなExcelファイルを作成しておきます。ファイル名は「リスト.xlsx」、シート名は「リスト」としました。

create output file

 

4. UiPathのワークフロー構築

【Step.1】Mainワークフローを開く

ワークフローを構築していくために、画面左下の「Activities」タブを選択し、画面中央の「Open Main Workflow」をクリックします。

open main workflow

 

【Step.2】パスワード情報の設定

メール取得の設定を行う前に、設定で必要になるパスワード情報を準備します。画面左側のアクティビティ検索窓に「password」と入力します。表示された「Get Password」アクティビティをワークフロー内にドラッグ&ドロップします。

get password

 

アクティビティのプロパティ設定を行います。パスワード(Password)には、使用するメールアドレスのパスワード情報を入力します。パスワードは暗号化され、*印でマスクされます。パスワードを保存する変数名(Result)には、「password」という名称の変数を新規作成してセットします。

なお、今回は動作確認のために一時的に「Get Password」アクティビティを使用しました。ただし、「Get Password」アクティビティでの永続的なパスワード管理は非推奨のようです。詳細はこちらの公式サイトの内容をご確認ください。

 

【Step.3】受信メールを取得する

受信トレイにあるメール(複数)を取得します。メールを取得するアクティビティには幾つか種類がありますが、今回は「Get IMAP Mail Messages」を使用します。画面左側のアクティビティ検索窓に「mail」と入力します。表示された「Get IMAP Mail Messages」を、「Get Password」の下にドラッグ&ドロップしましょう。

get mail

 

下表の通り、アクティビティのプロパティ設定を行います。

プロパティ項目 入力値 備考
MailFolder
"Inbox"
取得先のフォルダを指定します。デフォルトの受信トレイの場合は「Inbox」を指定します。
Port 993 ポート番号です。Gmailを使用する際は993を設定します。
Server
"imap.gmail.com"
サーバー情報です。Gmailを使用する際は、imap.gmail.comを設定します。
Email
"xxxx@xx"
あなたのメールアドレスです。xxxxには適切な値を入力してください。
Password password メールアドレスのパスワードです。変数passwordを設定します。
OnlyUnread
Messages
チェックなし 未読メールのみ取得する設定です。今回は既読メールを取得するので、チェックを外します。
Top 10 取得するメールの件数です。今回は受信トレイの一番上から10件の既読メールを取得します。
Messages mailList 取得したメール(複数)を保存する変数です。新たな変数mailListを新規作成してセットします。

 

今回はGmailの受信メールを取得しますが、他のメールサーバーを使用する際は、ポート番号やサーバー情報などを適宜変更してください。なお、Gmailの受信メールをIMAPで取得する場合は、一時的に下記の設定を行ってください。この設定でセキュリティレベルが低下するため、動作確認が終わった後は、必ず設定を元に戻すことを忘れないでください。

 

【Step.4】出力ファイルを開く

データの保存先のExcelファイルを開くために、「Excel Application Scope」アクティビティを使用します。画面左側のアクティビティ検索窓に「excel」と入力します。表示された「Excel Application Scope」を、「Get IMAP Mail Messages」の下にドラッグ&ドロップします。

続けて、アクティビティのプロパティ設定を行います。フォルダアイコンをクリックして、出力ファイル(リスト.xlsx)を指定します。以降は、「Excel Application Scope」のDoコンテナ内に、実行したい処理を追加していきます。

open excel

 

【Step.5】受信メールを1件ずつ処理

受信メールを1件ずつ取り出して、順にデータを抽出していきたいです。変数mailListに保存されたメールを1件ずつ取り出すために、「For Each」アクティビティを使用します(※「For Each Row」と間違わないように)。

画面左側のアクティビティ検索窓に「foreach」と入力します。表示された「For Each」を、Doコンテナ内にドラッグ&ドロップします。

for each

 

続けて、アクティビティのプロパティ設定を行います。繰り返すデータ(Values)には、「mailList」を入力します。変数mailListに保存されたメールから1件ずつ取り出し、順に変数itemに代入され、「For Each」のBodyコンテナ内で変数itemの値を参照することができます。

 

なお、「For Each」アクティビティを使う場合は、繰り返すデータ(Values)のタイプを指定する必要があります。タイプ(TypeArgument)のプルダウンリストから「Browse for Types…」をクリックすると、タイプの設定画面が表示されます。

「Type Name:」の入力欄に、「System.Net.Mail.MailMessage」と入力すると、「MailMessage」タイプが表示されます。これを選択して、「OK」ボタンをクリックしましょう。これで、繰り返すデータ(Values)のタイプを「MailMessage」に設定することができました。

select type

 

【Step.6】受信メールリストの確認

下図を見てください。

view mail list

 

「For Each」では、各メールが変数itemに代入されます。各メールの題名や本文などを取得するには、下記のように記述します。最後のToString()はデータの型を文字列に変換するメソッドです。この辺りは深く気にせずに、おまじないと思って割り切りましょう。

送信者 → item.From.ToString()
題名 → item.Subject.ToString()
本文 → item.Body.ToString()

 

【Step.7】メールの題名を取得

各メールの題名を取得するには、「item.Subject.ToString()」と記述します。以降の処理で、このメールの題名を何度も使用する場合は、変数を新規作成して、題名を保存しておくことを勧めます。また、適切な名前の変数に保存することで、ワークフローの可読性を高めることもできます。

変数を新規作成して、何かしらの値を保存するには、「Assign」アクティビティを使用します。画面左側のアクティビティ検索窓に「assign」と入力します。表示された「Assign」を、「For Each」のBodyコンテナ内にドラッグ&ドロップします。

assign mail title

 

アクティビティのプロパティ設定を行います。変数名(To)には、「mailTitle」という名称の変数を新規作成してセットします。保存する値(Value)には、「item.Subject.ToString()」を入力します。これで、メールの題名は、変数mailTitleに保存されました。

 

【Step.8】受信メールの条件分岐

今回は、メールの題名が「会議室の予約完了のお知らせ」に完全一致したメールのみ処理します。ダミーメールは処理しません。処理を条件分岐させるには、「If」アクティビティを使用します。画面左側のアクティビティ検索窓に「if」と入力します。表示された「If」を、「assign」の直下にドラッグ&ドロップします。

if

 

アクティビティのプロパティ設定を行います。「Condition」には任意の条件式を入力します。下記の式を入力してください。

mailTitle = "会議室の予約完了のお知らせ"

「If」アクティビティは、左側「Then」と右側「Else」に分かれています。これは、「Condition」に記載した条件式を満たす場合は、左側の「Then」に設定した処理が実行されます。条件式を満たさない場合は、右側の「Else」に設定した処理が実行されます。

今回は、条件式を満たすメールのデータを抽出します。従って、以降では、データを抽出する処理を左側(Then)に追加していきます。右側(Else)には特に処理を設定する必要はありません。

 

【Step.9】メールの本文を取得

各メールの本文を取得するには、「item.Body.ToString()」と記述します。メールの題名と同様に、変数に保存しておきましょう。画面左側のアクティビティ検索窓に「assign」と入力します。表示された「Assign」を、「if」アクティビティのThenコンテナ内にドラッグ&ドロップします。

アクティビティのプロパティ設定を行います。変数名(To)には、「mailText」という名称の変数を新規作成してセットします。保存する値(Value)には、「item.Body.ToString()」を入力します。これで、メールの本文は、変数mailTextに保存されました。

assign mail text

 

【Step.10】正規表現でデータを抽出

では、メール本文から以下のデータを抽出していきます。説明は後回しにして、先にワークフローを作ってしまいます。正規表現(パターンマッチング)の詳細については、Step.11で解説しますのでご安心ください。

  • 予約番号
  • 日付
  • 開始時刻
  • 終了時刻
  • 利用料金

 

■「予約番号」の抽出

メールの本文から「予約番号」を抽出します。画面左側のアクティビティ検索窓に「match」と入力します。表示された「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。

match number

 

下表の通り、「Matches」アクティビティのプロパティを設定します。

プロパティ項目 入力値 備考
Input mailText 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。
Pattern
"\r\n●予約番号:(.*)\r\n"
検索する文字列です。正規表現で記載します。
Result number 検索された文字列を保存する変数です。変数numberを新規作成してセットします。

 

■「日付」「開始時刻」「終了時刻」の抽出

メールの本文から「日付」「開始時刻」「終了時刻」を抽出します。「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。

match date

 

下表の通り、「Matches」アクティビティのプロパティを設定します。

プロパティ項目 入力値 備考
Input mailText 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。
Pattern
"\r\n●日時  :(.*) (.*)~(.*)\r\n"
検索する文字列です。正規表現で記載します。
Result dateTime 検索された文字列を保存する変数です。変数dateTimeを新規作成してセットします。

 

■「利用料金」の抽出

メールの本文から「利用料金」を抽出します。「Matches」アクティビティを「Assign」の下にドラッグ&ドロップしましょう。

match price

 

下表の通り、「Matches」アクティビティのプロパティを設定します。

プロパティ項目 入力値 備考
Input mailText 検索の対象となる文字列です。メールの本文が保存されている変数mailTextを設定します。
Pattern
"\r\n●利用料金:¥(.*)(税込)\r\n"
検索する文字列です。正規表現で記載します。
Result price 検索された文字列を保存する変数です。変数priceを新規作成してセットします。

 

【Step.11】正規表現の解説

では、Step.10で登場した「Matches」アクティビティで使用する正規表現(Pattern)を解説していきます。先ずは、下図を見てください。

view match list

 

正規表現とは、文字列を検索する際のパターンの書き方です。メール本文を正規表現で検索した結果、検索がヒットした文字列が一ヶ所だけだと仮定すると、ヒットした文字列は、「変数名(0)」で取得することができます。検索が複数ヒットした場合は、N個目にヒットした文字列は「変数名(N-1)」で取得できます。

次は、正規表現のパターンと、実際に検索でヒットした文字列の関係を解説していきます。

 

■「予約番号」のパターン

メール本文の予約番号は、「\r\n●予約番号:(.*)\r\n」というパターンで取得できます。下図を見てください。

pattern number

 

正規表現のマッチングの精度を上げるために、検索対象(●予約番号:xxxxx)の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。

予約番号の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。

なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。

number(0).Groups(0) → \r\n●予約番号:14321\r\n
number(0).Groups(1) → 14321

 

■「日付」「開始時刻」「終了時刻」のパターン

メール本文の日時に関する情報は、「\r\n●日時  :(.*) (.*)~(.*)\r\n」というパターンで取得できます(※空白を含む)。下図を見てください。

pattern date

 

正規表現のマッチングの精度を上げるために、検索対象(●日時  :yyyy/m/d hh:mm~hh:mm)の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。

日付や時刻の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。

なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。

dateTime(0).Groups(0) → \r\n●日時  :2020/8/7 13:00~15:00\r\n
dateTime(0).Groups(1) → 2020/8/7
dateTime(0).Groups(2) → 13:00
dateTime(0).Groups(3) → 15:00

 

■「利用料金」のパターン

メール本文の利用料金は、「\r\n●利用料金:¥(.*)(税込)\r\n」というパターンで取得できます。下図を見てください。

pattern price

 

正規表現のマッチングの精度を上げるために、検索対象(●利用料金:¥x,xxx(税込))の前後に改行文字が存在すると考えて取り扱います。正規表現ではWindows環境の改行文字は「\r\n」と表記します。

利用料金の数字は、各メールによって変化します。そこで、これらの数字は、任意の文字が0個以上連続する文字列「.*」と表記します。「.」は任意の1文字を表します。「*」は直前の文字が0個以上連続する文字列を表します。

なお、「.*」などを括弧()で括ることにより、後にGroupsメソッドで値を前から順に取り出すことができます。Groups(0)はヒットした全体の文字列が取得できます。各メールに対して、実際に取得されるデータは下記のようになります。

price(0).Groups(0) → \r\n●利用料金:¥15,000(税込)\r\n
price(0).Groups(1) → 15,000

 

【Step.12】出力用のテーブルの作成

メール本文から必要なデータを抽出することができました。最後に、これらのデータを出力ファイルに書き込みます。ただし、データの数が多いため、セルに一つずつ書き込むと結構な時間がかかってしまいます。そこで、事前に出力用のテーブルを作成しておき、一括でファイルに書き込めるようにしたいと思います。

出力用のテーブルを作成するには、「Build Data Table」アクティビティを使用します。面左側のアクティビティ検索窓に「data」と入力します。表示された「Build Data Table」を、「Matches」の下にドラッグ&ドロップします。

build data table

 

アクティビティのプロパティ設定を行います。先ずは、作成したテーブルを保存する変数名(DataTable)に、「table」という名称の変数を新規作成してセットします。次に、「DataTable」ボタンをクリックすると、テーブルの設定画面が表示されます。

出力するデータは5つなので、テーブルに列を5つ用意します。今回は値だけを出力するので、列名は適当で構いません。テーブルの中身は後で追加するため、今は空のままで問題ありません。ここでは、列情報のみ設定した空のテーブルを作っておきます。

create header

 

【Step.13】行データの追加

Step.12で作成した空のテーブルに、行データを追加します。行データの追加は、「Add Data Row」アクティビティを使用します。「Add Data Row」を、「Build Data Table」の下にドラッグ&ドロップします。

add data row

 

アクティビティのプロパティ設定を行います。追加先のテーブル(DataTable)には、「table」を入力します。追加する行データ(ArrayRow)には、下記の式を入力します。これで、5列の一次元配列をテーブルに追加することができます。

{number(0).Groups(1), dateTime(0).Groups(1), dateTime(0).Groups(2), dateTime(0).Groups(3), price(0).Groups(1)}

 

【Step.14】出力ファイルへのテーブル書き込み

ワークフローの最後に、出力ファイル(リスト.xlsx)にテーブルを書き込む処理を追加します。なお、今回は、書き込む位置を指定せずに、ファイルの一番下にテーブルを書き込むようにします。画面左側のアクティビティ検索窓に「excel」と入力します。表示された「Append Range」アクティビティを、「Add Data Row」の直下にドラッグ&ドロップします。

アクティビティのプロパティ設定を行います。シート名(SheetName)には、「リスト」と入力します。書き込むテーブル(DataTable)には、「table」と入力します。これで、準備が完了しました。

append range

 

【Step.15】ワークフローの実行

では、上部パネルの「Debug File > Run」をクリックし、このワークフローを実行してみましょう。

run workflow

 

受信トレイのメールの各データが出力ファイルに書き込まれました。データが正しく抽出できていることが確認できます。最後に、変更したセキュリティの設定を元に戻しておいてください。

result

 

まとめ

今回は、複数の受信メールから指定したデータを抽出する処理を自動化しました。下記の点を理解して、他の業務にも応用できるようにしましょう。

  • 「Get IMAP Mail Messages」を使ったメールの取得
  • 「For Each」を使った繰り返し処理
  • 「If」を使った条件分岐
  • 「Matches」を使った正規表現による検索
  • 「Groups」メソッドを使用した値の取り出し
  • 「Buid Data Table」を使ったテーブルの作成
  • 「Add Data Row」を使った行データの追加
  • 「Append Range」を使ってテーブルを書き込む

 

最後に、UiPathに関する参考図書を一冊紹介しておきます。
できるUiPath 実践RPA <amazon.co.jp>

※本書の内容はネット上でも公開されているようです(できるネット)。

より深く「RPA」を学びたい方は、スクールでオンライン講義もやっていますので、良かったらこちらの記事もご覧ください。