Office 2010 Mobile Service ガイドライン (パート 1/3)

概要:  Microsoft Office 2010 Mobile Service (OMS) の Web サービスを構築およびホストする方法について学習します。この記事では、OMS アークテクチャとメッセージのフローを紹介し、OMS クライアントと Web サービス間の通信プロトコルについて説明します。Office 2010 の Office Mobile Service は、2007 Microsoft Office system の Outlook Mobile Service の更新されたバージョンであることに注意してください。

適用対象: Excel 2010 | Office 2007 | Office 2010 | Office Mobile | Open XML | Outlook 2010 | Outlook Mobile | PowerPoint 2010 | SharePoint Foundation 2010 | SharePoint Server 2010 | VBA | Word 2010

この記事の内容
Office Mobile Service の概要
アーキテクチャとメッセージのフロー
通信プロトコル
Web サービス URL リダイレクト
受信モバイル メッセージのパッケージ化
まとめ
その他の技術情報

目次

  • Office Mobile Service の概要

  • アーキテクチャとメッセージのフロー

  • 通信プロトコル

  • Web サービス URL リダイレクト

  • 受信モバイル メッセージのパッケージ化

  • まとめ

  • その他の技術情報

Office Mobile Service の概要

Microsoft Office 2010 Mobile Service (OMS) は、Microsoft Outlook 2010 と Microsoft SharePoint 2010 向けに開発されたメッセージング コンポーネントです。OMS を使用することにより、ユーザーは、Outlook と SharePoint のモバイル機能をモバイル デバイスとシームレスに統合できます。

OMS のモバイル メッセージング機能によってユーザーが行うことができる操作は次のとおりです。

  • Outlook 内で新しいテキスト メッセージとマルチメディア メッセージを作成する。

  • Outlook アイテム (電子メール メッセージ、会議、連絡先など) をテキスト メッセージまたはマルチメディア メッセージとして転送する。

  • モバイル デバイスから返信を受け取り、Outlook と携帯電話間を双方向で通信する。

  • 携帯電話で SharePoint からの通知メッセージを受信する。

  • オブジェクト モデルによって提供される Outlook および SharePoint OMS のメッセージング機能を拡張する。

Outlook の Office Mobile Service

OMS によって提供されるアイテム リダイレクト機能を使用すると、ユーザーは Outlook 内からテキスト メッセージとマルチメディア メッセージを作成、送信できるだけでなく、簡単な条件を設定するだけでアラーム、電子メール メッセージ、および次の日のスケジュールを携帯電話に自動的にリダイレクトできます。また、電子メール メッセージ、予定、会議出席依頼を携帯電話や他の電子メール アドレスに送信することもできます。

OMS は Outlook アカウント設定にシームレスに統合され、ユーザーがモバイル メッセージング アカウントと電子メール アカウントを同時に管理できるようにします。携帯電話番号はアドレスとして扱われ、ユーザーはオートコンプリートを使用するか Outlook アドレス帳から名前を直接選択することにより、受信者をモバイル メッセージに追加できます。また、Outlook のフォルダーにモバイル メッセージを保存して、管理することもできます。

Outlook および SharePoint に組み込まれている OMS クライアントは、テキスト メッセージおよびマルチメディア メッセージを、パートナー (通信事業者またはモバイル メッセージ コンテンツ サービス プロバイダーのどちらか) によって作成およびホストされる Web サービスに送信します。Web サービスに送信されたメッセージは、その後、通信事業者のテキスト メッセージまたはマルチメディア メッセージのサービス センターに配信されます。

SharePoint 2010 の Office Mobile Service

SharePoint 2010 では、ユーザーは OMS を経由してテキスト メッセージ (SMS) 通知を受信できます。たとえば、ドキュメントの状態や SharePoint のリストを通知として受け取ることができます。また、必要に応じて、変更通知やドキュメントまたはリストの URL のテキスト メッセージも受信できます。

その他の情報

この記事は、OMS について説明し、サービスを使用するガイドラインや参照情報を提供する 3 つの記事の 1 つ目です。OMS Web サービスの実装に関する推奨事項については、「Office 2010 Mobile Service ガイドライン (パート 2/3)」を参照してください。OMS Web プロバイダーと OMS クライアントの間でやり取りされるデータの XML スキーマの詳細については、「Office 2010 Mobile Service ガイドライン (パート 3/3)」を参照してください。

この記事の読者は、Web サービスの開発と展開について十分に理解している必要があります。Web サービスに関する一般的な情報については、「Web Services (英語)」を参照してください。Web サービスを開発する方法については、使用している開発ツールのマニュアルを参照してください。

アーキテクチャとメッセージのフロー

OMS の全体的なアーキテクチャは、Web サービス テクノロジに基づくクライアント サービス フレームワークです。Outlook または SharePoint に組み込まれている OMS クライアントは、SOAP メッセージとしてモバイル メッセージをエンコードして、OMS Web サービスに送ります。次に、メッセージはエンコードされ、通信事業者のモバイル メッセージ ゲートウェイに送信されます。次に、メッセージは、通信事業者のモバイル無線ネットワークにより宛先のユーザーの携帯電話に送信されます。OMS Web サービスは、モバイル通信事業者あるいはアグリゲーター (インターネット コンテンツ プロバイダー、インターネット サービス プロバイダー、あるいはモバイル メッセージング サービスを提供するあらゆる事業者) であるサービス プロバイダーにより作成され、ホストされます。OMS Web サービスの仕様と、OMS クライアントと Web サービス間の通信プロトコルについては、この記事の「通信プロトコル」セクションを参照してください。

現在のところ、SharePoint 2010 では、モバイル メッセージを一方向で OMS Web サービスに配信しますが、Outlook は OMS Web サービスと双方向で通信できます。図 1 は、OMS Web サービスと通信事業者のインフラストラクチャを経由した、Outlook と受信者の携帯電話間のメッセージのフローを示しています。受信者の携帯電話からの返信は、ユーザーの設定に基づいて、Outlook の受信トレイ、送信者のモバイル デバイス、あるいはその両方に配信されます。Outlook のユーザーの受信トレイに返信を送信するために、サービス プロバイダーは、Microsoft により定義された仕様に従って、その返信を簡易メール転送プロトコル (SMTP) 電子メール メッセージとしてパッケージ化します (この記事の「受信モバイル メッセージのパッケージ化」セクションを参照)。

図 1. Outlook の Office Mobile Service のメッセージ フロー

アーキテクチャとメッセージのフロー

通信プロトコル

OMS Web サービスを開発する場合、従わなければならない規則がいくつかあります。まず、OMS Web サービスは、Web サービス記述言語 (WSDL) に従う必要があります。これにより、OMS クライアントは、サービス固有のコード変更を行わずにサービスに接続できます。

また、OMS Web サービスは、次の Web メソッドをサポートする必要があります。

  • string GetServiceInfo() - OMS Web サービスのプロパティを取得します。

  • string GetUserInfo(string xmsUser) - ユーザーの情報を取得します。

  • string DeliverXms(string xmsData) - 1 つのモバイル メッセージを Web サービスに送信します。

  • string DeliverXmsBatch(string packageXml) - 複数の xmsData 文字列をまとめて Web サービスに送信します。

さらに、OMS Web サービスは、ガイドラインに従って、モバイル メッセージを Outlook OMS クライアントに電子メールとして送信する必要があります。これについては、この記事の「受信モバイル メッセージのパッケージ化」セクションを参照してください。

注意

OMS Web サービスを Microsoft Office Outlook 2007 からアップグレードする場合は、Outlook 2007 Service Pack 1 (SP1) 以降で、SendXms Web メソッドが DeliverXms に変更されている点に注意してください。OMS Web サービスを Outlook 2007 の RTM バージョン、Outlook 2007 SP1、または Outlook 2010 で利用するには、SendXms と DeliverXms に同じ定義を指定して、SendXms と DeliverXms の両方をサポートする必要があります。すべてのサブスクライバーが Outlook 2007 SP1 または Outlook 2010 にアップグレードすると、SendXms のサポートを中止できます。

簡単な Web サービス実装の例

次のコード例は、OMS Web サービスの簡単な実装の概要を示しています。GetUserInfo() メソッドおよび GetServiceInfo() メソッドは情報と適切なエラー コードを返します。返す対象の情報とエラー コードは、XML ファイルとして保存されます。この例は、LoadXmlFromFile(string filename) メソッドがファイルから XML を読み込んで文字列として結果を返せるように作成され、プライベート クラス CUserLogon がユーザー検証機能を提供するように実装されていることを前提としています。

using System;
using System.IO;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Web.Mail;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

[WebService(Namespace="https://schemas.microsoft.com/office/Outlook/2006/OMS")]///<Do not change the namespace!/>
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class OMSService : System.Web.Services.WebService
{
    /// <Get service information, such as the capacities of supported services./>
    [WebMethod]
    public string GetServiceInfo()
    {
        return LoadXmlFromFile("SampleServiceInfo.xml");
    }
    
    /// <Get user information including SMTP address and mobile phone number./>
    [WebMethod]
    public string GetUserInfo(string xmsUser)
    {
        if (!m_schemaProvider.FValidXml(xmsUser, "xmsUserSchema.xsd"))
        {
            return LoadXmlFromFile("SchemaError.xml");
        }
        CUserLogon usrLogon = new CUserLogon(xmsUser);
        if (!usrLogon.FLogon())
        {
            return LoadXmlFromFile("LogonFailed.xml");
        }
        return LoadXmlFromFile("SampleUserInfo.xml");
    }

    /// <Send SMS or MMS message data to specific recipients./>
    [WebMethod]
    public string DeliverXms(string xmsData)
    {
        if (!m_schemaProvider.FValidXml(xmsUser, "xmsDataSchema.xsd"))
        {
            return LoadXmlFromFile("SchemaError.xml");
        }
        CUserLogon usrLogon = new CUserLogon(xmsData);
        if (!usrLogon.FLogon())
        {
            return LoadXmlFromFile("LogonFailed.xml");
        }
        return LoadXmlFromFile("SampleResponse.xml");
    }

    // <Load XML file./>
    private string LoadXmlFromFile(string strFile)
    {
        // ...
    }

    // Helps validate XMS schemas
    private CSchemaProvider m_schemaProvider;
};//OMSService

// Extract user logon information from XML string and process logon validation.
private class CUserLogon 
{
    // ....
};

// Cache schema validators
private class CSchemaProvider
{
    // ....
};

以降のセクションでは、OMS Web サービス メソッドについて詳しく説明し、これらのメソッドとの間でやり取りされる XML 形式の文字列 (serviceInfo、userInfo、および xmsResponse) のサンプル コードと例を紹介します。こうした Web メソッドの WSDL、およびそのメソッドとの間でやり取りされる XML 形式の文字列のスキーマについては、「Office 2010 Mobile Service ガイドライン (パート 3/3)」を参照してください。

string GetServiceInfo() Web Service メソッド

GetServiceInfo() は、serviceInfo と呼ばれる XML 形式の文字列を返します。この文字列には、サポートされるサービスの種類、サポートされるサービスのパラメーター、認証の種類など、OMS Web サービスの基本プロパティが含まれます。

Outlook に組み込まれている OMS クライアントは GetServiceInfo() を呼び出して、ユーザーが新しいアカウントを設定するときに OMS Web サービスのプロパティを取得するか、OMS Web サービスが公開された後にサービス プロパティを更新します。OMS はこれらのプロパティを使用して、Web サービスを、サポートさているサービス プロバイダーとしてクライアント側で構成します。

次のコード例は、GetServiceInfo() によって返される serviceInfo 文字列を示しています。

<?xml version="1.0" encoding="utf-8"?>
<serviceInfo 
    xmlns="https://schemas.microsoft.com/office/Outlook/2006/OMS/serviceInfo">    
    <serviceProvider>ABC Company</serviceProvider>    
    <serviceUri>http://www.abc.com.cn/OMS3/XMS.asmx</serviceUri>    
    <signUpPage>http://www.abc.com.cn/ws/xmssignup.aspx/</signUpPage>    
    <targetLocale>2052</targetLocale>    
    <localName>ABC Mobile Service</localName>
    <englishName>ABC Mobile Service</englishName>
    <authenticationType>Other</authenticationType>
    <supportedService>
        <SMS_SENDER maxRecipientsPerMessage="50" maxMessagesPerSend="20"
            maxSbcsPerMessage="140" maxDbcsPerMessage="70" />
        <MMS_SENDER supportSlide="true" maxRecipientsPerMessage="100"
            maxSizePerMessage="30000" maxSlidesPerMessage="10" />
    </supportedService>
</serviceInfo>

開発者は、次の点にも注意する必要があります。

  • serviceInfo 文字列は、Unicode 文字列として転送され、UTF-16 としてエンコードされます。

  • serviceUri 値はサービスを一意に識別するのに使用されます。OMS Web サービスの serviceUri が変更されると、OMS クライアントは、サービスを新しい OMS Web サービスとして処理します。

  • サービス プロバイダーは、長いテキスト メッセージをサポートするために、SMS_SENDER 要素の maxSbcsPerMessage 属性と maxDbcsPerMessage 属性の値を、サブスクライバーによって使用されるほとんどのモデルがサポートする値に設定できます。

  • OMS Web サービスが serviceInfo 文字列の MMS_SENDER 要素の supportSlide 属性を "true" に設定した場合は、Web サービスが同期マルチメディア統合 (SMIL) 形式をサポートすることを意味します。SMIL が使用されているメッセージの状態は "スライド モード" と呼ばれます。SMIL がサポートされていない OMS Web サービスがスライド モードのメッセージを受信すると、Web サービスは "other" というエラーの種類を報告するか、そのメッセージを "非スライド モード" に変換します。

string GetUserInfo(string xmsUser) Web Service メソッド

Outlook に組み込まれている OMS クライアントは、xmsUser 文字列をパラメーターとして指定して GetUserInfo() を呼び出すことで、ユーザーの携帯電話番号などの情報を取得します。xmsUser は、ユーザー ID、パスワードなど、ユーザーの認証情報が含まれる XML 形式の文字列です。GetUserInfo() は、severity 属性が "failure" に設定された error 要素が含まれる、userInfo と呼ばれる XML 形式の文字列を返します。xmsUser のスキーマについては、このシリーズの最後の記事「Office 2010 Mobile Service ガイドライン (パート 3/3)」を参照してください。

userInfo 文字列で一般的に返されるエラー コードを表 1 に示します。

表 1. GetUserInfo() への呼び出しによって返されるエラー

コード

重要度

Ok

neutral

invalidUser

failure

unregisteredUser

failure

expiredUser

failure

OMS Web サービスが送信できるエラー コードの一覧については、「Office 2010 Mobile Service ガイドライン (パート 3/3)」の「OMS エラー コード」セクションを参照してください。ただし、userInfo スキーマには、そのセクションに記載されている content 子要素または recipientList 子要素は含まれません。また、severity 属性は、xmsResponse 文字列では必須ですが、userInfo 文字列のエラーではオプションです。severity 属性が userInfo 文字列の error 要素に対して定義されていない場合、OMS クライアントは、エラーの重要度を "neutral" と見なします。

注意

xmsUser 文字列と userInfo 文字列は Unicode 文字列として転送され、UTF-16 としてエンコードされます。

次のコード例は、XmlTextWriter オブジェクトを使用して、ユーザー情報およびエラー コードを XML 形式の文字列に書き込む GetUserInfo() の実装を示しています。

// ...
private const string m_sOmsNamespace = "https://schemas.microsoft.com/office/Outlook/2006/OMS";
public string GetUserInfo(string xmsUser)
{
    StringWriter stringWriter = null;
    XmlTextWriter writer = null;
    try
    {
        // Add code to verify user logon password 
        // and retrieve user information.
        // ...
        stringWriter = new StringWriter(new StringBuilder());
        writer = new XmlTextWriter(stringWriter);
        writer.WriteStartElement("userInfo", m_sOmsNamespace);
        writer.WriteStartElement("replyPhone");
        writer.WriteString(**replyPhone value**);
        writer.WriteEndElement(); // </replyPhone>
        writer.WriteStartElement("smtpAddress");
        writer.WriteString(**smtpAddress value**);
        writer.WriteEndElement(); // </smtpAddress>
        writer.WriteStartElement("error");
        writer.WriteAttributeString("code", "ok"); // return "ok" if no errors
        writer.WriteEndElement(); // </error>
        writer.WriteEndElement(); // </userInfo>
        return stringWriter.GetStringBuilder().ToString();
    }
    finally
    {
        if (writer != null)
            writer.Close();
        if (stringWriter != null)
            stringWriter.Close();
    }
}

次の例は、xmsUser 文字列と userInfo 文字列を示しています。

xmsUser 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsUser client="Microsoft Office Outlook 12.0" xmlns = "https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <userId>myname</userId>
    <password>mypwd</password>
    <customData/>
</xmsUser>

呼び出しが正常に終了した後に GetUserInfo() によって返される userInfo 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<userInfo xmlns = "https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <replyPhone>090123456</replyPhone>
        <smtpAddress>userid.spmail@spdomain.com</smtpAddress> 
    <error code="ok"/>
</userInfo> 

エラーが発生した後に返される userInfo 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<userInfo xmlns = "https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <error code="unregistered" severity="failure"/>
</userInfo>

ここで、userInfo 文字列の要素についてもっと詳しく見てみましょう。replyPhone 要素には、ユーザーがサービス プロバイダーでのサービスのサインアップに使用した携帯電話番号が含まれます。replyPhone 値は、ユーザーの既定の携帯電話番号として Outlook のアカウント設定用ダイアログ ボックスに表示されます。ユーザーがアカウントを設定するとき、OMS クライアントは GetUserInfo() を呼び出して、replyPhone 値を取得します。また、ユーザーがアカウントを表示または変更するとき、携帯電話番号を入力しなかった場合、あるいはサービス情報が変更されたことを OMS Web サービスが "serviceUpdate" エラー コードによってクライアントに通知するときは、OMS クライアントは GetUserInfo() を呼び出してユーザーの replyPhone を更新します。

Outlook 2007 では、replyPhone 要素は、コールバック番号が必須でサポートされている市場 (韓国など) で既定のコールバック番号として使用されていました。Outlook 2010 では、この機能は廃止されているので、この要素は不要です。

最後に smtpAddress について説明します。この要素には、サービス プロバイダーがサブスクライバーに対して生成する一意の SMTP アドレスが含まれます。サービス プロバイダーは SMTP アドレスを使用して、携帯電話からの返信を Outlook に送信します。悪意のあるユーザーが SMTP アドレスを使用して迷惑メールを送信できないようにするには、OMS サービス プロバイダーはすべてのサブスクライバーに対して一意の SMTP アドレスを作成する必要があります。

string DeliverXms(string xmsData) Web サービス メソッド

Outlook または SharePoint に組み込まれている OMS クライアントは DeliverXms() を呼び出して、モバイル メッセージをサービス プロバイダーに配信します。メッセージの内容は、xmsData と呼ばれる XML 形式の文字列としてパッケージ化されます。サービス プロバイダーはメッセージ送信を試みた後、xmsResponse と呼ばれる XML 形式の文字列を返します。この文字列には、各受信者へのメッセージ送信が成功したか失敗したかを示す 1 つ以上の error 要素が含まれます。

次のコード例は、XmlTextWriter オブジェクトを使用して、呼び出しの成功または失敗を xmsResponse 文字列に書き込む DeliverXms() の実装を示しています。

// ...
private const string m_sOmsNamespace = "https://schemas.microsoft.com/office/Outlook/2006/OMS";
public string DeliverXms(string xmsData)
{
    StringWriter stringWriter = null;
    XmlTextWriter writer = null;
    try
    {
        stringWriter = new StringWriter(new StringBuilder());
        writer = new XmlTextWriter(stringWriter);
        writer.WriteStartElement("xmsResponse", m_sOmsNamespace);
        // XML format validation.
        if (!m_schemaProvider.FValidXml(xmsData, "xmsDataSchema.xsd"))
        {
            BuildError(writer, "invalidFormat", true /* failure */, "", "");
            return stringWriter.GetStringBuilder().ToString();
        }
        // User validation.
        CUserLogon usrLogon = new CUserLogon(xmsData);
        if (!usrLogon.FLogon())
        {
            BuildError(writer, "invalidUser", true /* failure */, "", "");
            return stringWriter.GetStringBuilder().ToString();
        }
        // Add your code for your business logic to send the xmsData
        //to the intended recipients.
        // ...
        // Sent out OK.
        BuildError(writer, "ok", false /* success */, "", "");
        return stringWriter.GetStringBuilder().ToString();
    }
    catch (XmlException ex)
    {
        // Handle exceptions.
        return  "<?xml version=\"1.0\" encoding=\"utf-16\"?>"
            + " <xmsResponse xmlns=\
            "https://schemas.microsoft.com/office/Outlook/2006/OMS\">"
            + " <error code=\"others\" severity=\"failure\"> <content>"
            + ex.Message + " </content> </error>"
            + "</xmsResponse>";
    }
    finally
    {
        if (writer != null)
            writer.Close();
        if (stringWriter != null)\
            stringWriter.Close();
    }
}//end DeliverXms
// Build error elements.
private void BuildError(XmlTextWriter wr,
     string errCode,
     bool bFailed,
     string strContent,
    string strRecipients)
{
    wr.WriteStartElement("error");
    wr.WriteAttributeString("code", errCode);
    wr.WriteAttributeString("severity", bFailed ? "failure" : "neutral");
    if (strContent.Length > 0)
    {
        wr.WriteStartElement("content");
        wr.WriteString(strContent);
        wr.WriteEndElement(); // </content>
    }
    if (strRecipients.Length > 0)
    {
        wr.WriteStartElement("recipientList");
        wr.WriteString(strRecipients);
        wr.WriteEndElement(); // </recipientList>
    }
    wr.WriteEndElement(); // </error>
}//end BuildError

xmsData

xmsData 文字列は、テキスト メッセージまたはマルチメディア メッセージのどちらかをパッケージ化することを目的としています。つまり、テキスト メッセージとマルチメディア メッセージは同じスキーマを共有します。次の例は、MMS 形式のメッセージが含まれる xmsData 文字列と、SMS 形式のメッセージが含まれる xmsData 文字列を示しています。

SMS 形式のメッセージが含まれる xmsData 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsData client="Microsoft Office Outlook 12.0" xmlns = "https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <user>
        <userId>myname</userId>
        <password>mypwd</password>
        <replyPhone>13801391350</replyPhone>
        <customData/>
    </user>
    <xmsHead>
        <scheduled>2005-04-20T14:20:00Z</scheduled>
        <requiredService>SMS_SENDER</requiredService>
        <to>
            <recipient>135xxxx</recipient>
            <recipient>139xxxx</recipient>
        </to>
    </xmsHead>
    <xmsBody format="SMS">
        <content contentType="text/plain" contentId="Att0.txt@AB1B43B2B0594564.B94EF7ABB12B49BA"
            contentLocation="1.txt">(1/2)This is the first SMS message...</content>
        <content contentType="text/plain" contentId="Att1.txt@AB1B43B2B0594564.B94EF7ABB12B49BA"
            contentLocation="2.txt">(2/2)This is the second SMS message...</content>
    </xmsBody>
</xmsData>

MMS 形式のメッセージが含まれる xmsData 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsData client="Microsoft Office Outlook 12.0"xmlns = "https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <user>
        <userId>myname</userId>
        <password>mypwd</password>
        <replyPhone>13801391350</replyPhone>
        <customData/>
    </user>
    <xmsHead>
        <scheduled>2005-04-20T14:20:00Z</scheduled>
        <requiredService>MMS_SENDER</requiredService>
        <sourceType>reminder</sourceType>
        <to>
            <recipient>135xxxx</recipient>
            <recipient>139xxxx</recipient>
        </to>
        <subject>My Message</subject>
    </xmsHead>
    <xmsBody format="MMS">
        <mmsSlides>
            <head>
                <meta name="author" content="msOfficeOutlookOms" />
                <layout>
                    <root-layout width="120" height="120" background-color="#ffffff" />
                    <region id="image" left="0" top="0" width="120" height="90" />
                    <region id="text" left="0" top="90" width="120" height="30" />
                </layout>
            </head>
            <body>
                <par dur="3000">
                    <img src="cid:Att1.gif@AB1B43B2B0594564.B94EF7ABB12B49BA" region="image" />
                    <text src="cid:Att0.txt@AB1B43B2B0594564.B94EF7ABB12B49BA" region="text"/>
                    <audio src="cid:Att2.mid@AB1B43B2B0594564.B94EF7ABB12B49BA" />
                </par>
            </body>
        </mmsSlides>
        <content contentType="text/plain" contentId="Att0.txt@AB1B43B2B0594564.B94EF7ABB12B49BA"
            contentLocation="1.txt">This is the text part</content>
        <content contentType="image/gif" contentId="Att1.gif@AB1B43B2B0594564.B94EF7ABB12B49BA"
            contentLocation="106675.gif">/9j/4AAQ ...... AVExISEyccHhcgLikxMC4p</content>
        <content contentType="audio/midi" contentId="Att2.mid@AB1B43B2B0594564.B94EF7ABB12B49BA"
            contentLocation="1898.mid">/wDQjVYUrl ...... GoJ4e8j</content>
    </xmsBody>
</xmsData>

string DeliverXmsBatch(string packageXml) Web サービス メソッド

SharePoint に組み込まれている OMS クライアントは DeliverXmsBatch() を呼び出して、複数の xmsData 要素を 1 つの XML トランザクションでサービス プロバイダーに配信します。メッセージの内容は、packageXml と呼ばれる XML 形式の文字列としてパッケージ化されます。サービス プロバイダーはメッセージ送信を試みた後、xmsResponses と呼ばれる XML 形式の文字列を返します。この文字列には、各受信者への各メッセージ送信が成功したか失敗したかを示す 1 つ以上の error 要素が含まれます。

次のコード例は、XmlTextWriter オブジェクトを使用して、呼び出しの成功または失敗を xmsResponses 文字列に書き込む DeliverXmsBatch() の実装を示しています。

// ...
private const string m_sOmsNamespace = "https://schemas.microsoft.com/office/Outlook/2006/OMS";

[WebMethod]
public String DeliverXmsBatch(String packageXml)
{
    if (String.IsNullOrEmpty(packageXml))
    {
        throw new ArgumentNullException("packageXml", "packageXml can't be null or empty!");
    }
    String xmsDataTag = "xmsData";
    String xmsBatchTag = "xmsBatch";

    StringWriter responseStringWriter = new StringWriter();
    XmlWriter responseXmlWriter = CreateXmlWriter(responseStringWriter);

    Stack<String> stack = new Stack<String>();
    using (XmlReader reader = XmlReader.Create(new StringReader(packageXml)))
    {
        int messageCount = 0;
        responseXmlWriter.WriteStartElement("xmsResponses", m_sOmsNamespace);
        String nameSpace = String.Empty;

        while (!reader.EOF)
        {
            if (stack.Count == 0)
            {
                if (reader.IsStartElement() && reader.LocalName == xmsBatchTag)
                {
                    stack.Push(xmsBatchTag);
                    nameSpace = reader.NamespaceURI;
                }
            }
            else if (reader.IsStartElement() && stack.Peek() == xmsBatchTag)
            {
                if (reader.IsStartElement(xmsDataTag, nameSpace))
                {
                    String response = String.Empty;

                    if (++messageCount <= m_MaxBatchSize)
                    {
                        // Process this node and its subnodes.
                        response = SendOneXms(reader.ReadOuterXml(), true);
                    }
                    else
                    {
                        String xmsId = reader.GetAttribute("Id");

                        using (StringWriter stringWriter = new StringWriter(new StringBuilder()))
                        {
                            using (XmlTextWriter writer = new XmlTextWriter(stringWriter))
                            {
                                writer.WriteStartElement("xmsResponse");

                                if (!String.IsNullOrEmpty(xmsId))
                                {
                                    writer.WriteAttributeString("Id", xmsId);
                                }

                                String content = String.Format(
                                    "One batch can only contain {0} messages at maximum.", m_MaxBatchSize);
                                BuildError(writer, "perbatchmsglimit", true, content, "");

                                response = stringWriter.GetStringBuilder().ToString();
                            }
                        }

                        reader.ReadOuterXml(); //skip this node and its sub-nodes.
                    }

                    responseXmlWriter.WriteRaw(response);
                    continue;
                }
            }

            reader.Read();
        }
    }

    responseXmlWriter.WriteEndElement();
    responseXmlWriter.Flush();

    return responseStringWriter.ToString();
}

public string SendOneXms(string xmsData, bool batchMode)
{
    String xmsId = "0";
    StringWriter stringWriter = null;
    XmlTextWriter writer = null;

    try
    {
        XmlReader reader = XmlReader.Create(new StringReader(xmsData));
        stringWriter = new StringWriter(new StringBuilder());
        writer = new XmlTextWriter(stringWriter);
        writer.WriteStartElement("xmsResponse", batchMode ? "" : m_sOmsNamespace);
 
        // Update xmsId with your code (for example, reader.GetAttribute("Id")).

        if (!String.IsNullOrEmpty(xmsId))
        {
            writer.WriteAttributeString("Id", xmsId);
        }

        // User validation.
        CUserLogon usrLogon = new CUserLogon(xmsData);
        if (!usrLogon.FLogon())
        {
            BuildError(writer, "invalidUser", true /* failure */, "", "");
            return stringWriter.GetStringBuilder().ToString();
        }

        // Add your code for your business logic to send the xmsData
        // to the intended recipients.
        // ...
        // Sent out OK.

        reader.Close();

        BuildError(writer, "ok", false /* success */, "", "");

        return stringWriter.GetStringBuilder().ToString();
    }

    catch (XmlException ex)
    {
        // Handle exceptions.
        String attrText = batchMode ? "Id=\"" + xmsId + "\"" : "xmlns=    
            \"https://schemas.microsoft.com/office/Outlook/2006/OMS\"";

        return "<?xml version=\"1.0\" encoding=\"utf-16\"?>"
           + " <xmsResponse " + attrText + ">"
           + "   <error code=\"others\" severity=\"failure\"> <content>" 
           + ex.Message + "</content> </error>" + "</xmsResponse>";
    }

    finally
    {
        if (writer != null)
            writer.Close();
        if (stringWriter != null)
            stringWriter.Close();
    }
}

packageXml

packageXml 文字列は、複数の xmsData (テキスト メッセージまたはマルチメディア メッセージ) を 1 つの XML スキーマにパッケージ化することを目的としています。次の例は、2 つの SMS 形式のメッセージが含まれる packageXml 文字列を示しています。

2 つの SMS 形式のメッセージが含まれる packageXml 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsBatch client="Microsoft Windows SharePoint Service" xmlns="https://schemas.microsoft.com/office/Outlook/2006/OMS">
  <xmsData id="0">
    <user>
      <userId>ddguo</userId>
      <password />
      <customData />
    </user>
    <xmsHead>
      <requiredService>SMS_SENDER</requiredService>
      <sourceType>wssAlert</sourceType>
      <to>
        <recipient>13671121236</recipient>
      </to>
    </xmsHead>
    <xmsBody format="SMS">
      <content contentType="text/plain" contentId="1.txt@5ca13ed023024ed59cfae6c0e185a5db" contentLocation="1.txt">This is a testing message.</content>
    </xmsBody>
  </xmsData>
  <xmsData id="1">
    <user>
      <userId>ddguo</userId>
      <password />
      <customData />
    </user>
    <xmsHead>
      <requiredService>SMS_SENDER</requiredService>
      <sourceType>wssAlert</sourceType>
      <to>
        <recipient>13671121236</recipient>
      </to>
    </xmsHead>
    <xmsBody format="SMS">
      <content contentType="text/plain" contentId="1.txt@ecf25304326e497c8775a929a3178311" contentLocation="1.txt">This is a testing message.</content>
    </xmsBody>
  </xmsData>
</xmsBatch>

サポートされているコンテンツ タイプ

ショート メッセージ サービス (SMS) メッセージは、"text/plain" コンテンツ タイプをサポートします。マルチメディアメッセージングサービス (MMS) メッセージについては、OMS は、表 2 に記載されているメディア オブジェクトをサポートします。OMS は、クライアント側で必要に応じて他のメディアの種類をこれらの標準形式に変換します。

表 2. サポートされているコンテンツ タイプ

コンテンツ

MIME タイプ

説明

テキスト

text/plain

プレーン テキスト。SMS および MMS の両方のメッセージで使用できます。

静的イメージ

image/jpeg

96 DPI。xmsData 文字列の root-layout 要素で定義されているモバイル画面サイズ以下。Base64 エンコード。MMS メッセージにのみ適用。

マルチフレーム画像

image/gif

CIF89a。96 DPI。最大 256 色。xmsData 文字列の root-layout 要素で定義されているモバイル画面サイズ以下。Base64 エンコード。MMS メッセージにのみ適用。

MIDI オーディオ形式

Audio/mid

MIDI 形式。Base64 エンコード。MMS メッセージにのみ適用。

AMR サウンド形式

Audio/AMR

AMR 形式。シングル チャネル、8K Hz。Base64 エンコード。MMS メッセージにのみ適用。

OMS Web サービスは、1 つの xmsData 文字列で受信したメッセージが、サービスによって設定されている制限に準拠しているかどうかを確認し、必要なアクションを行うか、または該当するエラー コードを使用してエラーを返します。

xmsResponse および xmsResponses

DeliverXms() は、1 つ以上の error 要素が含まれる xmsResponse という名前の XML 形式の文字列を返します。userInfo と同様、error 要素の code 属性が "ok" に設定され、severity 属性が "neutral" に設定されている場合は、成功したことを示します。

DeliverXmsBatch() は、このバッチ内のすべての xmsData 要素について配信が試行されるたびに、1 つ以上のエラー xmsResponse 要素が含まれる xmsResponses という名前の XML 形式の文字列を返します。

error 要素には 2 つの子要素が含まれます。1 つは content で、これはエラーの説明またはパラメーターが含まれる文字列です。もう 1 つの recipientList は、エラーの影響を受ける受信者のセミコロン区切りのリストが含まれる文字列です。

各エラーに対して定義できるのは、多くて 1 つの content 要素と 1 つの recipientList 要素です。recipientList 要素がない場合は、すべての受信者にエラーが適用されることを意味します。

エラー コードには、code と severity の 2 つの必須属性があります。エラー コードは大文字と小文字が区別されません。使用できる重要度の値を次に示します。

  • 既定値は "neutral" で、適切に送信が完了したことを意味します。つまり、サービスはエラー メッセージ以外を OMS クライアントに送信します。

  • "failure" 値は、メッセージが 1 人以上の受信者に配信されなかったことを示します。

error 要素と severity 属性を使用する際の注意事項を次に示します。

  • error 要素が xmsResponse 文字列に含まれない場合、OMS クライアントでは、failure エラーが発生したと見なします。

  • code 属性のない error 要素が xmsResponse 文字列に含まれる場合、OMS クライアントでは、不明な failure エラーが発生したと見なします。

  • severity 属性のない error 要素が xmsResponse 文字列に含まれる場合、OMS クライアントでは、重要度が "neutral" であると見なします。

  • 複数のエラー コードが返される場合は、一番高い重要度が設定されているエラーによって、OMS クライアントが配信不能レポート (NDR) を生成してユーザーに送信するかどうかが決まります。1 つ以上の "failure" エラーがある場合、OMS クライアントは、メッセージが配信されなかったことをユーザーに通知する NDR を生成します。

次に xmsResponse 文字列の例を示します。

メッセージが適切に送信されたことを示す xmsReponse 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsResponse xmlns="https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <error code="ok" severity="neutral"/> 
</xmsResponse>

"failure" エラーが含まれる xmsReponse 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsResponse xmlns="https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <error code="perDayMsgLimit" severity="failure">
        <content>20 SMS</content>
        <recipientList>13601391354;13601391388</recipientList>
    </error> 
</xmsResponse>

DeliverXmsBatch() によって返される xmsResponses 文字列の例

<?xml version="1.0" encoding="utf-8"?>
<xmsResponses xmlns="https://schemas.microsoft.com/office/Outlook/2006/OMS">
    <xmsResponse id="0">
        <error code="ok" severity="neutral" />
        <error code="serviceupdate" severity="neutral">
            <content>2008-08-28T08:59:10Z</content>
        </error>
    </xmsResponse>
    <xmsResponse id="1">
        <error code="ok" severity="neutral" />
        <error code="serviceupdate" severity="neutral">
            <content>2008-08-28T08:59:11Z</content>
        </error>
    </xmsResponse>
</xmsResponses>

Web サービス URL リダイレクト

OMS Web サービスへの正確な URL がまだ指定されていない場合、OMS の実際の Web サービス URL への URL リダイレクトが OMS クライアントに提供されます。Web サービスの実際の URL を取得するために、OMS クライアントは、まず空の HTTP POST 要求を Web サービスに送信し、続いて SOAP 要求を送信します。次に、空の文字列をパラメーターとして指定して DeliverXms()、DeliverXmsBatch()、および GetUserInfo() を呼び出します。Web サービスは、こうした空の HTTP POST または呼び出しを標準の要求として処理し、単純にそれらを無視します。

受信モバイル メッセージのパッケージ化

Outlook と携帯電話間の双方向のモバイル メッセージ通信を有効にするには、OMS Web サービスは、携帯電話から送信された返信を OMS 定義のコンテンツ クラスと共に Multipurpose Internet Mail Extensions (MIME) 形式の SMTP 電子メール メッセージにパッケージ化する必要があります。そして、ユーザーが指定した電子メール アドレスに、その電子メール メッセージを送信します。SMTP 電子メール メッセージを受信した Outlook は、コンテンツ クラスを認識し、モバイル メッセージとして処理します。

図 2 と図 3 は、MIME 形式の電子メール メッセージでエンコードされた SMS 返信と MMS 返信の例です。以降のセクションでは、モバイル メッセージを電子メール メッセージとしてパッケージ化する手順について説明します。

メッセージ ヘッダー

OMS クライアントが受信電子メール メッセージを携帯電話からのメッセージとして適切に認識できるように、返信を電子メール メッセージにエンコードするときに、以降のセクションの説明に従って SMTP ヘッダーを設定します。

コンテンツ クラス

メッセージ ヘッダー "Content-class" を次のどちらかの値に設定します。

  • SMS メッセージのコンテンツ クラス: MS-OMS-SMS

  • MMS メッセージのコンテンツ クラス: MS-OMS-MMS

上記のコンテンツ クラスの値が含まれる電子メール メッセージを受け取った Outlook は、そのメッセージをテキスト メッセージまたはマルチメディア メッセージとして認識し、そのメッセージ用の特定のアイコンを表示します。これらのメッセージは、表示、返信、または転送されるときに自動的にモバイル メッセージとして処理されます。

電子メール メッセージとしてパッケージ化された受信モバイル メッセージがクライアントによって確実かつ適切に表示されるようにするには、メディアの種類が "text" の MIME パーツおよび US ASCII 以外のテキストが含まれるすべてのヘッダーに対して適切な文字セットを設定します。

X-MS-Reply-To-Mobile

特に送信者の携帯電話番号を伝達するために、次のヘッダーを追加します。

X-MS-Reply-To-Mobile:

ヘッダーは有効な携帯電話番号である必要があります。

X-MS-Reply-To-Mobile ヘッダーの例を次に示します (携帯電話番号の最初の 2 桁は国コードを表します)。

X-MS-Reply-To-Mobile:+8613601391354

宛先

To フィールドの値は、受信モバイル メッセージを受け取るユーザー指定の電子メール アドレスです。

To: someone@example.com

差出人

From フィールドの値は、返信を送信するときに使用するメール アドレスです。OMS サービス プロバイダーは、返信の送信用として一意の SMTP アドレスをすべてのサブスクライバーに提供する必要があります。From フィールドの例を次に示します。

From: userid.spmail@spdomain.com

件名

受信 SMS メッセージ用の返信の電子メール アドレスの場合、Subject フィールドの推奨値は、SMS メッセージ本文の最初の約 40 文字、または SMS メッセージの先頭行です (メッセージ本文に複数行が含まれる場合)。

受信 MMS メッセージ用の返信電子メール メッセージの場合、電子メール メッセージの [件名] を MMS メッセージの [件名] として設定します。MMS メッセージは、Outlook のプレビュー ウィンドウには完全には表示できないので、MMS メッセージの [件名] にコメントを追加し、メッセージを開いてメッセージの内容を表示するようにユーザーに通知します。

Subject of MMS Message (Open the message to view content)

メッセージ本文

受信 SMS メッセージ

受信 SMS メッセージのメッセージ本文を作成するには、図 2 で示すように、次のヘッダーを追加して、SMS メッセージの内容に対してプレーン テキストの MIME パーツを作成します。

Content-Type: text/plain; charset=xxxx

Content-Transfer-Encoding: quoted-printable

有効な文字セット値の例は "us-ascii" (ASCII) と "gb2312" (簡易字中国語) です。また、サービス プロバイダーは、content-type として multipart/alternative を使用して、メッセージ本文の HTML ビューを提供することもできます。

図 2. 電子メール メッセージとしてパッケージ化された受信 SMS メッセージの例

From: "Mobile Inbound Agent" incomingmessage@example-service-provider.com

To: someone@example.com

Subject: This is a text message

Date: Mon, 7 Nov 2005 17:52:00 +0800

Content-class: MS-OMS-SMS

X-MS-Reply-to-mobile: +8613601391354

MIME-Version: 1.0

Content-Type: text/plain; charset="gb2312"

Content-Transfer-Encoding: quoted-printable

This is a text message from a mobile phone replying to a text message from Outlook.

受信 MMS メッセージ

受信 MMS メッセージのメッセージ本文を作成する場合、MMS メッセージを MIME 形式の SMTP メールとしてエンコードするときは、3GPP 標準に従います。

SMIL が利用可能の場合は、multipart/related として MIME 本文を作成します。

Content-Type: multipart/related; type="application/smil";

SMIL ファイルの最初の MIME パーツは次のようになります。

Content-Type: application/smil; name = "mmspresent.smil"

MMS メッセージのメディア パーツは、SMIL ファイルに従って、対応するメディアの種類で MIME パーツとしてエンコードする必要があります。

SMIL を使用できない場合は、multipart/mixed として MIME 本文を作成します。

Content-type: multipart/mixed

MMS メッセージのメディア パーツを、対応するメディアの種類で MIME パーツとしてエンコードします。図 3 は、MIME 形式でエンコードされた MMS メッセージの例です。

図 3. 電子メール メッセージとしてパッケージ化された受信 MMS メッセージの例

From: "Mobile Inbound Agent" incomingmessage@example-service-provider.com

To: someone@example.com

Subject: This is a multimedia message (Open the message to view its content)

Date: Mon, 7 Nov 2005 17:52:00 +0800

Content-class: MS-OMS-MMS

X-MS-Reply-to-mobile: +8613601391354

MIME-Version: 1.0

Content-Type: multipart/related; type="application/smil";

boundary="--------------Boundary=_thisisboundary"

This is a multipart message in MIME format.

--------------Boundary=_thisisboundary

Content-Type: application/smil; name="mmspresent.smil"

Content-Location: ”mmspresent.smil”

Content-Transfer-Encoding: Base64

PHNtaWw+… 1pbD4=

--------------Boundary=_thisisboundary

Content-Type: text/plain; name="textpart.txt"

Content-Transfer-Encoding: Base64

Content-Location: textpart.txt

6Zi/5YWs5Y+45rOV5b6L5biI6IyD5Zu057uV6YGT6LCi

--------------Boundary=_thisisboundary

Content-Type: image/gif; name="imagepart.gif"

Content-Transfer-Encoding: Base64

Content-Location:imagepart.gif

R0lGODlheABaAPf/…BDQi6j4uQAxwcixRzZErI5ROjfvSHJcmRMGBAAOw==

--------------Boundary=_thisisboundary

Content-Type: audio/midi; name="audiopart.mid"

Content-Transfer-Encoding: Base64

Content-Location: audiopart.mid

TVRoZAAAAAY…XBDfwA/fwA6f4dAOgAAPwAAQwAA/y8A

--------------Boundary=_thisisboundary

接続のセキュリティ

インターネット経由で転送される情報を保護するために、OMS Web サービスは SSL (Secure Socket Layer) 暗号化をサポートする必要があります。SSL を使用すると、インターネットのような信頼されていないネットワーク上でより安全な接続を確立できます。SSL によりクライアントとサーバー間でやり取りされるメッセージの暗号化と復号化が可能になり、これは転送中にメッセージが読み取られるのを防ぐのに役立ちます。

まとめ

この記事では、OMS Web サービス アーキテクチャについて紹介し、OMS Web サービスと OMS クライアント間のインターフェイスについて説明しています。OMS Web サービスをホストするためのガイドラインについては、「Office 2010 Mobile Service ガイドライン (パート 2/3)」を参照してください。OMS Web サービスの XML スキーマおよび WSDL については、「Office 2010 Mobile Service ガイドライン (パート 3/3)」を参照してください。

その他の技術情報

詳細については、次のリソースを参照してください。