Salesforce メールサービス 添付ファイル

実現:
・オブジェクトの「活動」を利用して、メールを送信する。
  ・上記のメールを受信した方、メールをそのまま返信すると、Salesforceのメールサービスを受信し、該当オブジェクトレコードに「活動」として追加し、添付ファイルも更新される。

・メール送信設定
   ・カスタマイズボタンを新規作成→ページレイアウトに追加する。
      ⇒ オブジェクト設定画面
        メールテンプレートでも利用可能
例:

追加後のイメージ:

メール受信:
① メールサービス新規作成

//受信用のAPEXクラス
//メールの中身分析してオブジェクト更新用の項目を抽出してよいです。
global class DealInboundEmailForRecruit implements Messaging.InboundEmailHandler {
    global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
        Messaging.InboundEmailResult result = new Messaging.InboundEmailresult();
        try {
            //IDを取得する
            String dataid = email.Subject.substringAfter('#').substringBefore('#'); 
            FHR_Recruit__c r = [select Id from FHR_Recruit__c where id =:dataid];
            String closedLabel = [select MasterLabel from TaskStatus where IsClosed = true limit 1].MasterLabel;

            EmailMessage createEmail = new EmailMessage(
                Subject = email.Subject
                ,relatedToId = r.Id
                ,Status                         = '0'
                //,CcAddress                      = String.implode(',',email.ccAddresses)
                ,FromAddress                    = email.fromAddress
                ,ToAddress                      = email.toAddresses[0]
                ,FromName                       = email.fromName
                ,Headers                        = JSON.serialize( email.headers )
                ,HtmlBody                       = email.htmlBody
                ,TextBody                       = email.plainTextBody
                ,Incoming                       = true
                ,MessageDate                    = DateTime.now()
            );
            insert createEmail; 

             // メールの添付ファイルを、先ほど作成したTestObject__cのレコードに紐付け
            List<Attachment> atts = new List<Attachment>();
            List<Messaging.Inboundemail.Binaryattachment> batts = email.binaryAttachments;
            if (batts != null && batts.size() > 0){
                for (Messaging.Inboundemail.Binaryattachment batt: batts){
                    Attachment att = new Attachment();
                    // ファイル名を設定
                    att.name = batt.fileName;
                    // ファイルの内容を設定
                    att.Body = batt.body;
                    // 紐付け先を設定
                    att.ParentId = createEmail.id;
                    atts.add(att);
                }     
                insert atts;
            }
        } catch(Exception e) {
            system.debug(e.getMessage());
        }
        return result;
    }
}

②Salesforceの受信メールメールアドレス新規作成する。そうしたら、このメールアドレス受信したメールを上記のapexクラスで処理されます。

Salesforceの受信用のメールアドレスわかりにくいので、
自社の送信アドレスから転送設定で自社のメールサーバにて設定してもよいです。

注意点:
メールサービスの制限があります。
送信制限と受信制限それぞれあります。

  • Salesforce では、制限値は、ユーザライセンス数 x 1,000 で算出され、最大値は 1,000,000 です。たとえば、ライセンス数が 10 の場合、1 日最大 10,000 件のメールメッセージを処理できます。
  • Sandbox 内に作成したメールサービスアドレスは、本番組織にコピーできません。
  • メールサービスごとに Salesforce に通知して、送信者のメールアドレスではなく、特定のアドレスにエラーメールメッセージを送信できます。
  • メールが (本文テキスト、本文 HTML および添付ファイルを合わせて) 約 25 MB を超える場合 (言語や文字セットに応じて異なる)、メールサービスはメールメッセージを拒否し、送信者に通知します。


参考リンク:
https://forcecom.hatenadiary.org/entry/20090622/inboundmail
https://www.iftc.co.jp/initiatives-post/2018/01/30/1190/
https://help.salesforce.com/articleView?id=sf.code_email_services_overview.htm&type=5

補足: メールテンプレートとクリクリテキストの使用
メールテンプレートの利用方法は、かなり時間がかかった探しましたが。。。。
以下のアイコンでできました。。

さらに便利なクイックテキストアイコン