Рекомендации по работе с Office 2010 Mobile Service (часть 1 из 3)

Сводка.  В данной статье рассказывается о построении и размещении веб-служб для Microsoft Office 2010 Mobile Service (OMS). Здесь также рассматривается архитектура OMS, поток сообщений и протоколы связи между клиентами OMS и веб-службами. Обратите внимание, что в Office 2010 используется обновленная версия службы Outlook Mobile по сравнению с выпуском 2007 системы Microsoft Office. (20 печатных страниц)

Дата последнего изменения: 9 марта 2015 г.

Применимо к: 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

В этой статье
Введение в протокол OMS
Архитектура и поток сообщений
Протоколы связи
Перенаправление URL-адресов веб-службы
Упаковка входящих мобильных сообщений
Заключение
Дополнительные материалы

Содержание

  • Введение в протокол OMS

  • Архитектура и поток сообщений

  • Протоколы связи

  • Перенаправление URL-адресов веб-службы

  • Упаковка входящих мобильных сообщений

  • Заключение

  • Дополнительные материалы

Введение в протокол OMS

Microsoft Office 2010 Mobile Service (OMS) — это компонент обмена сообщениями, разработанный для Microsoft Outlook 2010 и Microsoft SharePoint 2010. С помощью OMS пользователи могут легко интегрировать мобильные возможности Outlook и SharePoint с мобильными устройствами.

С помощью предоставляемых OMS функций обмена мобильными сообщениями пользователи могут выполнять указанные ниже задачи.

  • Создание текстовых и мультимедийных сообщений в Outlook.

  • Пересылка элементов Outlook (включая сообщения электронной почты, собрания и контакты) в виде текстовых или мультимедийных сообщений.

  • Получение ответов с мобильных устройств и двустороннее взаимодействие между Outlook и мобильными телефонами.

  • Получение предупреждений из SharePoint на мобильные телефоны.

  • Расширение возможностей обмена сообщениями в Outlook и SharePoint OMS с помощью объектной модели.

OMS в Outlook

С помощью предоставляемых OMS функций перенаправления элементов пользователи могут не только создавать и отправлять текстовые и мультимедийные сообщения в Outlook, но и автоматически перенаправлять напоминания, сообщения электронной почты и расписание на следующий день на мобильный телефон с помощью простых условий. Пользователи также могут отправлять сообщения электронной почты, встречи и приглашения на собрания на мобильные телефоны и другие адреса электронной почты.

Параметры протокола OMS встроены в параметры учетной записи Outlook, что обеспечивает эффективную интеграцию, благодаря которой пользователи могут управлять учетными записями для мобильных сообщений параллельно с учетными записями электронной почты. Номера мобильных телефонов рассматриваются как разновидность адреса, а пользователи могут добавлять получателей мобильных сообщений с помощью функции автозавершения или путем выбора имен непосредственно из адресной книги Outlook. Пользователи также могут сохранять мобильные сообщения в папки Outlook и управлять ими.

Клиент OMS, встроенный в Outlook и SharePoint, отправляет текстовые и мультимедийные сообщения веб-службе, созданной и размещенной партнерами, которые являются операторами мобильной связи либо поставщиками услуг обмена мобильными сообщениями. После этого веб-служба доставляет сообщение в центр текстовых или мобильных сообщений оператора мобильной связи.

OMS в SharePoint 2010

В SharePoint 2010 пользователь может получать через OMS текстовые предупреждения (в виде SMS-сообщений). Пользователь может получать уведомления о состоянии документов или списков SharePoint, текстовые сообщения о любых изменениях, а также при необходимости URL-адреса документов или списков.

Дополнительные сведения

Данная статья является первой в серии из трех статей, которая представляет собой введение в OMS и содержит рекомендации и справочные сведения по работе с этой службой. Рекомендации по реализации веб-службы OMS см. в статье Рекомендации для службы Office 2010 Mobile (часть 2 из 3). Сведения о схеме XML для данных, передаваемых между поставщиками веб-службы OMS и клиентами OMS, см. в статье Рекомендации по работе с Office 2010 Mobile Service (часть 3 из 3).

Читатели должны быть знакомы с разработкой и развертыванием веб-служб. Общие сведения о веб-службах см. в статье Веб-службы (Возможно, на английском языке). Дополнительные сведения о разработке веб-служб см. в документации к используемому средству разработки.

Архитектура и поток сообщений

Архитектура OMS представляет собой платформу клиентской службы, основанную на технологии веб-службы. Клиент OMS, встроенный в Outlook или SharePoint, преобразует мобильное сообщение в сообщение SOAP и отправляет его веб-службе OMS, где оно кодируется и доставляется на шлюз мобильных сообщений оператора. Затем сообщение доставляется на мобильный телефон указанного пользователя по беспроводным сетям оператора мобильной связи. Веб-служба OMS создается и размещается поставщиком услуг, который является либо оператором мобильной связи, либо агрегатором (поставщиком содержимого Интернета, поставщиком интернет-услуг или организацией, предоставляющей услуги обмена мобильными сообщениями). Спецификация веб-службы OMS и протоколы связи между клиентом OMS и веб-службой описаны в разделе Протоколы связи данной статьи.

В настоящее время SharePoint 2010 доставляет мобильные сообщения веб-службе OMS в одностороннем порядке, а Outlook обеспечивает двустороннее взаимодействие с веб-службой OMS. Сообщения передаются между Outlook и мобильным телефоном получателя через веб-службу OMS и инфраструктуру оператора, как показано на рис. 1. Ответы с мобильного телефона получателя могут поступать в папку "Входящие" Outlook, на мобильный телефон отправителя или и туда, и туда, в зависимости от предпочтений пользователя. Для доставки ответов в папку "Входящие" пользователя Outlook поставщик услуг упаковывает их в сообщения электронной почты по протоколу SMTP в соответствии со спецификацией корпорации Майкрософт (см. раздел Упаковка входящих мобильных сообщений данной статьи).

Рис. 1. Поток сообщений для OMS в Outlook

Архитектура и поток обработки сообщений

Протоколы связи

При разработке веб-службы OMS необходимо соблюдать ряд правил. Во-первых, веб-служба OMS должна соответствовать требованиям языка WSDL. Это позволяет клиенту OMS подключаться к службе без изменения кода службы.

Во-вторых, веб-служба OMS должна поддерживать указанные ниже веб-методы.

  • string GetServiceInfo() — возвращает свойства веб-службы OMS.

  • string GetUserInfo(string xmsUser) — возвращает сведения о пользователе.

  • string DeliverXms(string xmsData) — отправляет веб-службе одно мобильное сообщение.

  • string DeliverXmsBatch(string packageXml) — отправляет веб-службе несколько строк xmsData в одном пакете.

В-третьих, веб-служба OMS должна соответствовать рекомендациям по отправке мобильных сообщений клиенту OMS Outlook по электронной почте, приведенным в разделе Упаковка входящих мобильных сообщений данной статьи.

Примечание

При обновлении веб-службы OMS с Microsoft Office Outlook 2007 обратите внимание, что веб-метод SendXms был переименован в DeliverXms, начиная с Outlook 2007 с пакетом обновления 1 (SP1). Если необходимо, чтобы веб-служба OMS одновременно работала с RTM-версией Outlook 2007, Outlook 2007 с пакетом обновления 1 (SP1) или Outlook 2010, необходимо обеспечить поддержку обоих методов SendXms и DeliverXms, задав одинаковое определение для SendXms и DeliverXms. После того, как все подписчики обновятся до Outlook 2007 с пакетом обновления 1 (SP1) или Outlook 2010, поддержку метода SendXms можно прекратить.

Пример реализации простой веб-службы

В приведенном ниже примере кода показана упрощенная реализация веб-службы OMS. Методы 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 описаны более подробно, включая примеры кода и строк в формате XML (serviceInfo, userInfo и xmsResponse), подаваемых на вход этим методам и возвращаемых ими. WSDL-код для этих веб-методов и схемы для строк в формате XML, подаваемых на вход этим методам и возвращаемых ими, приведены в последней статье данной серии, Рекомендации по работе с Office 2010 Mobile Service (часть 3 из 3).

Метод веб-службы string GetServiceInfo()

Метод GetServiceInfo() возвращает строку в формате XML serviceInfo, содержащую основные свойства веб-службы OMS, например поддерживаемые типы служб, параметры поддерживаемых служб и типы проверки подлинности.

Клиент OMS, встроенный в Outlook, вызывает метод GetServiceInfo() для получения свойств веб-службы OMS, когда пользователь настраивает новую учетную запись, или для обновления свойств службы после публикации веб-службы OMS. На основе этих свойств OMS настраивает веб-службу в качестве поддерживаемого поставщика услуг на стороне клиента.

В приведенном ниже примере кода показана строка serviceInfo, возвращаемая методом GetServiceInfo().

<?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 передается в формате Юникод, а затем преобразуется в кодировку UTF-16.

  • Значение serviceUri используется в качестве уникального идентификатора службы. Если строка serviceUri для веб-службы OMS изменяется, клиент OMS рассматривает такую службу как новую.

  • Для поддержки длинных текстовых сообщений поставщик услуг может присвоить атрибутам maxSbcsPerMessage и maxDbcsPerMessage элемента SMS_SENDER значения, поддерживаемые в большинстве используемых подписчиками моделей.

  • Если веб-служба OMS присваивает атрибуту supportSlide элемента MMS_SENDER строки serviceInfo значение true, это указывает на то, что веб-служба поддерживает формат SMIL. Сообщение, в котором используется формат SMIL, находится в так называемом слайдовом режиме. Если веб-служба OMS, не поддерживающая формат SMIL, получает сообщение в слайдовом режиме, она должна либо вернуть сообщение об ошибке типа other, либо преобразовать сообщение в неслайдовый режим.

Метод веб-службы string GetUserInfo(string xmsUser)

Клиент OMS, встроенный в Outlook, получает номер мобильного телефона пользователя и другие сведения путем вызова метода GetUserInfo(), которому в качестве параметра передается строка xmsUser. xmsUser — это строка в формате XML, содержащая сведения для проверки подлинности пользователя, включая идентификатор пользователя и пароль. Метод GetUserInfo() возвращает строку в формате XML userInfo, содержащую элемент error, атрибуту severity которого присвоено значение failure. Схема для строки xmsUser приведена в последней статье данной серии, Рекомендации по работе с Office 2010 Mobile Service (часть 3 из 3).

Коды ошибок, обычно возвращаемые в строке userInfo, приведены в таблице 1.

Таблица 1. Ошибки, возвращаемые при вызове метода GetUserInfo()

Код

Уровень серьезности

Ok

Neutral

invalidUser

Failure

unregisteredUser

Failure

expiredUser

Failure

Полный список кодов ошибок, возвращаемых веб-службой OMS, см. в разделе "Коды ошибок OMS" статьи Рекомендации по работе с Office 2010 Mobile Service (часть 3 из 3). Обратите внимание, что схема userInfo не содержит дочерних элементов content и recipientList, описанных в данном разделе. Кроме того, атрибут severity не является обязательным для ошибки в строке userInfo, но является обязательным в строке xmsResponse. Если для элемента error в строке userInfo атрибут severity не определен, клиент OMS предполагает, что ошибка имеет уровень серьезности neutral.

Примечание

Строки xmsUser и userInfo передаются в формате Юникод, а затем преобразуются в кодировку UTF-16.

В приведенном ниже примере кода показана реализация метода GetUserInfo(), в котором для записи сведений о пользователе и кода ошибки в строку в формате XML используется объект XmlTextWriter.

// ...
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>

Пример строки userInfo, возвращаемой методом GetUserInfo() после успешного вызова

<?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 получает значение replyPhone путем вызова метода GetUserInfo() при настройке пользователем учетной записи. Клиент OMS также вызывает метод GetUserInfo() для обновления номера телефона replyPhone пользователя, когда пользователь просматривает или изменяет учетную запись и не вводит номер мобильного телефона или когда веб-служба OMS уведомляет клиента об изменении сведений о службе в сообщении об ошибке с кодом serviceUpdate.

В Outlook 2007 элемент replyPhone использовался в качестве номера ответного звонка по умолчанию для некоторых рынков, например рынка Кореи, где номер ответного звонка является обязательным. В Outlook 2010 поддержка этой функции прекращена, а данный элемент не является обязательным.

Наконец, элемент smtpAddress содержит уникальный SMTP-адрес, создаваемый поставщиком услуг для каждого подписчика. Поставщик услуг использует этот SMTP-адрес для отправки ответов с мобильного телефона обратно в Outlook. Создание уникального SMTP-адреса для каждого подписчика необходимо поставщикам услуг OMS, чтобы предотвратить отправку злоумышленниками нежелательной почты по SMTP-адресу.

Метод веб-службы string DeliverXms(string xmsData)

Клиент OMS, встроенный в Outlook или SharePoint, вызывает метод DeliverXms() для доставки мобильного сообщения поставщику услуг. Содержимое сообщения упаковывается в строку в формате XML xmsData. После попытки отправки сообщения поставщик услуг возвращает строку в формате XML xmsResponse, содержащую один или несколько элементов error, указывающих на успешность или неуспешность отправки сообщения каждому указанному получателю.

В приведенном ниже примере кода показана реализация метода DeliverXms(), в котором объект XmlTextWriter используется для записи сведений об успешном выполнении вызова или сбое при выполнении вызова в строку xmsResponse.

// ...
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 предназначена для упаковки текстового или мультимедийного сообщения, т. е. для текстовых и мультимедийных сообщений используется одна схема. В приведенных ниже примерах показана строка xmsData, содержащая сообщение в формате MMS, и строка xmsData, содержащая сообщение в формате SMS.

Пример строки xmsData, содержащей сообщение в формате SMS

<?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>

Пример строки xmsData, содержащей сообщение в формате MMS

<?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)

Клиент OMS, встроенный в SharePoint, вызывает метод DeliverXmsBatch() для доставки поставщику услуг нескольких элементов xmsData в рамках одной XML-транзакции. Содержимое сообщения упаковывается в строку в формате XML packageXml. После попытки отправки сообщения поставщик услуг возвращает строку в формате XML xmsResponses, содержащую один или несколько элементов, указывающих на успешность или неуспешность отправки сообщения каждому указанному получателю.

В приведенном ниже примере кода показана реализация метода DeliverXmsBatch(), в котором объект XmlTextWriter используется для записи сведений об успешном выполнении вызова или сбое при выполнении вызова в строку xmsResponses.

// ...
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 (текстовых или мультимедийных сообщений) в единую схему XML. В приведенном ниже примере показана строка packageXml, содержащая два сообщения в формате SMS.

Пример строки packageXml, содержащей два сообщения в формате SMS

<?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

text/plain

Обычный текст. Может использоваться и в SMS-, и в MMS-сообщениях.

Статическое изображение

image/jpeg

96 точек на дюйм. Меньше или равно размеру экрана мобильного устройства, определенному в элементе root-layout строки xmsData. Кодировка Base64. Применимо только к MMS-сообщениям.

Изображение, состоящее из нескольких кадров

image/gif

GIF89a, 96 точек на дюйм, максимум 256 цветов. Меньше или равно размеру экрана мобильного устройства, определенному в элементе root-layout строки xmsData. Кодировка Base64. Применимо только к MMS-сообщениям.

Звуковой формат MIDI

Audio/mid

Формат MIDI. Кодировка Base64. Применимо только к MMS-сообщениям.

Звуковой формат AMR

Audio/AMR

Формат AMR, один канал, 8 КГц. Кодировка Base64. Применимо только к MMS-сообщениям.

Веб-служба OMS отвечает за проверку сообщений, полученных в одной строке xmsData, на соответствие ограничениям, наложенным службой, и выполнение необходимых действий или возврат сообщений об ошибках с соответствующими кодами ошибок.

xmsResponse и xmsResponses

Метод DeliverXms() возвращает строку в формате XML xmsResponse, содержащую один или несколько элементов error. Как и для строки userInfo, элемент error, атрибуту code которого присвоено значение ok, а атрибуту severity — значение neutral, указывает на успех.

Метод DeliverXmsBatch() возвращает строку в формате XML xmsResponses, содержащую один или несколько элементов xmsResponse для каждого элемента xmsData в пакете, соответствующего попытке доставки.

Элемент error имеет два дочерних элемента: content, который представляет собой строку с описанием параметров ошибки, и recipientList, который представляет собой список разделенных точкой с запятой получателей, на которых повлияла эта ошибка.

Для каждого элемента ошибки можно определить не более одного элемента content и не более одного элемента recipientList. Отсутствие элемента recipientList означает, что ошибка распространяется на всех получателей.

Каждый код ошибки имеет два обязательных атрибута: code и severity. В коде ошибки регистр не учитывается. Ниже перечислены возможные значения уровня серьезности ошибки.

  • Значение neutral устанавливается по умолчанию и означает, что отправка успешно завершена или что служба отправляет клиенту OMS сообщение об отсутствии ошибок.

  • Значение failure означает, что сообщение не было доставлено одному или нескольким получателям.

Ниже приведены примечания по использованию элемента error и атрибута severity.

  • Если элемент error в строке xmsResponse отсутствует, клиент OMS предполагает, что произошла ошибка уровня failure.

  • Если элемент error входит в строку xmsResponse без атрибута code, клиент OMS предполагает, что произошла неизвестная ошибка уровня failure.

  • Если элемент error входит в строку xmsResponse без атрибута severity, клиент OMS предполагает, что уровень серьезности равен neutral.

  • При возврате нескольких кодов ошибок ошибка с максимальным уровнем серьезности определяет, будет ли в клиенте OMS создан и отправлен пользователю отчет о недоставке. Если одна или несколько ошибок имеет уровень серьезности failure, клиент OMS создает отчет о недоставке, уведомляющий пользователя о том, что сообщение не было доставлено.

Ниже приведены примеры строк 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>

Пример строки xmsReponse с ошибкой уровня failure

<?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>

Пример строки xmsResponses, возвращаемой методом DeliverXmsBatch()

<?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>

Перенаправление URL-адресов веб-службы

Если точный URL-адрес веб-службы OMS не указан, для клиентов OMS выполняется перенаправление URL-адреса на реальный URL-адрес веб-службы OMS. Для получения реального URL-адреса веб-службы клиент OMS сначала отправляет веб-службе пустой запрос HTTP POST, за которым следует запрос SOAP, а затем вызывает методы DeliverXms(), DeliverXmsBatch() и GetUserInfo(), передавая в качестве параметра пустую строку. Веб-служба должна обработать подобные пустые запросы HTTP POST и вызовы как обычные запросы и просто проигнорировать их.

Упаковка входящих мобильных сообщений

Для обеспечения двустороннего обмена мобильными сообщениями между Outlook и мобильным телефоном веб-служба OMS должна упаковать ответ, отправляемый с мобильного телефона, в SMTP-сообщение в формате MIME с определенным в OMS классом контента. Затем веб-служба OMS отправляет сообщение электронной почты на указанный пользователем адрес. Когда приложение Outlook получает сообщение электронной почты SMTP, оно распознает класс контента и обрабатывает сообщение как мобильное.

На рис. 2 и 3 приведены примеры SMS- и MMS-ответов, закодированных в виде сообщений электронной почты в формате MIME. В следующих разделах приведены инструкции по упаковке мобильных сообщений в сообщения электронной почты.

Заголовки сообщения

При преобразовании ответа в сообщение электронной почты задайте заголовки SMTP, как показано в приведенных ниже разделах, чтобы клиент OMS мог распознавать входящие сообщения электронной почты как поступающие с мобильного телефона.

Content-Class

Присвойте заголовку сообщения Content-class одно из указанных ниже значений.

  • Класс контента SMS-сообщения: MS-OMS-SMS

  • Класс контента MMS-сообщения: MS-OMS-MMS

Когда приложение Outlook получает сообщения электронной почты с данными классами контента, оно распознает их как текстовые или мультимедийные сообщения и отображает соответствующие значки. При открытии таких сообщений, ответе на них и их пересылке они автоматически обрабатываются как мобильные сообщения.

Чтобы в клиенте правильно отображались входящие мобильные сообщения, упакованные в сообщения электронной почты, задайте надлежащий набор знаков для всех заголовков, содержащих текст не в кодировке US ASCII, и частей MIME типа text.

X-MS-Reply-To-Mobile

Добавьте следующий заголовок, предназначенный специально для передачи номера мобильного телефона отправителя:

X-MS-Reply-To-Mobile:

Это заголовок должен содержать действительный номер мобильного телефона.

Ниже приведен пример заголовка X-MS-Reply-To-Mobile (первые два разряда номера мобильного телефона представляют собой код страны).

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

To

Значением поля To является адрес электронной почты, предоставленный пользователем для получения входящих мобильных сообщений:

To: someone@example.com

From

Значением поля From является адрес электронной почты, используемый для отправки ответа. Поставщики услуг OMS должны предоставить каждому подписчику уникальный SMTP-адрес для отправки ответов. Поле From должно быть подобно приведенному ниже примеру.

From: userid.spmail@spdomain.com

Subject

Если сообщение электронной почты создается в ответ на входящее SMS-сообщение, в качестве значения поля Subject рекомендуется использовать первые 40 (или близкое число) знаков текста SMS-сообщения или первую строку SMS-сообщения (если сообщение состоит из нескольких строк).

Если сообщение электронной почты создается в ответ на входящее MMS-сообщение, присвойте полю Тема сообщения электронной почты значение поля Тема MMS-сообщения. Поскольку MMS-сообщения не полностью отображаются в области просмотра Outlook, добавьте к полю Тема MMS-сообщения примечание с предложением просмотреть содержимое сообщения путем его открытия, как показано в приведенном ниже примере.

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

Текст сообщения

Входящее SMS-сообщение

Чтобы создать текст входящего SMS-сообщения, как показано на рис. 2, создайте текстовую часть MIME для содержимого SMS-сообщения, добавив указанные ниже заголовки.

Content-Type: text/plain; charset=xxxx

Content-Transfer-Encoding: quoted-printable

Примеры допустимых значений для набора знаков: us-ascii (ASCII) и gb2312 (китайский (упрощенное письмо)). Поставщики услуг также могут использовать тип контента multipart/alternative и обеспечить поддержку HTML для текста сообщения.

Рис. 2. Пример входящего SMS-сообщения, упакованного в сообщение электронной почты

От: "Мобильный агент входящих сообщений" incomingmessage@example-service-provider.com

Кому: someone@example.com

Тема: Это текстовое сообщение

Дата: понедельник, 7 ноября 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

Это текстовое сообщение с мобильного телефона, отправленное в ответ на текстовое сообщение из Outlook.

Входящее MMS-сообщения

При создании текста входящих MMS-сообщений следуйте стандарту 3GPP на кодирование MMS-сообщений в виде SMTP-сообщений в формате MIME.

Если формат SMIL поддерживается, создайте текст MIME как multipart/related:

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

Первая часть MIME файла SMIL должна выглядеть следующим образом:

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

Мультимедийные части MMS-сообщения должны быть закодированы как части MIME с соответствующими мультимедийными типами файла SMIL.

Если формат SMIL не поддерживается, создайте текст MIME как multipart/mixed:

Content-type: multipart/mixed

Закодируйте мультимедийные части MMS-сообщения как части MIME с соответствующими мультимедийными типами. На рис. 3 приведен пример MMS-сообщения, закодированного в формате MIME.

Рис. 3. Пример входящего MMS-сообщения, упакованного в сообщение электронной почты

От: "Мобильный агент входящих сообщений" incomingmessage@example-service-provider.com

Кому: someone@example.com

Тема: Эта мультимедийное сообщение (откройте сообщение, чтобы просмотреть его содержимое)

Дата: понедельник, 7 ноября 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"

Это составное сообщение в формате MIME.

--------------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 должны поддерживать шифрование SSL. Протокол SSL используется для установки безопасных подключений в ненадежных сетях, например в Интернете. SSL обеспечивает шифрование и расшифровку сообщений, передаваемых между клиентом и сервером, защищая их таким образом от перехвата при передаче.

Заключение

В данной статье рассматривается архитектура веб-службы OMS и интерфейсы между веб-службой OMS и клиентом OMS. Рекомендации по размещению веб-службы OMS см. в статье Рекомендации для службы Office 2010 Mobile (часть 2 из 3). Схему XML и WSDL-код для веб-служб OMS см. в статье Рекомендации по работе с Office 2010 Mobile Service (часть 3 из 3).

Дополнительные материалы

Дополнительные сведения см. в следующих документах: