【RPA例題】お問合せフォームからの定型メールを処理する

# 概要
WordPressなどを使ってWebサイトを立ち上げたときに、プラグインを使ってお問い合わせフォームを作成して来訪者とコミュニケーションをとる手段を作ることはよくありますよね！お問い合わせフォームの出力は、問い合わせが入るたびにメールで特定のアドレスに配信といったことが多いですが、受信したメールを元に応答する作業もばかにならないことがあります。ここをシステム化してそのまま顧客DBに入れるなんてことも普通は作りこめないので、メールを手作業で処理しているケースも多いのではないでしょうか。

ただ、これは定型作業になるので、RPAを使うと作業が削減できるところでもあるんです！社内にシステムを作る専門家がいない場合でも、RPAを使って簡単に処理をすることができます。**Automation Anywhere Enterprise 11.3.3**を使ってRPAで対応ロジックを組んでみましょう～

# 受信するメールの書式

改行によって区切られた行ごとに情報が掲載されています。「フォームの終わり:」という文字列を一番後ろにつけておくと後で役立ちます。

**件名: お問い合わせフォーム**

```:本文

会社名:
佐藤商事株式会社

ご担当者名:
佐藤 太郎

ご担当者名 (カタカナ):
サトウ タロウ

役職:
営業本部長

電話番号:
03-1234-5678

会社メールアドレス:
sato@sato-company.net

住所:
東京都世田谷区世田谷1-1-1

お問い合わせ内容:
資料請求

フォームの終わり:
```

# Automation Anywhereでのロボットの作成
それでは、ワークベンチを新しく開いてアクションリストを作成していきましょう(^^)/

### Email Automationコマンド
メールの自動化で使えるのが、Email Automationコマンドです。
3種類ありますが、この中で**「Get All Messages」コマンド**を使って、指定したアカウントからメールを読み込めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/92665b18-7c28-c13a-8363-08de53c69916.png)
「Get All Messages」コマンドをアクションリストにドラッグ＆ドロップすると、LOOPコマンドと一緒に以下のアクションが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/28a88c9a-9d0f-2e0b-b292-41a1e8013008.png)
続けて表示されるダイアログボックスでは、読み込みたいアカウント情報を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/68b270c6-db32-6295-1e10-f058e4a411e2.png)

POP3/IMAP4に対応したアカウントであれば、読み込みが可能です。
たとえばOffice 365のアカウントから読み込みたい場合、メールサーバー情報として以下の内容を入力します。

* **ホスト名:** outlook.office365.com
* **ユーザー名:** Office 365アカウントで利用しているユーザー名
* **パスワード:** Office 365アカウントで利用しているパスワード
* **サーバーが安全な接続(SSL)を使用:** ON
* **サーバータイプ:** IMAPでもPOP3でもOKですが、ここでは「POP3」を指定
* **ポート番号:** POP3なら「995」
* **メッセージ形式:** 「テキスト」を指定しておきます。(ただし、受信するHTMLメールの構造によってはHTMLタグが入ったソースの形式で変数に格納されることもあるようです)

※詳細は[こちら](https://docs.microsoft.com/ja-jp/exchange/clients-and-mobile-in-exchange-online/pop3-and-imap4/pop3-and-imap4)を参照してください。

### メール読み込みループの中で使える電子メール関連システム変数
このループの中では、[電子メールメッセージに関係する以下のシステム変数](https://docs.automationanywhere.com/bundle/enterprise-v11.3/page/enterprise/topics/aae-client/bot-creator/using-variables/email-system-variables.html?_LANG=jpjp)が利用可能です。これらの変数の内容にアクセスすることで、個別のメールの内容を知ることができます。ループでは受信した最新のメッセージが最初に読み込まれ、以後新しい順にすべてのメッセージに対してループが回ります。読み込んだメールはサーバーから削除されずに残ります。

* `$Email From$`: Fromフィールドの内容。アドレスだけでなく表示名も入ります。たとえば"`Hiroshi Sato <Hiroshi.Sato@company.com>`"となっている場合があります。
* `$Email Subject$`: 件名フィールドの内容。
* `$Email Cc$`: CCフィールドの内容。アドレスだけでなく表示名も入ります。たとえば"`Hiroshi Sato <Hiroshi.Sato@company.com>`"となっている場合があります。また、複数件のアドレスと表示名が含まれている場合もあります。(その場合、セミコロンで区切られています)
* `$Email Received Date$`: 受信日時 "`yyyy/MM/dd hh:mm:ss`" 等の形式。
* `$Email Received Time$`: 受信時間 "`hh:mm:ss +0900`" (タイムゾーン) 等の形式。
* `$Email Message$`: メール本文。HTML形式のメッセージの場合は、HTMLソースの形で格納されています。

### 必要回数だけループを回す
基本的にはループ内で一番最初のメッセージだけを処理すればよいのですが、前回の処理から間が空いていると、その間に受信したメールをすべて見る必要がある可能性があります。また、一瞬でたくさんのお問い合わせメールを受け取ることを想定すると、各メール受信ごとにトリガーでアクションリストが起動したときに、処理が追い付かない場合も考えられます。その際には、`$Email Received Date$`変数の内容を見ながら複数のメールを処理するかどうかを判定することもできます。それぞれの想定に従って、実際のロジックは組むとよいでしょう。ここでは、最初の受信メールを処理したらループを抜けるという一番簡単な処理を行います。

その場合は、ループの中の最後に**「Exit Loop」コマンド**を挿入します。これで、ループ内の処理を一回行っただけでループを出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/d596abf5-d4b1-f419-6ed5-9ddb25bfdef4.png)

### メール本文を解析する

[受信するメールの書式](#受信するメールの書式)の本文が、そのまま`$Email Message$`に入ります(HTML形式でなくテキスト形式で届くようにしておきます)。また、`$Email Subject$`には「お問い合わせフォーム」が入ります。

フォーム内のフィールドの場所を解析して、それぞれ以下の変数に入れるものとします。これらの変数を変数マネージャーで作成しておきます。

* 会社名=`$Company$`
* ご担当者名=`$Name$`
* ご担当者名 (カタカナ)=`$NameKana$`
* 役職=`$JobTitle$`
* 電話番号=`$TEL$`
* 会社メールアドレス=`$Email$`
* 住所=`$Address$`
* お問い合わせ内容=`$Category$`

解析方法ですが、`$Email Message$`の中でそれぞれのフィールドのキャプションで挟まれる文字列を**String Operationの「Before-After」コマンド**で抜き出します。

以下の例では、「会社名:」フィールドの値を、次の「ご担当者名:」との間の文字列として、空白や改行コードを取り去った値を`$Company$`変数に代入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/3ae84f97-d04e-635f-a802-816d10f18e0d.png)

他のフィールドも同様に処理すると、以下のアクションリストとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/a7c0bdb5-166c-5753-b75b-327790efff7e.png)

### 返信メールを送信する
メールを受け付けたら、相手にそれを通知しましょう。**「Send Email」コマンド**を使うと、メールを送信できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/ce924558-43ec-fed9-c971-7608edc8624c.png)

送信用のアカウントは、あらかじめオプションメニューで設定しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/488511d8-52c2-a2b3-bba8-081adea1e3ff.png)

メッセージ本文には、以下のように変数を交えた値を入れておきます。

```:メッセージの内容
この度はお問い合わせいただきまして誠にありがとうございました。
1営業日内に担当者よりご連絡させていただきます。

【お問い合わせ内容】

会社名:
$Company$

ご担当者名:
$Name$

ご担当者名 (カタカナ):
$NameKana$

役職:
$JobTitle$

電話番号:
$TEL$

会社メールアドレス:
$Email$

住所:
$Address$

お問い合わせ内容:
$Category$

```

アクションリストは以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/b9659bfa-2337-e204-4957-2f733d0aada9.png)


### Excelファイルに情報を転記する
メールから取得した値をExcelファイルに転記します。ここはお使いの顧客DBに将来的に置き換えることもできるでしょう。
お問い合わせ受付メールを送る前に、Excel内の既存データと照合して重複チェックをする場合は、上記の「Send Email」コマンドの前にこのロジックを挿入してください。

Excelファイルは `d:\address.xlsx`にあるものとします。

address.xlsxの内容:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/a93e441e-cf71-bb2a-0e78-845b46e55796.png)

先に完成したアクションリストを提示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/c783ed73-fd0a-9164-b88b-8c7a29631aba.png)

やっていることは以下の通りです(^_-)-☆

* (13) まずExcelファイルを開きます (`d:\address.xlsx`) **(Open Spreadsheet)**
* (14) 入っているすべてのデータをAAに取り込みます **(Get All Cells)**
* (15-21) ループを回して、各行ごとに入力済みの電子メールアドレス `$Excel Column(6)$`をチェック**(If/End If)**、今回新しく追加する予定のアドレスと同じでないかをチェックします。もし同じならタスクをその場で終了します。**(Stop The Current Task)**
* (22) アクティブセルを、データが入っている最後の行に持っていきます。**(Go To Cell)**
* (23) あらかじめ `$NewRow$`という変数を用意しておき、移動先のセルの行番号に1を足したもの (つまりデータが入っていない最初のセルの行番号)を代入します。
* (24-31) それぞれの列に変数に格納された値を代入します。**(Set Cell)** 
* (32) Excelファイルを保存します**(Save Spreadsheet)**

※冒頭の番号は行番号です。

これでアクションリストは一通り完成です！

### 電子メール受信トリガーを設定
アクションリストが完成したら、保存してClientの画面に戻ります。ここでタスクボットに対して「トリガー」を設定します。トリガーの種類は「Email Message」で、先ほどと同じアカウントを指定します。「ポーリング頻度」は、メールボックスをチェックする頻度です。メールが来る頻度を想定して、適切な値を設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/3e3498ca-a8cc-18ab-496b-c6e5dc4d87b5.png)
「保存」ボタンをクリックしてトリガーを保存します。

これで、アカウントヘのポーリングが開始されます。
ロボットが実行されると、このアカウントのサーバー側のメールは既読となります。

# 最後に
これでWebページのお問い合わせフォームと顧客DBや返信メールをRPAを仲介して連携するしくみ、簡単に作れることがわかりましたね(^^)/