【问题标题】:How to migrate from Exchange service to Graph API to retrieve/sending emails如何从 Exchange 服务迁移到 Graph API 以检索/发送电子邮件
【发布时间】:2022-10-06 07:09:23
【问题描述】:

我有几个控制台应用程序,它们使用名为 \"Email provider\" 的通用项目来获取和发送电子邮件。我必须迁移我的电子邮件提供商才能使用 Graph API 执行此功能。以最小的努力在所有控制台应用程序上实现这一目标的最佳方法是什么。下面是我使用的连接和方法。请帮忙。

public ExchangeEngine(string ServiceUrl, string MailboxName, string UserName, string Password,string Domain)
{
    service.Url = new Uri(ServiceUrl);
    service.TraceEnabled = false;
    service.UseDefaultCredentials = false;
    service.Credentials = new NetworkCredential(UserName, Password, Domain);
    service.AutodiscoverUrl(MailboxName, RedirectionUrlValidationCallback);
    mailBox = new Mailbox(MailboxName);
}

是否可以通过 Graph API 建立连接并获取所有消息并将它们转换为 \"EmailMessage\" 对象?

    标签: c# asp.net asp.net-mvc microsoft-graph-api azure-ad-graph-api


    【解决方案1】:

    看看使用 Graph SDK 例如https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=csharp

    你在哪里

    service.Credentials = new NetworkCredential(UserName, Password, Domain);
    

    如果其无人值守代码,则需要将其迁移以使用 oAuth,然后查看使用客户端凭据流https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

    如果您有 onPrem 邮箱,您需要确保所有用户都使用 Exchange Online/Office365 来使用该图表,您仍然需要为这些邮箱使用 EWS

    [根据评论编辑]

    如果您要在同一代码库中同时使用 EWS 和 Graph,您希望避免在上层业务逻辑中直接使用 EmailMessage 或 Graph 消息类(否则您将需要复制大量代码)。转换对象不是一个好主意,通常只会导致其他问题。要将其抽象化,您需要创建自己的 Message 类(例如,将其称为 ProcessMessage 等),该类应包含您上层逻辑所需的所有属性(和方法)。然后你可以有一个方法包含

    var messages = await graphClient.Me.Messages .Request() .Select("sender,subject") .GetAsync();

    并返回 Graph 的 ProcessMessage 对象的集合,与 EWS 类似,您可以使用另一种方法返回相同的对象集合。这将您必须在代码中进行的重复限制在数据提供者(例如 EWS 或图表)中。更好的方法是使用接口和工厂模式我在https://github.com/gscales/MEC-Talk-2022/tree/main/DiscoveryLibraryEWSAndGraph 中有一个简单的例子

    归根结底,它是关于使您的代码更易于维护和调试。例如,如果您在使用 Graph 时遇到问题,但 EWS 工作正常,那么您只需要调试 Graph 数据提供程序代码,反之亦然。或者当您将来更新时等。

    【讨论】:

    • 谢谢@Glen Scales。我必须为此使用 Graph API。因此,在从下面的代码中获取消息后,您能否帮助我使用我需要创建的映射器以将其转换为较旧的退出 EWS 消息对象?
    • var messages = await graphClient.Me.Messages .Request() .Select("sender,subject") .GetAsync();
    • 为什么需要将其转换为旧的 EWS 对象,您应该只使用 Graph Message 对象(如果您没有 OnPrem 邮箱)或使用接口并将其抽象出来,因此与底层数据提供者无关在你的代码中。
    • 你能用例子解释一下吗?
    猜你喜欢
    • 2015-06-24
    • 2011-12-03
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多