65.9K
CodeProject 正在变化。 阅读更多。
Home

设置 EmailMessage 属性 – 更新

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2022 年 2 月 21 日

CPOL
viewsIcon

4776

如何更新没有公共 setter 的 EmailMessage 属性

引言

这篇文章是对 设置 EmailMessage 属性 (2014 年发布) 的更新。它仍然使用 EWS v2.2.0,但根据 这篇文章

从 2018 年 7 月 19 日起,Exchange Web Services (EWS) 将不再接收功能更新。虽然该服务将继续接收安全更新和某些非安全更新,但产品设计和功能将保持不变。

背景

解决方案使用 C#, .NET Framework 4.7.2, EWS 2.2, NUnit, FluentAssertions。

解决方案

解决方案包含一个控制台应用程序 EWSMailMessage 和一个测试库 EWSMailMessage.TestsEmailMethods 类经过了一些修改,以允许单独更新每个提到的属性

public class EmailMethods : IEmailMethods
{
	public EmailMessage CreateEmailMessage(ExchangeService service,
			string subject,
			string body,
			string address)
	{
		if (service == null ||
			string.IsNullOrWhiteSpace(subject) ||
			string.IsNullOrWhiteSpace(address))
			return null;

		var emailMessage = new EmailMessage(service)
		{
			Subject = subject,
			Body = body,
			ItemClass = "IPM.Note",
			From = address
		};

		return emailMessage;
	}

	public void SetReceivedBy(EmailMessage emailMessage, string address)
	{
		if (emailMessage == null ||
			string.IsNullOrWhiteSpace(address))
			return;
		SetProperty(emailMessage, EmailMessageSchema.ReceivedBy, new EmailAddress(address));
		return;
	}

	public void SetDateTimeCreated(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeCreated, dateTime);
		return;
	}

	public void SetDateTimeSent(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeSent, dateTime);
		return;
	}

	public void SetDateTimeReceived(EmailMessage emailMessage, DateTime dateTime)
	{
		if (emailMessage == null)
			return;
		SetProperty(emailMessage, ItemSchema.DateTimeReceived, dateTime);
		return;
	}

	#region Set property

	private bool SetProperty(EmailMessage message,
			PropertyDefinition propertyDefinition,
			object value)
	{
		if (message == null)
			return false;

		// get value of PropertyBag property – that is wrapper
		// over dictionary of inner message’s properties
		var members = message.GetType().FindMembers(
			MemberTypes.Property,
			BindingFlags.NonPublic | BindingFlags.Instance,
			PartialName,
			"PropertyBag");
		if (members.Length < 1)
			return false;

		var propertyInfo = members[0] as PropertyInfo;
		if (propertyInfo == null)
			return false;

		var bag = propertyInfo.GetValue(message, null);
		members = bag.GetType().FindMembers(
			MemberTypes.Property,
			BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
			PartialName,
			"Properties");
		if (members.Length < 1)
			return false;

		// get dictionary of properties values
		var properties = ((PropertyInfo)members[0]).GetMethod.Invoke(bag, null);
		var dictionary = properties as Dictionary<PropertyDefinition, object>;
		if (dictionary == null)
			return false;

		dictionary[propertyDefinition] = value;
		return true;
	}

	private bool PartialName(MemberInfo info, Object part)
	{
		// Test whether the name of the candidate member contains the
		// specified partial name.
		return info.Name.Contains(part.ToString());
	}

	#endregion
}

Program.cs 演示了如何调用方法

var emailMethods = new EmailMethods();
var exchangeServer = new ExchangeService();
var emailMessage = emailMethods.CreateEmailMessage(
	exchangeServer, "New Subject", "Interesting text", "illya@ireznykov.com");

emailMethods.SetReceivedBy(emailMessage, "ews@example.com");
emailMethods.SetDateTimeCreated(emailMessage, DateTime.Now.AddDays(-1));
emailMethods.SetDateTimeSent(emailMessage, DateTime.Now.AddHours(-22));
emailMethods.SetDateTimeReceived(emailMessage, DateTime.Now.AddHours(-20));

1. 所有使用的 IP 地址、服务器名称、工作站、域名均为虚构,仅用于演示。
2. 信息按“原样”提供。

© . All rights reserved.