Salesforce Visualforce + Apexで入力フォーム作成 (入力内容をChatWorkで通知 + メールで送信する)

はじめに
===

SalesforceのVisualforceページ及びApexクラスで入力フォームを作成し、フォームから入力したメッセージをChatworkへ投稿 + メール送信するプログラムを作ってみました。

Salesforceではなるべく標準機能を活用した方が良く、むやみにVisualforceページやApexクラスは作らない方が良いとは思っておりますが、自分の単純な興味と勉強がてら、Developer Editionで試してみました。

入力フォームの挙動、実際のVisualforceとApexのソースは後述致します。

実行環境
===

・Salesforce Developer Edition
　　(Salesforce.com Apex API version 42.0)

作成したVisualforce + Apex入力フォームについて
===

## (1) 入力フォーム概要

VisualforceとApexで以下のような簡単な入力フォームを作りました。

<img width="1181" alt="スクリーンショット 2018-04-11 5.25.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/bdde9be7-30cc-41c4-1ad3-61d5b39f95be.png">

## (2) 入力フォームで入力する内容

入力フォームの各テキストエリアやテキストボックスでは、以下のような内容を入力します。

　・Chatwork投稿メッセージ 及び メール本文
　・Chatwork投稿メッセージタイトル 及び メール件名 
　・メッセージ投稿先のChatworkルーム番号( https://www.chatwork.com/#!rid******** の ridより後ろの番号部分)
　・送信先メールアドレス

入力フォームにある「メッセージのChatwork投稿とメール送信」ボタンをクリックしますと、メッセージをChatwork投稿 + メール送信します。

<img width="1181" alt="スクリーンショット 2018-04-11 5.25.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/a68d4dad-606c-8a0c-c45c-4652875bb62e.png">


本記事では例示用として、
　・メッセージ投稿先のChatworkルーム番号は 99999999
　　　(投稿先のChatworkルームが https://www.chatwork.com/#!rid99999999 であるという前提で記載)
　・送信先アドレスは example***@gmail.com
として記載しています。

## (3) 入力フォームから入力した内容のChatwork投稿

入力フォームで「メッセージのChatwork投稿とメール送信」ボタンをクリックすると、入力したメッセージがChatworkに投稿されます。

<img width="1085" alt="スクリーンショット 2018-04-11 5.31.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/11525a45-0bf5-e9bb-93ab-581f7817bc01.png">

## (4) 入力フォームから入力した内容のメール送信

指定した送信先アドレス宛てにもメッセージが送信されます。

<img width="1076" alt="スクリーンショット 2018-04-11 5.36.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/1f33a9f0-c3b5-bbb7-3a5c-aa3468016975.png">

Salesforce側の事前設定
===

Apex内ではChatworkAPIエンドポイントやAPIトークンをApexクラス内にはハードコーディングせずに「カスタム設定」から取得するようにしています。

Visualforce,Apexを動かすにあたり、事前に本節の設定を実施しました。

「設定」->「ビルド」->「開発」 ->「カスタム設定」をクリックし、ChatworkAPIトークンやURL、差出人メール等の環境変数を追加しました。

<img width="1091" alt="スクリーンショット 2018-04-11 5.51.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/34e6b67a-6d91-502b-6db7-d76e7fb2de80.png">

<img width="1179" alt="スクリーンショット 2018-04-11 6.17.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/94e5d77d-fb8b-167f-10b2-d0b517182303.png">



<img width="1162" alt="スクリーンショット 2018-04-11 5.51.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/0eb50fa2-47ff-701f-6592-63f6b02b0a45.png">

<img width="1182" alt="スクリーンショット 2018-04-11 6.18.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/7974760a-84bb-e674-ce6c-019214378ea3.png">


「設定」->「管理」->「セキュリティのコントロール」->「セキュリティのコントロール」->「リモートサイトの設定」をクリックし、ChatworkAPIのAPIエンドポイントURL( https://api.chatwork.com )を追加しました。

<img width="1181" alt="スクリーンショット 2018-04-11 5.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/63647/b115927c-1659-e9e6-712f-bde098002e74.png">





作成したVisualforceページのソース
===

## (1) 入力フォーム用のVisualforceページ

・PostMessageFormページ

```
<apex:page controller="PostMessage">
    <apex:form >
    <apex:pageBlock title="PostMessageForm">
    <apex:pageMessages />

    <table class="chatwork_messages">
         <tr>
             <th>
                 Chatworkへ投稿するメッセージタイトル 及び 送信するメール件名を入力
             </th>
             <td>
                 <apex:pageBlockSection columns="1">
                     <apex:inputText id="chatwork_title" value="{!chatwork_title}" required="true" />
                 </apex:pageBlockSection>
             </td>
         </tr>

         <tr>
             <th>
                 Chatworkへ投稿するメッセージ 及び メール本文を入力
             </th>
             <td>        
                 <apex:pageBlockSection columns="1">
                     <apex:inputTextarea id="chatwork_meesage" value="{!chatwork_message}" required="true" />
                 </apex:pageBlockSection>
             </td>
         </tr>
         
        <tr>
             <th>
                 Chatworkへメッセージを投稿する時の投稿先ルーム番号を入力
             </th>
             <td>        
                 <apex:pageBlockSection columns="1">
                     <apex:inputText id="chatwork_post_room" value="{!chatwork_post_room}" required="true" />
                 </apex:pageBlockSection>
             </td>
         </tr>

        <tr>
             <th>
                 メッセージ送信先のメールアドレスを入力
             </th>
             <td>        
                 <apex:pageBlockSection columns="1">
                     <apex:inputText id="to_mail_address" value="{!to_mail_address}" required="true" />
                 </apex:pageBlockSection>
             </td>
         </tr>
         
    </table>
    
    <apex:commandButton action="{!post_message}" value=" メッセージのChatwork投稿とメール送信 "/>

    </apex:pageBlock>
    </apex:form>
</apex:page>
```

作成したApexクラスのソース
===

## (1) Visualforceで作った入力フォームのコントローラクラス

・PostMessageクラス

```
////////////////////////////////////////
// Visualforceで入力されたメッセージ内容やタイトル等をChatworkやメール配信するApexクラス
////////////////////////////////////////
public with sharing class PostMessage {

    // Visualforceページのテキストエリアで入力されたChatworkへ投稿するメッセージ本文を取得
    public String chatwork_message { get; set; }

    // Visualforceページのテキストボックスで入力されたChatworkへ投稿するメッセージタイトルを取得
    public String chatwork_title { get; set; }
    
    // Visualforceページのテキストボックスで入力されたメッセージ投稿先のChatworkルーム番号を取得
    public String chatwork_post_room { get; set; }

    // Visualforceページのテキストボックスで入力されたメール送信先アドレスを取得
    public String to_mail_address { get; set; }

    public void post_message() {
    
        PostChatworkMessage post_chatwork = new PostChatworkMessage();
        SendMailMessage send_mail_message = new SendMailMessage();
        
        String mail_subject = chatwork_title;
        String mail_message = chatwork_message;
        
        // Visualforceページで入力されたメッセージをChatworkへ投稿する
        post_chatwork.post_chatwork_message( chatwork_title, chatwork_message, chatwork_post_room );
        
        // Visualforceページで入力されたメッセージをメール送信する
        send_mail_message.send_mail_message( mail_subject, mail_message, to_mail_address );
        
    }
        
}
```

## (2) Chatworkへのメッセージ送信クラス

・PostChatworkMessageクラス

```
////////////////////////////////////////
// Chatworkにメッセージを投稿するApex
////////////////////////////////////////
public with sharing class PostChatworkMessage {

    // カスタム設定からChatwork APIトークン情報等を取得
    private static String ChatworkApiEndPointURL;
    private static String ChatworkApiToken;
    private static String ChatworkApiVersion;
    
    static {
        ChatworkApiSetting__c setting = ChatworkApiSetting__c.getInstance();
        
        ChatworkApiEndPointURL = setting.ChatworkApiEndPointURL__c;
        ChatworkApiToken       = setting.ChatworkApiToken__c;
        ChatworkApiVersion     = setting.ChatworkApiVersion__c;
        
    }

    public void post_chatwork_message(String chatwork_title, String chatwork_message, String chatwork_post_room) {
    
        String result_message = '';
        
        Http http = new Http();
        HttpRequest request = new HttpRequest();

        request.setEndpoint(ChatworkApiEndPointURL + '/' + ChatworkApiVersion + '/rooms/' + chatwork_post_room + '/messages');

        request.setMethod('POST');
        request.setHeader('X-ChatWorkToken', ChatworkApiToken);

        request.setBody('body=' + '[info][title]' + chatwork_title + '[/title]' + chatwork_message + '[/info]');

        HttpResponse response = http.send(request);
        Integer status = response.getStatusCode();
        
        if ( status == 200 ) {
            result_message = response.getBody();
        } else {
            result_message = status.format() + response.getBody();
        }
        
    }
        
}
```

## (3) メール送信クラス

・SendMailMessageクラス

```
////////////////////////////////////////
// メッセージをメール送信するApex
// 詳細は以下を参照。
//    https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_email_outbound_single.htm
////////////////////////////////////////
public with sharing class SendMailMessage {

    // カスタム設定からメール送信設定等を取得
    private static String MailReplyAddress;
    private static String MailSenderDisplayName;

    static {
        MailSetting__c setting = MailSetting__c.getInstance();
        
        MailReplyAddress      = setting.MailReplyAddress__c;
        MailSenderDisplayName = setting.MailSenderDisplayName__c;
    }
    
    public void send_mail_message(String mail_subject, String mail_message, String to_mail_address) {
   
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        
        mail.setToAddresses(new String[]{to_mail_address});
        
        mail.setReplyTo(MailReplyAddress);
        
        mail.setSenderDisplayName(MailSenderDisplayName);
        
        mail.setSubject(mail_subject);

        mail.setPlainTextBody(mail_message);
        
        // メッセージをメール送信
        Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

    }
        
}
```

***

以上になります。