[apex][SF]InboundEmailHandlerを使ったリードの作成

salesforceでメールを受け取って、そのメールアドレスでリードを作る方法と、
エラーで返信するときの方法。

apex

メールサービスを作成する際にapexクラスを指定するので、先に作成しておきます。

例えば今回は、送信元のメールアドレスを使用してリードを作成するとします。
また、すでに登録されているメールアドレスの場合、エラーメールを返信するとします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
global class MailCreateLead implements Messaging.InboundEmailHandler {
  global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
      Messaging.InboundEmailResult result = new Messaging.InboundEmailresult();
      
      //メールが重複しているかどうかをチェック
      String mail_str = email.fromAddress;
      List<Lead> check = [SELECT id FROM Lead WHERE Email=:mail_str LIMIT 1];
      if(check.size() != 0){
          result.message = '送信されたメールアドレスはすでに登録済です。';
          result.success = false;
      }else{
          Lead l = new Lead();
          l.Company = '-'; //(必須)
          l.LastName = (email.fromName == null) ? 'メール会員' : email.fromName;
          l.Email = email.fromAddress;
          insert l;
          result.success = true;
      }
      
      return result;
  }
}

Messaging.InboundEmailResultを返却するが、successがfalseの場合は、
受信を拒否し、設定されたエラーメッセージ(message)を送信元のメールアドレスに返す。
この時返信されるメールは、noreply@salesforce.comとなっており、これは変更できないっぽい。

重複していない場合は、送信元のメールアドレスと名前(あれば)を使用してリードを作っている。

テストコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@isTest
public class MailCreateLead_Test {
  //正常時
  private static testMethod void execute_success() {
      Test.startTest();
      
      Messaging.InboundEmail email = new Messaging.InboundEmail() ;
        Messaging.InboundEnvelope env = new Messaging.InboundEnvelope();
        email.subject = 'Test Success';
        email.fromname = 'FirstName LastName';
        email.fromAddress = 'someaddress@email.com';
        email.plainTextBody = '';
        
        MailServiceToCreateLead emailService = new MailServiceToCreateLead();
        Messaging.InboundEmailResult res = emailService.handleInboundEmail(email, env);
        
        Test.stopTest();
  }
  
  //エラー時
  private static testMethod void execute_fail(){
      //重複チェック
      Lead le = new Lead();
        le.Company = '-';
        le.LastName = 'failed test';
        le.Email = 'test@test.com';
        Insert le;
        
        Test.startTest();
        
        Messaging.InboundEmail email = new Messaging.InboundEmail() ;
        Messaging.InboundEnvelope env = new Messaging.InboundEnvelope();
        email.subject = 'Test Failed';
        email.fromname = 'FirstName LastName';
        email.fromAddress = 'test@test.com'; //上記メールアドレスと被せる
        email.plainTextBody = '';
        MailServiceToCreateLead emailService = new MailServiceToCreateLead();
        Messaging.InboundEmailResult res = emailService.handleInboundEmail(email, env);
        
        Test.stopTest();
  }
}

メールサービス

設定 > 開発 > メールサービスから作成します。

メールサービス

設定内容は、サービス名と、先程作成したapexクラスを指定してやるくらいです。

新規作成

作成後、ユニークなメールアドレスが割り当てられるので、
そのアドレス宛てに送信するとメールサービスが起動します。

設定内容

参考

InboundEmail オブジェクトの使用
An Introduction To Email Services on Force.com – developer.force.com
SFDC:Messaging.InboundEmailHandlerについて – tyoshikawa1106のブログ

   このエントリーをはてなブックマークに追加