外部システムのメールからSalesforceにデータを作成する方法
はじめに
こんにちは。エヌデーデー溝呂木です。Salesforce 開発に携わって3年目になります。
今回はSalesforceが自動生成する指定アドレスにメールが届いたらカスタムオブジェクト、または標準オブジェクトにデータを作成する方法を紹介します。
Mail2xという無償開発パッケージを導入します。
想定する読者
- メールtoケースのイメージで別オブジェクトを作成したい人。
- 外部システムから送信されるメールをトリガにSalesforce側にデータを作成したい人。
コンポーネントの特徴
- メールの取り込みが任意のオブジェクトへ出来ます。
- 取り込み設定は新規・追加もノンコーディングで開発不要です。
- 画面フローによる設定ガイド付きなので非エンジニアでも設定が簡単にできます。
- 正規表現で取り込み内容のカスタマイズもコーディングなしで可能です
制約事項
- カスタムオブジェクトを4つ使用します。
(Lightning Starter Packなどカスタムオブジェクト数に制限がある場合は注意) - セールスフォース・ジャパン社が無償提供しているノンサポートのパッケージです。
- 開始テキストと終了テキストで取込値を設定するため、メールのフォーマットは決まっている必要があります。
- HTMLメールには非対応です。(テキストのみ)
- 取り込みで指定できるフィールドは”テキスト(ロング/リッチ)”と”日付/時間”のみとなります。
- 取り込み内容がSalesforceのデータフォーマットと一致すれば他のフィールド指定可能ですが、
システム側の調整は行っていないです。
日付/時間の対応可能な変換は以下となります。
YYYY年MM月DD日hh時mm分
YYYY/MM/DD hh:mm:ss
YYYY-MM-DD hh:mm:ss
実現イメージ
パッケージのインストール
インストールURLからパッケージを”すべてのユーザのインストール”でインストールします。
※”すべてのユーザのインストール”でインストールしているのは手順書通りとなります。
メールサービス設定
メールサービス名は任意の名称、Apexクラスには必ず“MailMatchingHandler”を指定します。
有効にチェックを入れ、保存&新規メールアドレスボタンを押下します。
メールアドレス名に任意の名称を指定し、保存ボタンを押下します。
画面下部のメールアドレスが受け付けるメールアドレスになります。
コンポーネント設定
注意事項
基本的にはMail2X コンポーネント.pdfの手順通り設定すれば問題ありませんが、1点注意事項があります。
マッチングとは、メール本文のテキストをSalesforceの項目へ取込むための設定です。
連続してマッチング設定を追加したい場合は、続けて入力するにチェックを入れます。
次へを押下することで連続してマッチング設定の追加を行うことができますが、この時点ではマッチング設定は保存されていません。
続けて入力するにチェックを入れなかった場合、以下の完了メッセージが表示されます。
ここで完了を押下することでマッチング設定が保存されます。
Mail2Xマッチングサンプル
Mail2X設定サンプル集.pdfを参考に設定してください。
その他、通常の正規表現を用いることでもマッチング作成を行うことができます。
苦労した点
取り込んだメール本文から各項目に値を振り分けようと思ったのですが、メールコンポーネントの標準機能だけでは各項目への振り分けが難しくカスタマイズが必要であることがわかりました。
そのため本来はノンコーディングで使用可能なパッケージですが、コーディングでカスタマイズを行いました。
本章ではメール本文の取込後、各項目へ振り分けるために行ったカスタマイズ方法を記載します。
苦労した点①-メール本文の解析
解析するメール本文の形式
メールコンポーネントの標準機能として、開始テキストと終了テキストを指定することで項目に振り分ける際のテキストの範囲を指定できるのですが、以下のように同じテキストが並んでいるため、標準機能での振り分けができませんでした。
そこで、次のようにして各項目への振り分けを行いました。
メール本文の取得
まず、メールコンポーネントの標準機能で作成されたレコードから解析するメール本文を取得します。
メソッドは以下の通りです。
public String getMailBody(List<Mail2X__c> records) {
String mailBody = null;
for (Mail2X__c mail2X : records) {
mailBody = mail2X.MailBody__c;
}
return mailBody;
}
正規表現でメール本文から指定文字列を複数取得
PatternクラスとMatcherクラスを使用して、「メール本文の取得」で取得したメール本文から指定文字列をリストで取得します。
以下は商品コードを取得するメソッドです。
「商品コード : 001-01」の’001-01’のみを取得することが難しかったため、まずは正規表現で「商品コード : 001-01」の形で取得し、次にremoveStartメソッドを用いて「商品コード :」の文字列を除去することで商品コード「001-01」を取得しています。
public void getItemCode(String mailBody, List<Mail2X__c> records) {
//正規表現:商品コード取得用
String Regex = '商品コード :*(.*?)\\n';
//正規表現をPatternにコンパイルし、mailBodyに一致するMatcherを作成する
Pattern P = Pattern.compile(Regex);
Matcher M = P.matcher(mailBody);
//マッチした文字列から文字列'商品コード:'を削除してリストに追加
List<String> itemCodeList = new List<String>();
while(M.find()){
String itemCode = itemCodeM.group().removeStart('商品コード : ');
itemCodeList.add(itemCode);
}
}
苦労した点②-項目への振り分け
以下のようにItemCode1、ItemCode2 … というように振り分ける項目それぞれを指定していたため、
コードが長く読みづらくなってしまっていました。
(実際にはItemCode30まであるため、もっと長くなっていました…)
for (Mail2X__c Mail2X : records) {
if (itemCodeList.size() >= 1) {
Mail2X.ItemCode1__c = itemCodeList.get(0);
}
if (itemCodeList.size() >= 2) {
Mail2X.ItemCode2__c = itemCodeList.get(1);
}
if (itemCodeList.size() >= 3) {
Mail2X.ItemCode3__c = itemCodeList.get(2);
}
if (itemCodeList.size() >= 4) {
Mail2X.ItemCode4__c = itemCodeList.get(3);
}
if (itemCodeList.size() >= 5) {
Mail2X.ItemCode5__c = itemCodeList.get(4);
}
}
振り分ける項目名はItemCode1、ItemCode2 … というように数字の部分以外は変わらないため、
以下のように変数で項目の更新を行うことで、短く読みやすいコードに改善することができました。
for (Integer idx = 0; idx < itemCodeList.size(); idx++) {
for (Mail2X__c mail2X : records) {
String itemCodeFieldName = 'ItemCode' + (idx + 1) +'__c';
mail2X.put(itemCodeFieldName, itemCodeList.get(idx));
}
}
作成されるデータ
以上の結果からSalesforceに作成されるデータは以下のようになります。
各項目への振り分け前
各項目への振り分け後
まとめ
メールコンポーネントの標準機能だけでもSalesforceにデータを作成することはできますが、
Apex開発を行うことで取り込んだメール本文から各項目への振り分けを行うといったようにより詳細なことができるようになります。