またまた更新が滞ってしまいました。
Workbookをやってみようのシリーズ6回目です。所要時間は20分から30分とのことですがレベルは上級!頑張って行きましょう。
Tutorial #9: Adding Email Services (電子メールサービスを追加する)
Eメールサービスとは受信メールの本文、ヘッダ、添付ファイルを処理するApexクラスを利用することで自動化される処理のことです。
たとえば、受信したメッセージの連絡先情報に基づいて、取引先責任者レコードを自動的に作成する電子メールサービスを作成することができます。
このチュートリアルでは、マイル登録アプリケーションを更新するような電子メールサービスを作成します。
開発予定のApexロジックは、新しいMileageレコードを作成し、受信メールからのデータをそのレコードに投入します。
まず最初に、新しいオブジェクトを作成するApexクラスを定義し、そのコードを実行でき雨量に電子メールサービスを有効化します。
【前提条件】
「開発モード」「全てのデータの修正」「Apexを作成できる」パーミッション
このチュートリアルではApexの動作を含みますのでApexクラスを作成したり、電子メールサービスを設定できる権限がなければなりません。
メモ:DeveloperEditionの管理ユーザはすでにこれらのパーミションはデフォルトで付与されています。
マイレージ記録アプリケーション
(いつものことなんで説明は省略)
必要なソフトウェア
※最近Eclipse3.4で動作するプラグインができました。が、最新のEclipse3.5で動作するプラグインはまだのようです。
Step 1: Create the Email Class(Eメールクラスを作成する)
まず最初に電子メールサービスと関連づけるApexEメールクラスを作成しなければなりません。
1. Force.comIDEを開きます。
2. MileageTrackerプロジェクト内にいることを確認します。
3. プロジェクトフォルダを右クリックして【新規】→【Apex Class】
4. 「Create Apex Class」画面で「Name」に「EmailToApex」と記述し、Template項目で「Inbound Email Services」を選択します。
5. 【終了】をクリックしてクラスを作成します。
Step 2: Add a Utility Method (ユーティリティメソッドの追加)
電子メールの本文を解析するために使用されるユーティリティメソッドを作成する必要があります。
このコードは、電子メールのテキスト1行を「plainTextBody」として、「pLabel」の長さから始まる部分を除いた(Offset)、その行の残りの部分を返します。
このユーティリティメソッドを使用して、Mileageオブジェクトに使用する適切な値を抽出します。
クラスに以下のメソッドを追加します:
public static String getFieldValue(String plainTextBody, String pLabel) {
Integer startPos = plainTextBody.indexOf(pLabel);
Integer endPos = plainTextBody.indexOf('\n');
return plainTextBody.substring(startPos+pLabel.length(),endPos);
}
Step 3: Add Logic to Deconstruct Inbound Email(受信メールを分解するロジックを追加)
後でSalesforceの機能にメールを有効にすると、指定されたSalesforceのメールアドレスで受信したすべてのメールは、電子メールの内容、添付ファイルを含むInboundEmailオブジェクトを作成します。これらのオブジェクトが動作するためには、 EmailtoApexクラスは、 Messaging.InboundEmailHandlerインターフェイスを実装する必要があります。電子メールサービスが稼働するためには、クラスはglobalで宣言される必要があります。
InboundEmailHandlerインターフェースを実装しているので、 handleInboundEmailメソッドの定義が必須です。このメソッドは、 2つの入力パラメータ:受信メールとenvelopeを必要とし、Messaging.InboundEmailResultオブジェクトを返します。
1. handleInboundEmailメソッド内に、受信メールを分解するロジックを追加します。メソッドは、 Messaging.InBoundEmailResultオブジェクトを返すので、最初の行でインスタンスを作成します。例では、件名は、取引先責任者の名前が含まれます。この値は、 2行目email.subjectを使用して抽出されています。 3行目では、先に定義したユーティリティメソッドをMileageオブジェクトのMile項目の値を抽出するために採用しています。
Messaging.InboundEmailResult result = newMessaging.InboundEmailResult();
String contactName = email.subject;
Double mileageInt = Double.valueOf(getFieldValue(email.plainTextBody, 'Miles:'));
2. まず取引先責任者を検索し、マイレージレコードを作成するロジックを追加します。
このコードのこの部分では、電子メールの件名から抽出された取引先責任者の名前に基づいたSELECTクエリが返して来た取引先責任者の一覧を含むリストをインスタンスとして作成します。
contactNameの前後パーセンテージの記号(’%')はSELECTクエリの検索でワイルドカードとして使用することができます。
次に、登録されるMileage__cレコードのリストをインスタンス化します。電子メールの件名を条件とする取引先責任者の検索クエリをtry…catchブロックに書いて行きます。
forループ文を利用して結果のリストからnewMileageレコードを作成して行きます。Mileage__cには電子メール本文から抽出されたマイルの数と同様に、検索結果の取引先責任者の名前も含みます。
それからinsert newMileageを呼び出すことによって、レコードを挿入します。
List <Contact> contactResult = new List<Contact>();
contactName = '%'+contactName+'%';
Mileage__c[] newMileage = new Mileage__c[0];
try {
for (Contact c:
[Select Id, Name, Email From Contact Where Name like :contactName Limit 1]) {
newMileage.add(new Mileage__c(miles__c = mileageInt, Contact__c = c.Id));
}
insert newMileage;
} catch (System.Exception e) {
System.debug('Error:' + e);
}
3. 最後のステップは、結果を返すことです。handleInboundEmailメソッドの最後に以下の通り追加します:
result.success = true; // If false, an email can be sent back with a message
return result;
4. クラス全体が以下のようになっていることを確認します:
global class EmailToApex implements Messaging.InboundEmailHandler {
public static String getFieldValue(String plainTextBody, String pLabel) {
Integer startPos = plainTextBody.indexOf(pLabel);
Integer endPos = plainTextBody.indexOf('\n');
return plainTextBody.substring(startPos+pLabel.length(), endPos);
}
global Messaging.InboundEmailResult handleInboundEmail(Messaging.inboundEmail email,
Messaging.InboundEnvelope envelope) {
Messaging.InboundEmailResult result = new Messaging.InboundEmailResult();
String contactName =email.subject;
Double mileageInt = Double.valueOf(getFieldValue(email.plainTextBody, 'Mileage:'));
List<Contact> contactResult = new List<Contact>();
contactName = '%'+contactName+'%';
Mileage__c[] newMileage = new Mileage__c[0];
try {
for (Contact c :
[Select Id, Name, Email From Contact Where Name like :contactName Limit 1]) {
newMileage.add(new Mileage__c(miles__c = mileageInt, Contact__c = c.Id));
}
insert newMileage;
} catch (System.Exception e) {
System.debug('Error: ' + e);
}
result.success = true; // If false, an email can be sent back with a message.
return result;
}
}
5 。 【ファイル】→【保存】してください。
メモ:プロジェクトがオフラインモードの場合はサーバに保存されるまで EmailToApexクラスを使用することはできません。
クラスをサーバーに保存するには:
1. IDE内で「Classes」フォルダを選択し右クリック 【Force.com】→【Save to Server】
2. 保存の確認で【はい】をクリック
3. クラスを保存した結果としてエラーや警告が発生した場合は【問題】タブをチェックします。
Step 4: Set Up Email Service(電子メールサービスの設定)
54ページのStep 3:「 受信メールを分解するロジックを追加」で完成させたEmailToApexクラスを使うには電子メールサービス設定する必要があります。
1. オンラインで【設定】→【開発】→【電子メールサービス】
2. 【新規電子メールサービス】
3. 「電子メールサービス名」に「MyEmailService」
4. 「Apexクラス」に「EmailToApex」
5. 「受け入れる添付ファイル」に「なし」
6. 「高度な電子メールセキュリティ設定」を選択
7. 「許可する送信元」にyourdomain.com
メモ:例えば、お使いのメールアドレスがabc@xyz.comであれば、あなたの電子メールドメインはxyz.comです
8. 「有効」を選択。
9. 【保存】をクリックします。
Step 5: Specify an Email Address(電子メールアドレスを指定する)
電子メールサービスのセットアップが終わったので、ユーザがメールを送ることができる電子メールアドレスを指定する必要があります。
1. 【設定】→【開発】→【電子メールサービス】「 MyEmailService」の名前部分をクリック
2. 【新規電子メールアドレス】をクリック
3. 「電子メールアドレス」に「mileagetracker」
4. 「有効」を選択
5. 「コンテキストユーザ」にメール処理を引き受ける電子メールサービス権限を持っているユーザを割り当てます。
6. 「許可する送信元」は空白のままにしておきます。
7. 【保存】をクリックします。
Force.comプラットフォームは、入力をもとにユニーク(唯一)なメールアドレスを生成します。
Step 6: Test the Email Service (電子メールサービスをテストする)
任意の電子メールクライアントから、56ページのStep 5:「 電子メールアドレスを指定する」で生成されたメールアドレスにメッセージを送信します
オンライン上で作業している場合は、生成された電子メールアドレスをクリックするだけでメール送信ができることがあります。
1. 電子メールの各項目は以下のようにします。
- 件名は「Stumuller Pat 」
- メール本文は「Miles:50」
2. メールを送信します。
3. DeveloperEditionで組織にログインします。
4. Mileageタブへアクセスし、ビューで「全て」を選択し【Go】をクリック
5. 電子メールを介して作成したばかりのマイレージレコードのエントリーを確認できるはずです。
※日本語でsalesforceプラットフォームを利用している場合、件名をworkbookの通りに「Pat Stumuller」とするとうまくいきません。
メール本文に書く「Miles:50」もコロンと50の間に空白があるだけでうまくいきません。(ま、ソース見りゃ分かる話ですが。。)
おかしいと思ったら、Step 4:にて「失敗時のレスポンス設定」を「メールを返送」とするとエラーメールが帰ってくるのでわかりやすいです。
Summary(要約)
このチュートリアルでは、「InboundEmailHandler」インターフェイスを実装するApexクラスを作成しました。 Salesforceが受信メールを処理するためにこのApexクラスを利用するように電子メールサービスを定義もしました。
メールサービスを作成するときに以下のことを思い出してください。受信メールを処理するApexクラスに関連付ける必要があること。
また、 Apexのクラスは、メール本文のいかなるバリエーションも適切に処理できるよう確認する必要があります。この例では、getFieldValueメソッドが挙げられます。
関連する投稿
最近のコメント