LoginSignup
12
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-10

はじめに

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

スクリーンショット 2018-04-11 5.25.09.png

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

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

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

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

スクリーンショット 2018-04-11 5.25.09.png

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

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

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

スクリーンショット 2018-04-11 5.31.47.png

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

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

スクリーンショット 2018-04-11 5.36.53.png

Salesforce側の事前設定

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

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

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

スクリーンショット 2018-04-11 5.51.01.png

スクリーンショット 2018-04-11 6.17.09.png

スクリーンショット 2018-04-11 5.51.24.png

スクリーンショット 2018-04-11 6.18.50.png

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

スクリーンショット 2018-04-11 5.52.42.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 });

    }

}

以上になります。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6