メールサービスでメール取り込み

もうちょっとネタはないかと受験ガイドを読み漁っていたら、サンプル問題にメールサービスについての記述があったので、これも試験対策に入れちゃいます。
試験範囲には記載なかったけど出るのかな。。。

スポンサーリンク

メールサービスって

SalesForceでいうメールサービスの機能は、簡単にいうと、SalesForceのサーバ宛にメールを送ると、なんやかんや(Apexでの処理)してくれますよというメールを使ったサービスです。

まずはApexクラスを用意

設定の前に、メールサービス用のApexクラスを用意します。
メールサービス用のApexには書き方があって、Messaging.InboundEmailHandlerインターフェースを使用したApexクラスを作成する必要があります。

設定→開発→メールサービスを開くと、メールサービスの画面と共に、以下の注意書きが表示されているので、これにしたがってApexを記述すればOKです。

global class myHandler implements Messaging.InboundEmailHandler {
	  global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
		  Messaging.InboundEmailResult result = new Messaging.InboundEmailresult();
          return result;
      }
  }

Messaging.InboundEmailHandlerインターフェースを使用すると、handleInboundEmailメソッドがもれなくついてくるので、この中にメールの内容を処理して、Messaging.InboundEmailResultクラスに結果を返却するという一連の動作を記述する必要があります。

ということで、この書き方にしたがって、Apexクラスを記述します。
今回は、メールを受信したら、タスクに自動登録するようなビジネスロジックを記述します。
メールの内容も取り込めるように、タスクの件名にメールの件名を、コメントのところにメールの本文を反映させるようにします。
期限とかステータスの設定は省略しています。

出来上がったコードはこちらです。
HogeMail.cls

global class HogeMail implements Messaging.InboundEmailHandler {
    global Messaging.InboundEmailResult handleInboundEmail(Messaging.inboundEmail email, 
                                                       Messaging.InboundEnvelope env) {
        // 結果返却用のクラス
        Messaging.InboundEmailResult result = new Messaging.InboundEmailResult();
                                                           
        // メール本文を取得
        String title= email.subject;
        String contents = email.plainTextBody;
    
        try {
            // 自ユーザにタスクを自動的に追加
            // Subjectにメールの件名を
            // Descriptionにメールの本文をいれる
            insert new Task(Subject = email.subject,
                            Description =  contents);
            // Insert完了で成功を返す
            result.success = true;
        } catch (QueryException e) {
            // 例外発生時はMessaging.InboundEmailResultにメッセージをセット
            result.success = false;
            result.message = e.getMessage();
        }
        return result;
    }
}

今回は、Messaging.InboundEnvelopeクラスは使っていませんが、差出人と宛先が入ったクラスになります。
現実味のある使い方としては、

  • 宛先を取得して、宛先と一致する取引先責任者orリードを取得し、タスクの名前(Who)に紐付ける
  • 宛先にあるメールアドレスからリードを作成する

といった使い方になるでしょうか。

処理結果は、Messaging.InboundEmailResultクラスに入れることになります。
成功したか(success)とメッセージ(message)がサポートされていますので、例外時はフラグをfalseとしてメッセージをセットするようにしておきましょう。

テストクラスはどうやって書く

Apexクラスを作ったはいいとして、結局カバレージをなんとかしないといけないので、テストクラスも書かないといけません。
でも、テストクラスは実は特別な書き方をする必要はありません、
引数として、Messaging.InboundEmailとMessaging.InboundEnvelopeが必要になってくるので、それはnewすることで作成可能です。
newしたあとはメールの内容や宛先など、setterとしても使用できるのでテスト用に設定してあげればOKです。
handleInboundEmailメソッドの実行も、単にクラスをnewしてメソッドを呼び出せばテスト可能です。
Testクラスなどで、メール送信処理みたいなことは特に必要ありません。

ということで、上記コードのテストクラスはこちらです。
HogeMailTest.cls

@isTest
private class HogeMailTest {
	@IsTest
    static void mailTest() {
        
        HogeMail hm = new HogeMail();

        // 引数に指定するメールと宛先
        Messaging.inboundEmail email = new Messaging.inboundEmail();
        email.subject = 'Hoge';
        email.plainTextBody = 'Hoge Hoge';

        Messaging.InboundEnvelope env = new Messaging.InboundEnvelope();
        env.fromAddress = 'test@hoge.co.jp';

        // メールサービスの結果(期待値)
        Messaging.InboundEmailResult expect = new Messaging.InboundEmailResult();
        expect.success = true;

        Test.startTest();
        
        Messaging.InboundEmailResult result = hm.handleInboundEmail(email, env);
        System.assertEquals(expect.success, result.success, 'Hoge');
        System.assertEquals(expect.message, result.message, 'Hoge');

        Test.stopTest();
    }
}

メールサービスの設定をする

Apexクラスが整ったら、メールサービスの設定をします。

まずは、メールサービスを作成します。
新規メールサービスでメールサービスを定義します。
Apexクラスには先ほど作ったApexクラスを指定します。
※ここでのApexクラスはMessaging.InboundEmailHandlerインターフェースを使用したクラスでないと指定出来ないようになっています
メールサービスの設定

続いて、メールアドレスを設定します。
コンテキストユーザは実際にApexを実行されるユーザとなります。
メールアドレスの設定

メールアドレスを作成すると、以下のように長ったらしいメールアドレスが出来上がりました。
これが、SalesForce内部処理用のメールアドレスになります。
Salesforce用の発行されたメールアドレス

これでSalesForce内でのメールサービスの設定は終了ですが、現実的にはこの長ったらしいメールを覚えられる人はいないでしょう。
メールの転送設定などで会社用のメールアドレスからこの長ったらしいメールアドレスに転送する設定をしてSalesForceに取り込むのが主な使い方になるでしょう。

最後に動いているか確認

このメールアドレスにメールを送ると。。。
Salesforceのメールアドレス宛てに送信

ちゃんとタスクが作成されました、メールの内容も取り込めていますね。
メールサービスが動作しToDoが作成される

まとめ

  • メールサービスにはMessaging.InboundEmailHandlerインターフェースを使用したApexクラスを使用する
  • 引数にはメールの内容や宛先などの情報が含まれる
  • Apexの処理結果はMessaging.InboundEmailResultクラスを使用して成否とメッセージを返す

コメント