メール本文や件名から、必要な情報を抽出する

# はじめに

ワークフローの完了通知など、システムからメールで通知が送られてくるケースは多いかと思います。通知の受信をトリガーにした場合、メール本文や件名に含まれる情報を抽出する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/cbc9b95a-d96d-a366-c815-5c74866dab96.png)

Workatoを使って、これらの情報をどのように抽出すればよいでしょうか？

# 正規表現を使えばメール本文から情報が抽出可能

正規表現 (regular expression) というものを使うと、メール本文のテキストから条件に合う部分を抽出することが可能です。フォーミュラモード (formula mode) を使えば、簡単に正規表現を使うことが可能です。

### そもそも正規表現とは？

正規表現は、英語では regular expression と呼び、文字列のパターンを指定するための記述方法です。特定の文字列を検索、置換、抽出したりする際に使います。

例えば、以下のような用途があります：
- メールアドレスや電話番号の形式をチェックする
- 特定の単語を含む行を抽出する
- 文字列内の特定のパターンを別の文字列に置き換える

正規表現の構成要素の一例をあげると、以下のようなものがあります：
| 記号  | 意味 |
|-------|------|
| `.`   | 任意の1文字に一致 |
| `*`   | 直前の文字が0回以上繰り返される |
| `+`   | 直前の文字が1回以上繰り返される |
| `?`   | 直前の文字が0回または1回現れる |
| `[]`  | 括弧内のいずれか1文字に一致 |
| `^`   | 行の先頭に一致 |
| `$`   | 行の末尾に一致 |
| `{}`  | 直前の文字が指定回数繰り返される |
| `\d`  | 数字に一致 |

例えば、電話番号（日本の形式）をチェックする正規表現は以下のようになります：

```ruby:
^\d{2,4}-\d{2,4}-\d{4}$
```
この正規表現は、「2～4桁の数字、ハイフン、2～4桁の数字、ハイフン、4桁の数字」に一致します。


# メールのタイトル(Subject)、本文から情報を抽出するレシピの作成

### メール受信トリガーと変数を作成

今回の例では Outlookのコネクターを使用して、タイトルが「見積システム：ワークフロー完了メール」から始まるタイトル(Subject)でメールのみを対象とするように、トリガーコンディションを設定します。

そして、タイトル(Subject)に含まれる12桁の「見積番号」、本文に含まれる「件名」「受注先」「受注予定日」を格納する変数を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/2866372c-79d5-1b13-991a-9c7d815e35b1.png)

### 正規表現を用い、本文から「件名」「受注先」「受注予定日」を抽出

正規表現を使用するため、変数の初期値をフォーミュラモードに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/b45c2523-63bc-571c-a583-9a1df5e7b6e9.png)

メール本文のデータピル「Content」に対して、正規表現を使用して情報を抽出します。
「件名」の値を抜き出す場合、以下のコードを記述します。

```ruby:
[/件名 ： (.+)$/, 1]
```

これは、「件名 ： 」の後、「任意の一文字が0回以上繰り返され、最後が行末」に一致します。そして、()「かっこ」は、マッチした文字列から抜き出したい範囲を表す記号で、今回の例では、「件名 ： 」の後に続く行末までの文字列、すなわち抽出したい「件名」の情報となります。

また、[] を使わず、scan と first を使って、以下のようにも書くことが可能です。

```ruby:
.scan(/件名 ： (.+)$/).first.first
```

文字列抽出の原理は同じですが、scan を使用した場合、マッチした「部分文字列の配列」の配列で返されるため、最初の要素を返す first を使用します。

### 正規表現を用い、タイトル(Subject)から、「見積番号」を抽出

同様に、タイトル(Subject)から「見積番号」するために、フォーミュラモードに変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/2335e3ca-c597-f5b1-b9b9-0fb7f92c4cfd.png)

メールタイトルのデータピル「Subject」に対して、正規表現を使用して情報を抽出します。
「見積番号」の値を抜き出す場合、以下のコードを記述します。

```ruby:
[/見積システム：ワークフロー完了メール\(No.(\d{12})\) .+$/, 1]
```

これは、「見積システム：ワークフロー完了メール(」の後に、「12桁の数字」「) 」「任意の文字の繰り返し、最後が行末」と一致します。ここで、正規表現で「(」や「)」は特殊記号のため、「\\(」「\\)」という形で記述します。さらに、「\\d」は数字を表し、「{12}」は直前の文字（すなわち数字）が12回繰り返すことを表しています。そして、今回は「見積番号」すなわち、12桁の数字部分を抜き出したいため、その部分を()「かっこ」で括ります。

先ほど同様、[]を使わず、scan と first を使って、以下のようにも書くことも可能です。

```ruby:
.scan(/見積システム：ワークフロー完了メール\(No.(\d{12})\) .+$/).first.first
```

### 実行結果

レシピの実行結果です。変数の初期値に、メールのタイトルや本文から抽出した情報が格納されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3444315/02f2bfae-a545-f4b2-1281-08d6c2d881f1.png)

### String formulas のドキュメントを見てもわからない

公式ドキュメントの[String formulas#scan](https://docs.workato.com/formulas/string-formulas.html#scan) の記載をみても、この様な使い方は掲載されていません。実は、Workatoのフォーミュラモードは Ruby 言語のメソッド（関数）なのです。したがって、[Ruby の文字列クラス](https://docs.ruby-lang.org/ja/latest/class/String.html)をみることで、この様な詳細な仕様を知ることができます。


> **scan(pattern) -> [[String]]**
> pattern が正規表現で括弧を含む場合は、括弧で括られたパターンにマッチした部分文字列の配列の配列を返します。
> **[PARAM] pattern:**
> 探索する部分文字列または正規表現

つまり、情報収集する際、「Workato の文字列型の正規表現」として検索するのではなく、「Ruby の文字列型での正規表現」として検索すれば、より多くの情報やサンプルを見つけることが可能です。


# まとめ
まとめると、以下のようになります。

* 正規表現を使えば、メールのタイトルや本文から文字列を抽出可能
* 正規表現を使うにはフォーミュラモードを使用する
* フォーミュラは実は Ruby のメソッド（関数）であり、Ruby として検索することでより多くの情報を収集可能

# おわりに
いかがでしょうか？ 正規表現を活用することでメールのタイトルや本文などの文字列から、任意の部分文字列を抽出することができます。定型的なメールであれば、正規表現でルールを記述することで、簡単に情報を抽出することが可能です。

Workatoの導入・導入後の活用などでお困りの場合、Workatoリセラーにご相談する方法もございます。お困りごとがございましたら、認定リセラーの[日立ソリューションズ](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato)へ是非ご相談ください。

# 参考リンク

* 株式会社 日立ソリューションズ
    * [Workato ご紹介サイト](https://www.hitachi-solutions.co.jp/rpa/sp/products/workato)
* Workato 公式サイト
    * [String formulas](https://docs.workato.com/formulas/string-formulas.html)
* 本記事のサンプルレシピ
    * JPデータセンター利用者向け 
        * [[Example] Extract information from E-mail by using regex](https://app.workato.com/recipes/49023896?st=571a2594b43101ab73ea90e7c854342bb430ec9e12bdf51c6a7653060f42e543)
    * USデータセンター利用者向け
        * [[Example] Extract information from E-mail by using regex](https://app.jp.workato.com/recipes/415837?st=20591f3fe4b83ac72c4bad75db4c817685eda02377e318fc6bb1431271d77ac9)