在 Exchange 中使用 EWS 发送电子邮件
本文档可能包含与预发布功能或产品相关的内容,这些功能或产品在最终商业发布之前可能会有重大变化。本文档按"原样"提供,仅供参考,Microsoft 不在本文档中作出任何明示或暗示担保。 了解在 Exchange 中如何使用 EWS 托管 API 或 EWS 发送新的或草稿电子邮件,或者发送延迟的电子邮件。
不论您使用的是 EWS 托管 API 还是 EWS,您都可以通过两种方式发送电子邮件。 您可以发送现有邮件,如存储在“草稿”文件夹中的邮件,也可以一步创建和发送电子邮件。 不论您是立即发送邮件,还是发送延迟邮件,用于发送邮件的方法和操作均相同。
表 1. 用于发送电子邮件的 EWS 托管 API 方法和 EWS 操作
任务 | EWS 托管的 API 方法 | EWS 操作 |
---|---|---|
发送新的电子邮件 |
EmailMessage.SendAndSaveCopy |
CreateItem |
发送现有电子邮件 |
EmailMessage.Send |
SendItem |
使用 EWS 托管 API 发送新的电子邮件
以下代码示例介绍如何使用 EmailMessage 对象创建电子邮件,使用 SendAndSaveCopy 方法将邮件发送给收件人并将邮件保存在"已发送邮件"文件夹中。
此示例假定 service 是有效的 ExchangeService 对象,且用户已通过 Exchange 服务器的身份验证。
// 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 发送新的电子邮件
以下代码示例介绍如何使用 MessageDisposition 值为 SendAndSaveCopy 的 CreateItem 操作创建电子邮件、将邮件发送给收件人并将邮件保存在"已发送邮件"文件夹中。 这也是当您 发送新的电子邮件时 EWS 托管 API 发送的 XML 请求。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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>
服务器使用 CreateItemResponse 邮件响应 CreateItem 请求,其中包括 ResponseCode 值 NoError(表示电子邮件创建成功)和新创建邮件的 ItemId。
使用 EWS 托管 API 发送草稿电子邮件
以下代码示例介绍如何发送存储在"草稿"文件夹中的邮件,如使用 EWS 托管的 API 创建一封电子邮件中所示。 首先,使用 Bind 方法检索邮件,然后使用 Send 方法发送电子邮件,如以下代码示例中所示。 请注意,此方法不会将已发送的邮件保存在"已发送邮件"文件夹中。
在这种情况下,会将 EmailMessageSchema.Subject 和 EmailMessageSchema.ToRecipients 属性添加到 PropertySet,以便值可以包含在控制台输出中。
此示例假定 service 是有效的 ExchangeService 对象,且用户已通过 Exchange 服务器的身份验证。
// 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 元素的 BaseShape 为 IdOnly,AdditionalProperties 元素包括项目架构中的 Subject 属性和邮件架构中的 ToRecipients 属性的 FieldURI 值,这意味着在响应中仅向客户端返回 ItemId、Subject 和 ToRecipients 元素。 有关限制调用中返回的值的详细信息以及 BaseShape 元素的含义,请参阅 属性集和响应形状在 EWS 在 Exchange。
这也是调用 Bind 方法时 EWS 托管 API 发送的 XML 请求。 某些属性和元素的值已缩短,以方便读取。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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>
以下示例显示了服务器在处理 GetItem 操作后返回的 XML 响应。 响应指示电子邮件已成功检索,且包括所请求的 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="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://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="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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 以及 SavedItemFolderId,后者指定了已发送的邮件将保存到哪个文件夹中。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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>
服务器使用 SendItemResponse 邮件响应 SendItem 请求,其中包括 ResponseCode 值 NoError,表示电子邮件已成功发送。
使用 EWS 托管 API 发送延迟的电子邮件
以下代码示例介绍如何使用 EmailMessage 对象创建电子邮件,如何使用 ExtendedPropertyDefinition 类创建 PidTagDeferredSendTime (0x3FEF0040) 属性的属性定义,如何使用 SendAndSaveCopy 方法发送延迟的邮件并将邮件保存在"已发送邮件"文件夹中。
此示例假定 service 是有效的 ExchangeService 对象,且用户已通过 Exchange 服务器的身份验证。
// 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 发送延迟的电子邮件
以下代码示例介绍如何使用 MessageDisposition 值为 SendAndSaveCopy 的 CreateItem 操作创建电子邮件,如何使用 ExtendedProperty 元素为 PidTagDeferredSendTime (0x3FEF0040) 属性创建属性定义以设置发送邮件的时间,以及如何使用 SavedItemFolderId 元素将已发送的邮件保存在"已发送邮件"文件夹中。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://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>
服务器使用 CreateItemResponse 邮件响应 CreateItem 请求,其中包括 ResponseCode 值 NoError(表示电子邮件创建成功)和新创建邮件的 ItemId。