Отправка сообщений электронной почты с помощью EWS в Exchange

Узнайте, как отправлять новые или черновики сообщений электронной почты или отправлять отложенное сообщение электронной почты с помощью управляемого API EWS или EWS в Exchange.

Независимо от того, используете ли вы управляемый API EWS или EWS, вы можете отправлять сообщения электронной почты двумя способами. Вы можете отправить существующее сообщение, например сообщение, хранящееся в папке Черновики, или создать и отправить сообщение электронной почты за один шаг. Методы и операции, используемые для отправки сообщения, одинаковы, независимо от того, отправляете ли вы сообщение немедленно или отправляете отложенное сообщение.

Таблица 1. Методы управляемого API EWS и операции EWS для отправки сообщений электронной почты

Задача Метод управляемого API EWS Операция EWS
Отправка нового сообщения электронной почты
EmailMessage.SendAndSaveCopy
CreateItem
Отправка существующего сообщения электронной почты
EmailMessage.Send
SendItem

Отправка нового сообщения электронной почты с помощью управляемого API EWS

В следующем примере кода показано, как использовать объект EmailMessage для создания сообщения электронной почты и метод SendAndSaveCopy для отправки сообщения получателю и сохранения сообщения в папке Отправленные.

В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server.

// Create an email message and provide it with connection 
// configuration information by using an ExchangeService object named service.
EmailMessage message = new EmailMessage(service);
// Set properties on the email message.
message.Subject = "Company Soccer Team";
message.Body = "Are you interested in joining?";
message.ToRecipients.Add("sadie@contoso.com");
// Send the email message and save a copy.
// This method call results in a CreateItem call to EWS.
message.SendAndSaveCopy();
Console.WriteLine("An email with the subject '" + message.Subject + "' has been sent to '" + message.ToRecipients[0] + "' and saved in the SendItems folder.");

Отправка нового сообщения электронной почты с помощью EWS

В следующем примере кода показано, как использовать операцию CreateItem со значениемMessageDispositionSendAndSaveCopy для создания сообщения электронной почты, отправки сообщения получателю и сохранения сообщения в папке Отправленные. Это также XML-запрос, который управляемый API EWS отправляет при отправке нового сообщения электронной почты.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages" 
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types" 
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SendAndSaveCopy">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="sentitems" />
      </m:SavedItemFolderId>
      <m:Items>
        <t:Message>
          <t:Subject>Company Soccer Team</t:Subject>
          <t:Body BodyType="HTML">Are you interested in joining?</t:Body>
          <t:ToRecipients>
            <t:Mailbox>
              <t:EmailAddress>sadie@contoso.com </t:EmailAddress>
              </t:Mailbox>
          </t:ToRecipients>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

В ответ на запрос CreateItem сервер отправляет сообщение CreateItemResponse, включающее параметр ResponseCode со значением NoError, которое указывает, что сообщение было успешно создано, и свойство ItemId созданного сообщения.

Отправка черновика сообщения электронной почты с помощью управляемого API EWS

В следующем примере кода показано, как отправить сообщение, хранящееся в папке Черновики, как показано в разделе Создание сообщения электронной почты с помощью управляемого API EWS. Сначала используйте метод Bind для получения сообщения, а затем используйте метод Send для отправки сообщения электронной почты, как показано в следующем примере кода. Обратите внимание, что этот метод не сохраняет отправленное сообщение в папке Отправленные.

В этом случае свойства EmailMessageSchema.Subject и EmailMessageSchema.ToRecipients добавляются в PropertySet , чтобы эти значения можно было включить в выходные данные консоли.

В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server.

// As a best practice, create a property set that limits the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ToRecipients);
// This method call results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, ItemId, propSet);
// Send the email message.
// This method call results in a SendItem call to EWS.
message.Send();
Console.WriteLine("An email with the subject '" + message.Subject + "' has been sent to '" + message.ToRecipients[0] + "'.");

Отправка черновика сообщения электронной почты с помощью EWS

В следующих примерах кода показано, как отправить сообщение, которое ранее хранилось в папке Черновики, как показано в разделе Создание сообщения электронной почты с помощью EWS. Сначала используйте операцию GetItem , чтобы получить сообщение электронной почты для отправки. Затем используйте операцию SendItem , чтобы отправить сообщение электронной почты получателям и сохранить его в папке Отправленные.

Первое сообщение, сообщение запроса GetItem , указывает ItemId черновика сообщения электронной почты для привязки, а элементы элемента ItemShape ограничивают результаты для включения в ответ GetItem . Элемент ItemShape имеет baseShapeidOnly, а элемент AdditionalProperties включает значения FieldURI для свойства Subject из схемы Item и свойство ToRecipients из схемы Message, что означает, что клиенту в ответе будут возвращены только элементы ItemId, Subject и ToRecipients . Дополнительные сведения об ограничении значений, возвращаемых в вызовах, и значении элемента BaseShape см. в разделе Наборы свойств и фигуры ответов в EWS в Exchange.

Это также XML-запрос, который отправляется управляемым API EWS при вызове метода Bind . Для удобства значения некоторых атрибутов и элементов были сокращены.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:GetItem>
      <m:ItemShape>
        <t:BaseShape>IdOnly</t:BaseShape>
        <t:AdditionalProperties>
          <t:FieldURI FieldURI="item:Subject" />
          <t:FieldURI FieldURI="message:ToRecipients" />
        </t:AdditionalProperties>
      </m:ItemShape>
      <m:ItemIds>
        <t:ItemId Id="AAMkADE4=" />
      </m:ItemIds>
    </m:GetItem>
  </soap:Body>
</soap:Envelope>

В приведенном ниже примере показан XML-ответ, возвращаемый сервером после обработки операции GetItem. Ответ указывает, что сообщение электронной почты было успешно получено, и содержит элементы Subject и ToRecipient в соответствии с запросом. Для удобства значения некоторых атрибутов и элементов были сокращены.

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:ServerVersionInfo MajorVersion="15"
                         MinorVersion="0"
                         MajorBuildNumber="842"
                         MinorBuildNumber="10"
                         Version="V2_8"
                         xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns="https://schemas.microsoft.com/exchange/services/2006/types"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <m:GetItemResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
                       xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
      <m:ResponseMessages>
        <m:GetItemResponseMessage ResponseClass="Success">
          <m:ResponseCode>NoError</m:ResponseCode>
          <m:Items>
            <t:Message>
              <t:ItemId Id="AAMkADE4="
                        ChangeKey="CQAAABYA" />
              <t:Subject>Project priorities</t:Subject>
              <t:ToRecipients>
                <t:Mailbox>
                  <t:Name>sadie@contoso.com</t:Name>
                  <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
                  <t:RoutingType>SMTP</t:RoutingType>
                  <t:MailboxType>OneOff</t:MailboxType>
                </t:Mailbox>
              </t:ToRecipients>
            </t:Message>
          </m:Items>
        </m:GetItemResponseMessage>
      </m:ResponseMessages>
    </m:GetItemResponse>
  </s:Body>
</s:Envelope>

Второе сообщение, сообщение запроса SendItem , указывает ItemId отправленного сообщения электронной почты, а также SaveItemFolderId, который указывает папку, в которой нужно сохранить отправленный элемент.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2007_SP1" />
  </soap:Header>
  <soap:Body>
    <m:SendItem SaveItemToFolder="true">
      <m:ItemIds>
        <t:ItemId Id="AAMkADE4="
                  ChangeKey="CQAAABYA" />
      </m:ItemIds>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="sentitems" />
      </m:SavedItemFolderId>
    </m:SendItem>
  </soap:Body>
</soap:Envelope>

Сервер отвечает на запрос SendItem сообщением SendItemResponse , которое содержит значение ResponseCodeNoError, указывающее, что сообщение электронной почты отправлено успешно.

Отправка сообщения электронной почты с задержкой с помощью управляемого API EWS

В следующем примере кода показано, как использовать объект EmailMessage для создания сообщения электронной почты, класс ExtendedPropertyDefinition для создания определения свойства PidTagDeferredSendTime (0x3FEF0040) и метод SendAndSaveCopy для отправки отложенного сообщения и сохранения сообщения в папке Отправленные.

В этом примере предполагается, что служба является действительным объектом ExchangeService, и что пользователь прошел проверку подлинности на сервере Exchange server.

// Create a new email message. 
EmailMessage message = new EmailMessage(service);
// Specify the email recipient and subject. 
message.ToRecipients.Add("sadie@contoso.com");
message.Subject = "Delayed email";
// Identify the extended property that can be used to specify when to send the email. 
ExtendedPropertyDefinition PidTagDeferredSendTime = new ExtendedPropertyDefinition(16367, MapiPropertyType.SystemTime);
// Set the time that will be used to specify when the email is sent. 
// In this example, the email will be sent one minute after the next line executes, 
// provided that the message.SendAndSaveCopy request is processed by the server within one minute. 
string sendTime = DateTime.Now.AddMinutes(1).ToUniversalTime().ToString();
// Specify when to send the email by setting the value of the extended property. 
message.SetExtendedProperty(PidTagDeferredSendTime, sendTime);
// Specify the email body. 
StringBuilder str = new StringBuilder();
str.AppendLine("The client submitted the SendAndSaveCopy request at: " + DateTime.Now.ToUniversalTime().ToString() + ".");
str.AppendLine("The email message will be sent at: " + sendTime + ".");
message.Body = str.ToString();
Console.WriteLine("");
Console.WriteLine("The client submitted the SendAndSaveCopy request at: " + DateTime.Now.ToUniversalTime().ToString() + ".");
Console.WriteLine("The email message will be sent at: " + sendTime + ".");
// Submit the request to send the email message. 
message.SendAndSaveCopy();

Отправка сообщения электронной почты с задержкой с помощью EWS

В следующем примере кода показано, как использовать операцию CreateItem со значениемMessageDispositionSendAndSaveCopy для создания сообщения электронной почты, элемент ExtendedProperty для создания определения свойства Для свойства PidTagDeferredSendTime (0x3FEF0040) для задания времени отправки сообщения, а элемент SavedItemFolderId — для сохранения отправленного сообщения в папке Отправленные.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange207_SP1" />
  </soap:Header>
  <soap:Body>
    <m:CreateItem MessageDisposition="SendAndSaveCopy">
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="sentitems" />
      </m:SavedItemFolderId>
      <m:Items>
        <t:Message>
          <t:Subject>Delayed email</t:Subject>
          <t:Body BodyType="HTML">
            The client submitted the SendAndSaveCopy request at: 1/2/2014 9:08:52 PM.
            The email message will be sent at: 1/2/2014 9:09:52 PM.
          </t:Body>
          <t:ExtendedProperty>
            <t:ExtendedFieldURI PropertyTag="16367"
                                PropertyType="SystemTime" />
            <t:Value>2014-01-02T21:09:52.000</t:Value>
          </t:ExtendedProperty>
          <t:ToRecipients>
            <t:Mailbox>
              <t:EmailAddress>sadie@contoso.com</t:EmailAddress>
            </t:Mailbox>
          </t:ToRecipients>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

В ответ на запрос CreateItem сервер отправляет сообщение CreateItemResponse, включающее параметр ResponseCode со значением NoError, которое указывает, что сообщение было успешно создано, и свойство ItemId созданного сообщения.

См. также