【问题标题】:Getting the email id from the Outlook REST API when sending email发送电子邮件时从 Outlook REST API 获取电子邮件 ID
【发布时间】:2016-10-03 22:21:02
【问题描述】:

我正在尝试使用 Microsoft Rest API 代表我们的用户发送电子邮件。当我将消息创建为草稿时,我会返回一个 ID,我可以在以后的请求中使用该 ID 进行编辑、删除、查看完整对话(在发送之后)等。

我不想将它保存为草稿,因为我没有理由,我只想直接发送。发送后,我仍然想查看完整的对话。但是,如果我只是发送电子邮件(使用 /sendmail 端点),我不会得到那个 ID。有没有办法得到它?这是我的要求:

发布https://outlook.office.com/api/v2.0/Users/email/sendmail

{
    "Message": {
        "Subject": "Test",
        "Importance": "Normal",
        "ToRecipients": [{
            "EmailAddress": {
                "Address": "<email>",
                "Name": "<name>"
            }
        }],
        "Sender": {
            "EmailAddress": {
                "Address": "<email",
                "Name": "<name>"
            }
        },
        "Body": {
            "ContentType": "HTML",
            "Content": "<html>\\n<head>\\n  <style>\\n    p { color: red; }\\n  </style> \\n</head>\\n<body>\\n  <p>Test</p>\\n</body>\\n</html>\\n"
        }
    },
    "SaveToSentItems": "true"
}

HTTP 响应代码是 202,电子邮件发送,但正文为空(没有内容,无论如何)。

我认为这并不重要,因为我可以在 Postman 中重新创建它,但我正在使用 node-outlook 包在 Nodejs 中运行它。

【问题讨论】:

    标签: office365-restapi


    【解决方案1】:

    通过 REST 和 EWS 在 Exchange 中的电子邮件提交进行传输,但实际发送和随后保存到已发送项目文件夹是异步完成的。这就是为什么你没有得到身份证。传输是将电子邮件实际写入已发送项目文件夹的人,而不是 REST。

    如果您确实需要在将项目保存到 sentItems 文件夹后找到该项目,请设置 PR_SEARCH_KEY 之类的内容,然后查看已发送项目文件夹并查找该搜索键值。

    另请注意,当您保存草稿时,您返回的 id 将与已发送项目文件夹中的项目 id 不同,因为文件夹 Id 是项目 id 的一部分,因此 id 不会无论如何都可以帮助你。

    【讨论】:

    • 是的,这似乎更像我正在寻找的东西。我无法弄清楚如何在 REST API 中使用它,可能是因为我对 Outlook API 不是很熟悉。我认为这是我正在寻找的文档:msdn.microsoft.com/en-us/office/office365/api/…,但我无法弄清楚如何识别属性(名称、guid 等)。你能有一个如何使用它的例子吗?
    • 好的,我通过将其添加到消息中使其工作:"SingleValueExtendedProperties": [{"PropertyId":"String {8ECCC264-6880-4EBE-992F-8888D2EEAA1C} Id 0x300B","Value":"1"}],但我仍然不明白它为什么工作。特别是,我不明白 GUID 的用途。
    • Guid 只是一个命名空间。以上表示命名空间 中的属性 0x300B。 MAPI 这样做是为了使我的命名空间中的 0x300B 不会与您的命名空间中的 0x300B 冲突。
    • 好的,有道理。所以不管它是什么,只要没有其他人使用我正在使用的相同值?
    • 嗯,这取决于你想做什么 :) 在你上面的扩展道具中,你正在设置一些你已经定义的自定义属性。那完全没问题。但是,如果要设置 PR_SEARCHKEY,则需要对扩展属性使用 PropertyTag 格式。 PropertyTags 用于众所周知的基于 MAPI 的属性。您的值是“0x300B”是正确的,但它不需要命名空间或 id,因为它是众所周知的道具。所以改为使用类似:“PropertyId”:“Binary 0x300B”)。
    【解决方案2】:

    我不知道您使用的是哪个 rest api 版本(我使用的是 v2.0),但我会尝试解释这个问题。对不起,我的英语提前了。

    您有两种方式回复消息:即时方式或完整方式。

    在飞行途中

    方法很简单,只需发送 post 请求到

    https://outlook.office.com/api/v2.0/me/messages/{message_id}/回复

    https://outlook.office.com/api/v2.0/me/messages/{message_id}/replyall

    和身体

    {
      "Comment": "This is your message in plain text or html code"
    }
    

    仅此而已。

    这种方法的问题是您只能发送纯文本或 HTML,不能发送附件或其他任何内容。如果这就是你所需要的,这是你最好的选择。

    完整的方法

    如果您需要发送附件或执行任何其他操作,您需要执行以下 3 个步骤:

    1.根据您要回复的消息创建草稿

    发送发布请求

    https://outlook.office.com/api/v2.0/me/messages/{message_id}/createreply

    这将为您提供一个 json 对象,保存此草稿的“Id”属性 {draft_id} 以供以后使用。

    2.更新草稿

    发送补丁请求到

    https://outlook.office.com/api/v2.0/me/messages/{draft_id}

    和身体

    {
      "Body": {
        "ContentType": "HTML or Text",
        "Content": "Your response in plain text or html"
      }
    }
    

    或您想要更改的任何其他参数。

    3.发送草稿

    发送发布请求

    https://outlook.office.com/api/v2.0/me/messages/{draft_id}/send

    就是这样。

    如果您需要更多信息,请查看https://msdn.microsoft.com/en-us/office/office365/api/mail-rest-operations

    【讨论】:

    • 哇。我忘记了这个问题,已经有一段时间了,我不再使用Outlook Rest API了。您的答案有很多有用的内容,但它没有回答所提出的问题。最初的问题是关于收到其他人对我最初发送的电子邮件(通过 api)的回复,这是一种非常不寻常的情况。我确实设法通过扩展属性解决了这个问题,并以 David Sterling 提供的信息为起点。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2010-09-25
    • 2015-05-03
    • 2016-11-30
    相关资源
    最近更新 更多