読者です 読者をやめる 読者になる 読者になる

からめもぶろぐ。

ワタシ SharePoint チョット デキル

SharePoint 2010 で人の検索ボックスを使って簡易メール フォームを作ってみる

SharePoint のコントロールで飛び抜けて使い勝手がいいのは「人の検索ボックス (PeopleEditor)」と呼ばれるコントロールです。Active Directory のユーザーやグループを検索してくれる優れものです。見た目は以下のような感じで、標準でもいろいろなところで使われています。

f:id:karamem0:20160629010745p:plain

今回はこれを使って簡易メール フォームを作ってみます。

サンプル コード

プロジェクトは「視覚的 Web パーツ」で作成します。ユーザー コントロールの名前は必ず変える必要はないのですが、「VisualWebPartUserControl」という名前にしておきます。

VisualWebPartUserControl.ascx

メール フォームのデザインを行います。PeopleEditor は初期状態でツール ボックスには出てこないので [アイテムの選択] から選択する必要があります。

<div style="width: 400px;">
    <div style="margin: 3px 0px 3px 0px;">
        <label for="ToPeopleEditor" runat="server">宛先:</label>
        <sharepoint:PeopleEditor id="ToPeopleEditor" allowempty="false" validatorenabled="true" isclaimsdisabled="True" multiselect="false" runat="server" />
    </div>
    <div style="margin: 0px 0px 3px 0px;">
        <label for="SubjectTextBox" runat="server">件名:</label>
        <asp:TextBox id="SubjectTextBox" cssclass="ms-input" textmode="SingleLine" width="100%" runat="server" />
        <asp:RequiredFieldValidator controltovalidate="SubjectTextBox" enableclientscript="false" errormessage="この必須フィールドに値を指定してください。" runat="server" />
    </div>
    <div style="margin: 0px 0px 3px 0px;">
        <label for="BodyTextBox" runat="server">本文:</label>
        <asp:TextBox id="BodyTextBox" cssclass="ms-input" textmode="MultiLine" width="100%" runat="server" />
        <asp:RequiredFieldValidator controltovalidate="BodyTextBox" enableclientscript="false" errormessage="この必須フィールドに値を指定してください。" runat="server" />
    </div>
    <div style="margin: 0px 0px 3px 0px;">
        <asp:Button id="SubmitButton" causesvalidation="true" text="送信" onclick="SubmitButton_Click" runat="server" />
    </div>
</div>

VisualWebPartUserControl.ascx.cs

[送信] ボタンをクリックしたときのイベントを定義します。PeopleEditor.ResolvedEntities プロパティに選択されたユーザーに関する情報を格納する PickerEntity クラスのコレクションが入っていますので*1、Email 要素を抜き出して To アドレスに設定します。これは具体的には Active Directory の mail 属性を取ってきているようです。From アドレスには現在のユーザーのアドレスを設定します。

    public partial class VisualWebPartUserControl : UserControl {

        protected void Page_Load(object sender, EventArgs e) {
        }

        protected void SubmitButton_Click(object sender, EventArgs e) {
            this.ToPeopleEditor.Validate();
            if (this.Page.IsValid == false) {
                return;
            }
            var entity = this.ToPeopleEditor.ResolvedEntities.Cast<PickerEntity>().Single();
            var to = (string)entity.EntityData["Email"];
            if (to == null) {
                return;
            }
            var from = SPContext.Current.Web.CurrentUser.Email;
            var msg = new MailMessage(
                from,
                to,
                this.SubjectTextBox.Text,
                this.BodyTextBox.Text);
            var client = new SmtpClient();
            client.Credentials = new NetworkCredential(from, "********");
            client.EnableSsl = true;
            client.Host = "smtp.live.com";
            client.Port = 587;
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.Send(msg);
        }
    }

実行

実行してみるとこんな感じで表示されます。

f:id:karamem0:20160629011018p:plain

人の検索ボックスの [参照] ボタン(辞書っぽいアイコン)をクリックすると検索ダイアログが別ウィンドウで開きます。

f:id:karamem0:20160629011041p:plain

件名と本文を入力して [送信] ボタンをクリックします。

f:id:karamem0:20160629011051p:plain

メールが送信されたのが確認できます。

f:id:karamem0:20160629011113p:plain

まとめ

人の検索ボックスは企業内アプリケーションを作る上ではいろいろな場面での活用が期待できる優れたコントロールです。また、機能を拡張してさらにいろいろなことができたりします。

*1:PeopleEditor.Entities プロパティというのもありますが、こちらは確定されていないユーザー (下線が付いてない) が入ってきます。