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で以下のような簡単な入力フォームを作りました。

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

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

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

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

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

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

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

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

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

Salesforce側の事前設定

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

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

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

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

作成した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 });

    }

}

以上になります。