天道酬勤,学无止境

在 Outlook Graph API 中,在草稿上调用发送后,邮件 ID 似乎发生了变化(In Outlook Graph API, the message ID appears to change after calling send on a draft)

问题

我正在与 Outlook365 集成,需要跟踪通过应用程序发送的电子邮件回复,以便可以使用 Outlook Online 打开电子邮件。

因为/sendMail返回一个空响应,阅读文档我注意到可以使用以下内容创建对现有消息的草稿回复:

POST /v1.0/me/messages/{previous message ID}/createReply

这将返回一个表示回复的消息,该消息已经分配了一个消息 ID。 使用正确的值更新消息后,我将其发送:

POST /v1.0/me/messages/{draft message ID}/send

此调用返回空响应。 尝试检索消息导致未找到错误:

GET /v1.0/me/messages/{draft message ID}

但是我在列出消息后注意到,在发送后,消息被分配了一个新的 ID。

有没有办法关联两个 ID,或者以某种方式跟踪发送的消息 ID,以便我可以访问消息的正确(和最终) webLink属性?

首先十分感谢。

回答1

不幸的是,Microsoft-Graph-API 在调用send-mail-API后不会返回sent-message-id

有一些解决方案可以找到sent-message-id。

  1. 按 internet-message-id 搜索
  2. 创建草稿,更新正文并发送消息(使用draft-message-id)
  3. 列表消息,并通过过滤器conversationId并获取最新消息。

解决方案 1 和 2 不稳定,Microsoft 没有提供可靠的文档并且解决问题并不容易。

但是,第三个解决方案工作正常。

请考虑 Microsoft-Graph-API 不支持filterorderBy的组合。


图包装器


// Microsoft-Graph-API built-in method for list-messages doesn't work fine, so we have to implement it
MGraph.geMessagesByUrl = async function(url) {
  const responseString = await request.get({
    url: url,
    headers: { Authorization: `Bearer ${this.tokens.access_token}` }
  })

  const data = JSON.parse(responseString)

  return data.value
}

MGraph.createMessage = async function(message) {
  // setup your microsoft-graph-api client

  return await client.api('/me/messages').post(message)
}

MGraph.updateMessage = async function(messageId, message) {
  // setup your microsoft-graph-api client

  return await client.api(`/me/messages/${messageId}`).update(message)
}

// Microsoft-Graph-API built-in method for add-attachments doesn't work fine, so we have to implement it
MGraph.addAttachmentNative = async function(messageId, attachment) {
  const options = {
    method: 'POST',
    url: `https://graph.microsoft.com/v1.0/me/messages/${messageId}/attachments`,
    headers: { 
      Authorization: `Bearer ${tokens.access_token}`,
      'Content-Type': 'application/json' 
    },
    body: JSON.stringify(attachment)
  }

  const responseString = await request.post(options)

  return JSON.parse(responseString)
}

MGraph.sendMessage = async function(messageId) {
  // setup your microsoft-graph-api client

  return await client.api(`/me/messages/${messageId}/send`).post({})
}


发件人

const sender = async function(email, attachments) {
  const createMessageResult = await MGraph.createMessage(email)

  for (const attachment of attachments) {
    await MGraph.addAttachmentNative(createMessageResult.id, attachment)
  }

  const updateMessageResult = await MGraph.updateMessage(createMessageResult.id, email.message)
  await MGraph.sendMessage(updateMessageResult.id)

  const conversationId = updateMessageResult.conversationId

  return conversationId
}


列出消息,通过 conversatinId 过滤并获取发送的消息

const generateGetByConversationIdQuery = function (conversationId) {
  const syncMessagesPprojection = [
    'id', 'conversationId',
    'internetMessageHeaders', 'internetMessageId',
    'createdDateTime', 'lastModifiedDateTime',
    'sender', 'from', 'toRecipients', 'ccRecipients', 'bccRecipients',
    'hasAttachments', 'subject', 'isDraft', 'isRead'
    // 'bodyPreview', 'uniqueBody', 'body'
  ]

  const projection = syncMessagesPprojection.join(',')

  const select = `&$select=${projection}`
  const expand = '&$expand=attachments($select=id,name,contentType,size,isInline)'
  const filter = `$filter=conversationId eq '${conversationId}'`
  const top    = '&top=100'
  const url    = `https://graph.microsoft.com/v1.0/me/messages?${filter}${select}${expand}${top}`

  return url
}

// Setup you email and attachments objects

const conversationId = sender(email, attachments)
const url    = generateGetByConversationIdQuery(conversationId)
const result = await MGraph.geMessagesByUrl(url)

// Here is your sent message
const sentMessage = result[result.length - 1]

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 发送电子邮件时从 Outlook REST API 获取电子邮件 ID(Getting the email id from the Outlook REST API when sending email)
    问题 我正在尝试使用 Microsoft Rest API 代表我们的用户发送电子邮件。 当我将消息创建为草稿时,我会得到一个 ID,我可以在以后的编辑、删除、查看完整对话(发送后)等请求中使用该 ID。 我不想把它保存为草稿,因为我没有理由,我只想直接发送。 发送后,我仍然想查看完整的对话。 但是,如果我只是发送电子邮件(使用 /sendmail 端点),我将无法获得该 ID。 有没有办法得到它? 这是我的要求: POST 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>
  • Microsoft Graph API 邮件办公室 365:是否有任何选项创建收件箱消息不是草稿?(Microsoft Graph API mail office 365: Is any option create inbox message NOT as Draft?)
    问题 我正在使用 Office 365 邮件 Microsoft Graph API ,尝试按照文档创建新消息: https://developer.microsoft.com/en-us/graph/docs/api-reference/beta/api/user_post_messages POST https://graph.microsoft.com/beta/me/messages Content-type: application/json { "subject":"Did you see last night's game?", "importance":"Low", "body":{ "contentType":"HTML", "content":"They were <b>awesome</b>!" }, "toRecipients":[ { "emailAddress":{ "address":"AdeleV@contoso.onmicrosoft.com" } } ] } { 输出: "@odata.context":"https://graph.microsoft.com/beta/$metadata#users('ad787b4f-1fda-4523-8e48-ffedb7f4635f')/messages/$entity", "@odata.etag"
  • 我们如何强制将邮箱项目持久化到 EWS?(How can we force a mailbox item to be persisted to EWS?)
    问题 注意:这个特殊问题对我们的客户有重大影响,这会转化为对收入产生直接影响的高业务影响。 TL;博士。 当用户在撰写电子邮件草稿时与我们的加载项交互时,我们的 Outlook Office 加载项如何最大限度地减少EWS GetItem API为我们从Office.context.mailbox.item.saveAsync()收到的itemId返回 OK 响应之前所需的时间Office.context.mailbox.item.saveAsync() ? 如果事实证明我们的加载项无法控制项目何时将持久保存到 EWS,那么最终用户可以做些什么来加快速度? 我们正在寻找 (a) 技术解决方案或 (b) 消息来指导我们的客户如何缓解/修复/解决此问题。 最终用户影响 我们的一些客户无法使用我们的 Outlook Office 加载项发送电子邮件,或者必须等待很长时间(> 2 分钟)才能发送电子邮件。 我们的目标 我们希望所有客户都能够使用我们的加载项发送电子邮件,而无需等待不合理的时间。 附加上下文 根据我们的日志和客户报告,此问题仅存在于Outlook 2016 for Windows桌面应用程序中。 我们没有证据表明该问题存在于任何其他版本的 Outlook 中,包括 Outlook 2013 或 Outlook for Mac,但该问题也可能存在于这些客户端中。 我们的插件概述
  • 调用 SaveAsync 方法向与会者发送电子邮件以进行现有约会?(Calling SaveAsync method sends email to attendees for existing appointment?)
    问题 我刚刚注意到以下与 Office js 相关的更改(在 Outlook 加载项的撰写模式下), Office.context.mailbox.item.saveAsync(function(result){..} 以前在 Outlook 加载项中调用 saveAsync 方法是发送新约会或草稿的邀请电子邮件,可能是由于最近的修复或更改,现在它不会向与会者发送新约会/草稿约会的邀请电子邮件。 但是此更改引入了新的 BUG,现在它会在之前运行良好的现有约会上发送电子邮件。 任何人都可以帮助我避免在 saveAsync 调用的情况下发送电子邮件,在更新约会的情况下,因为我的连接器执行发送邀请的工作吗? 回答1 Manoj,您描述的新日历项目的行为最近确实发生了变化。 但是,我们相当确定现有日历项目的行为没有变化 - 它曾经发送更新,现在仍然如此。 目前 OWA 日历中没有草稿的概念,因此用户无法更改项目并推迟发送更新。 因此,我们还没有一个好的故事,但我们正在寻找一种解决方案来缓解这种情况
  • 使用PowerShell创建Outlook电子邮件草稿(Create Outlook email draft using PowerShell)
    问题 我正在创建一个PowerShell脚本来自动化工作流程。 此过程需要填写电子邮件并发送给其他人。 电子邮件将始终大致遵循相同的模板,但是每次都可能不会相同,因此我想在Outlook中创建电子邮件草稿并打开电子邮件窗口,以便可以在发送之前填写其他详细信息。 我已经做了一些在线搜索,但是我所能找到的只是一些代码,可以静默发送电子邮件。 代码如下: $ol = New-Object -comObject Outlook.Application $mail = $ol.CreateItem(0) $Mail.Recipients.Add("XXX@YYY.ZZZ") $Mail.Subject = "PS1 Script TestMail" $Mail.Body = " Test Mail " $Mail.Send() 简而言之,是否有人知道如何创建和保存新的Outlook电子邮件草稿并立即打开该草稿进行编辑? 回答1 $olFolderDrafts = 16 $ol = New-Object -comObject Outlook.Application $ns = $ol.GetNameSpace("MAPI") # call the save method yo dave the email in the drafts folder $mail = $ol.CreateItem
  • 使用 vba 进行 Azure 分类(Azure classification using vba)
    问题 我有一个宏可以创建和保存多个 word 和 excel 文档。 最近,我的组织开始使用 Microsoft Azure 保护。 它总是要求用户在保存文档时选择分类标签。 有没有办法可以从 VBA 传递标签? (即通过代码控制分类) 我试图搜索现有的问题,但没有运气。 回答1 Azure 信息保护 (AIP) 答案目前不是。 请参阅下面的报价。 鉴于它是一项付费安全功能,我个人不会认为这很可能。 临时解决方案: 作为临时解决方案,根据您的需要,您是否考虑过让管理员设置默认分类? 除了手动选择标签外,还可以通过以下方式应用标签: 您的管理员配置了一个默认标签,您可以保留或更改该标签...... 确保范围政策包括您的帐户。 如果您有分类和保护,而不仅仅是保护,更多信息在这里。 微软的反馈表明这一点...... 可以通过支持标签程序化应用的新 SDK 来解决。 但是,此 SDK 尚未提供公共预览版。 如果您在 Yammer 站点上询问它,您也许可以尝试它的私人预览:https://www.yammer.com/AskIPTeam 那里... 是此 SDK 的用户语音条目,......[可能] 在它公开可用时更新......如果你投票支持它,你也会收到通知:https://msip.uservoice.com/forums/600097-天蓝色信息保护/建议/19602292
  • Outlook Ribbon Load Inspector.CurrentItem 为空(Outlook Ribbon Load Inspector.CurrentItem is null)
    问题 概述 我有一个使用 VSTO 创建的 Outlook 加载项。 该加载项有一个用于Mail.Compose功能区类型的功能区(可视化设计器)。 功能区选项卡ControlIdType设置为“自定义”。 加载项中除设计器代码之外的唯一代码是功能区的以下Load处理程序。 this.Context.CurrentItem意外返回 null。 代码 private void RibbonComposeMail_Load(object sender, RibbonUIEventArgs e) { try { var inspector = this.Context as Outlook.Inspector; if (inspector == null) { throw new ApplicationException("Fail - Step 1"); } var currentMailItem = inspector.CurrentItem as Outlook.MailItem; if (currentMailItem == null) { throw new ApplicationException("Fail - Step 2"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } 脚步 打开草稿电子邮件。
  • 无法在新的 Gmail 用户界面中打开通过 Gmail REST API 发送的电子邮件/草稿(Emails/drafts sent via Gmail REST API can't be opened in the new Gmail UI)
    问题 通过 Gmail REST API 发送草稿时,发件人无法在新的 Gmail 用户界面中打开“已发送邮件”文件夹中的邮件。 您收到错误消息"The conversation that you requested could not be loaded." . 但是,无论是否新 UI,都可以毫无问题地打开接收方的消息。 恢复到旧的/经典的 Gmail 用户界面允许发件人打开已发送的邮件。 重现步骤: 在 Gmail 中撰写草稿(新用户界面或旧用户界面无关紧要) 通过GET https://www.googleapis.com/gmail/v1/users/me/drafts查找草稿 ID 通过POST https://www.googleapis.com/gmail/v1/users/me/drafts/send发送草稿,正文为{"id": "<draftId>"} 返回 Gmail 并切换到新的 Gmail 用户界面,然后尝试在“已发送”文件夹中打开最近发送的草稿。 尝试打开邮件将失败。 恢复到旧的/经典的 Gmail 用户界面并在“已发送”文件夹中打开最近发送的草稿。 您将能够毫无问题地打开邮件。 收件人将能够使用新的或旧的 UI 毫无问题地打开邮件。 更新 当损坏的已发送电子邮件收到回复时,它似乎得到了“修复”,发件人现在可以从新的 Gmail
  • Office 365 使用 OutlookServicesClient 发送带附件的电子邮件(Office 365 send email with attachment using OutlookServicesClient)
    问题 我正在尝试代表我的 LOB 应用程序的用户发送一些电子邮件。 我正在使用 Office 365 连接服务 API,以便我可以使用 OAuth 进行身份验证。 我的代码将发送电子邮件,但没有显示附件。 这是我的代码的一个孤立示例: static async void SendUsingOutlookClient(CommunicationRow me, OutlookServicesClient outlook) { var m = new Message(); m.From = ToRecipient(me.From); m.Body = new ItemBody { Content = me.Body }; if (me.IsBodyHtml) m.Body.ContentType = BodyType.HTML; else m.Body.ContentType = BodyType.Text; m.Subject = me.Subject; m.CcRecipients.Add(me.Cc); m.BccRecipients.Add(me.Bcc); m.ToRecipients.Add(me.To); foreach (var attach in me.Attachments) { var file = attach.File; var fileversion =
  • 使用VBA发送草稿的Outlook 2013(Outlook 2013 using VBA to Send Drafts)
    问题 早上好, 使用Outlook 2010,我编译了代码以发送保存在给定帐户的草稿文件夹中的所有电子邮件。 现在我已升级到Office 2013,我遇到一个错误...它是.Send位,它掉落并显示错误消息: “此方法不能与嵌入式响应邮件一起使用。” 我敢肯定,有一种简单的发送草稿的方法,但是我已经在网上搜查了,目前还无法确定。 Public Sub SendDrafts() Dim lDraftItem As Long Dim myOutlook As Outlook.Application Dim myNameSpace As Outlook.NameSpace Dim myFolders As Outlook.Folders Dim myDraftsFolder As Outlook.MAPIFolder 'Send all items in the "Drafts" folder that have a "To" address filled 'Setup Outlook Set myOutlook = Outlook.Application Set myNameSpace = myOutlook.GetNamespace("MAPI") Set myFolders = myNameSpace.Folders 'Set Draft Folder. This will
  • Outlook VBA 用于在发送前将新邮件标记为任务(Outlook VBA for marking a new mail as a task before sending)
    问题 我试过这个: Sub SendAwaitingResponse() Dim mail As MailItem Set mail = Outlook.Application.ActiveInspector.CurrentItem mail.MarkAsTask (olMarkToday) mail.Categories = "Awaiting Response" mail.Send End Sub 出现以下错误: 草稿项目不能被标记。 MarkAsTask 仅对已发送或接收的项目有效。 可以在UI中点击“跟进”,邮件发送后会被标记为任务。 我认为没有办法以编程方式做到这一点。 回答1 您甚至需要在 Sent Items 文件夹中列出 Items.ItemAdd,并对传递给事件处理程序的消息调用 MarkAsTask。 回答2 创建与“发送等待响应”按钮关联的宏,以便使用自定义属性标记已发送的电子邮件: Sub SendAwaitingResponse() Dim Mail As MailItem Set Mail = Outlook.Application.ActiveInspector.CurrentItem Dim Property As UserProperty Set Property = Mail.UserProperties.Add(
  • Outlook将电子邮件标记为垃圾电子邮件(Outlook Marking Email as Junk Email)
    问题 我知道。 我听起来像垃圾邮件发送者,但对于在我们开发的此网站上注册了帐户的用户,这些电子邮件是完全合法的电子邮件确认。 这些电子邮件都可以通过各种邮件提供商(gmail,yahoo,aol,hotmail / live)到达,但是它们始终被定向到Outlook垃圾邮件文件夹中。 我已经尝试过使用Zend Framework邮件,PEAR邮件和phpMailer。 所有这些方法都会导致同一件事的发生。 微软在今年1月发布了对Outlook垃圾邮件筛选器的更新后,似乎开始发生这种情况。 以下是有问题的代码: include_once('Mail.php'); include_once('Mail/mime.php'); $hdrs = array( 'From' => "Membership <membership@example.com>", 'Subject' => 'Test Email', 'Reply-To'=> "membership@example.com", 'Message-ID'=> "<" . str_pad(rand(0,12345678),8,'0',STR_PAD_LEFT) . "@mail.example.com>", 'Date'=> date("D, j M Y H:i:s O",time()), 'To'=> 'test@example
  • Outlook VBA 中的 WithEvents 对象最终无法引发事件(WithEvents object in Outlook VBA eventually fails to raise event)
    问题 好的,之前好像有人遇到过这个问题,但是我没有看到任何进一步的评论或解决方案。 请参阅此问题的已接受答案中的编辑。 我的情况是这样的。 我正在使用 Exchange 电子邮件帐户在 Win10 x64 下运行 Outlook 2013。 我有时会一次运行 Outlook 几天到一周或更长时间而不关闭它。 我想在新项目添加到“已发送邮件”文件夹时引发事件。 这需要在Application ItemSend事件之后发生,因为假设我想在消息发送后删除它,而您不能在ItemSend事件处理程序中执行此操作。 所以我有以下代码: Public WithEvents goSent As Outlook.Items Private Sub Application_Startup() 'Establish the global object for the folder we want to monitor. Set goSent = Session.GetDefaultFolder(olFolderSentMail).Items End Sub Private Sub goSent_ItemAdd(ByVal Item As Object) 'Do stuff here. End Sub 一切正常运行一天或更长时间,但最终ItemAdd事件处理程序停止触发。 如果我进入 VBA
  • 如何以编程方式将事件添加到 Outlook 日历或 Google 日历?(How to add events to Outlook Calendar or Google Calendar programmatically?)
    问题 我有一个 Java Web 应用程序,用户可以从中添加带有日期、主题和描述(如任务)的事件。 我想以编程方式将这些事件发送到用户的 Outlook 日历。 谁能帮助我如何实现这一目标? PS:如果可以通过谷歌日历完成,请告诉我如何做到这一点,因为我没有坚持使用 Outlook :) 回答1 您现在可以使用 Outlook 日历 REST API 并从您的 Java 代码发送请求。 有关身份验证流程,请参阅此入门文档。 例如。 POST 到 https://outlook.office.com/api/v2.0/me/calendars/{calendar_id}/events 一个 JSON 内容,如: { "Subject": "Discuss the Calendar REST API", "Body": { "ContentType": "HTML", "Content": "I think it will meet our requirements!" }, "Start": { "DateTime": "2014-02-02T18:00:00", "TimeZone": "Pacific Standard Time" }, "End": { "DateTime": "2014-02-02T19:00:00", "TimeZone": "Pacific
  • OAuth 与 O365 的集成失败,错误为 AADSTS65005(OAuth integration with O365 fails with error AADSTS65005)
    问题 我们有一个网站(建立在 php 框架上),我们为教师/学生提供在线教育工具。 我们已经与 google.com 进行了 OAuth 集成,用户可以使用他们的 google 帐户(可以是个人 gmail 帐户或谷歌应用程序域的成员)“注册”和“登录”到我们的网站。 我们正在尝试与 O365 进行类似的集成,我们的网站可以向 O365 询问用户的电子邮件和名字/姓氏,以便我们可以在我们的网站上为他们创建一个帐户,并在创建帐户后登录他们。我们已经创建了Azure -> Active Directory 中的应用程序列表,并生成了客户端 ID 和密码,并将它们插入到 PHP 代码中。 此处描述的 OAuth 工作流程一直有效,直到我尝试使用对 https://login.windows.net/common/oauth2/token 的 POST 请求来请求访问令牌。 它重定向回我的redirect_uri但不是给我身份验证代码,而是在URL中给我这些参数: [error] => access_denied [error_description] => AADSTS65005: The client application has requested access to resource 'https://outlook.office365.com/'. This request
  • VSTO:在 Outlook 规则移动邮件之前使用 newmailex 处理邮件(VSTO: process mail using newmailex before outlook rules move mail)
    问题 我正在为 Outlook 2007 创建一个插件,它在收到邮件时读取邮件项目,然后将其重写。 该插件运行良好,并为没有将它们移动到另一个文件夹的 Outlook 规则的项目重写邮件。 如果有规则,大约 50% 的时间仍然可以。 另外 50% 的时间,规则在我的插件完成之前移动邮件项目。 我收到以下错误: “无法执行操作,因为对象已被删除。” 我正在使用 NewMailEx 事件来调用我的重写函数: private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.NewMailEx += new Outlook.ApplicationEvents_11_NewMailExEventHandler(olApp_NewMail); } 在 Outlook 2007 中,NewMailEx 为邮件提供了一个 entryID。 此 entryID 最初用于确定要使用的邮件对象: Outlook.NameSpace outlookNS = this.Application.GetNamespace("MAPI"); Outlook.MAPIFolder mFolder = this.Application.Session.GetDefaultFolder(Outlook
  • Outlook 加载项图像和文件(outlook add-in image & files)
    问题 我试图找到我的问题的解决方案,但没有找到任何地方,希望这里有人能救我。 我在 VS2015 上用 JavaScript 编写插件来加密和解密正文消息。 1. 第一个问题是接收者看不到的图像。 (谈谈通过“插入图片内联”按钮复制到正文中的图像) 在撰写模式下,我们对消息进行加密,然后当我们解密时,它的效果很好,因为撰写模式是客户端,他可以识别本地图像。 在阅读模式下,当用户想要解密消息并查看他看不到的图像时,因为加密会阻止 Outlook 将本地图像转换为服务器上的数据。 在我的代码中,我采用这样的正文消息(撰写模式) item.body.getAsync( item.body.getAsync( "html", { asyncContext: "This is passed to the callback" }, function callback(resultbody) { ......Here we send the body for ENCRYPT. })) 然后,用户通过单击“发送”常规发送加密消息。 在阅读模式下,我只是将它打印到我的 html 以检查解密是否良好: (JSON.parse(xhr.responseText).Data.Content)); 然后我得到图片图标,但没有成功显示真实图片。 图标的 src 将用于他无法访问的地方.. <img src=
  • 如何获取 Azure AD OAuth 登录的登录用户配置文件?(How do I get the logged in users profile for Azure AD OAuth logins?)
    问题 继用于 Azure AD v2 登录的 JavaScript OAuth2 流之后,没有提供 access_token,我试图找出要使用的最佳端点,以获取登录用户的详细信息(例如,显示名称、电子邮件等)。 但是,我注意到我可以使用 2 个潜在的端点 https://outlook.office.com/api/v2.0/me https://graph.microsoft.com/v1.0/me 1,用于 hapijs 的 bell,并记录在使用 Outlook REST API 中。 但是,在 bell 中,我似乎无法弄清楚使其scope于 OAuth 2.0 所需的scope 。 我尝试过openid 、 email 、 profile 、 Mail.Read (之所以尝试这样做是因为我在一些文档中看到过)和User.Read ,但前 3 个范围没有按照 JavaScript OAuth2 流程返回access_token Azure AD v2 登录不提供 access_token,最后 2 个( Mail.Read和User.Read )给我一个access_token ,但他们在调用 https://outlook.office.com/api/ 时给我身份验证问题v2.0/me with Authorization: 'Bearer [access_token]
  • 如何从JavaScript发送电子邮件(How to send an email from JavaScript)
    问题 我希望我的网站能够发送电子邮件而不刷新页面。 所以我想使用Javascript。 <form action="javascript:sendMail();" name="pmForm" id="pmForm" method="post"> Enter Friend's Email: <input name="pmSubject" id="pmSubject" type="text" maxlength="64" style="width:98%;" /> <input name="pmSubmit" type="submit" value="Invite" /> 这是我要调用的函数的方式,但是我不确定要在javascript函数中放入什么。 通过研究,我发现了一个使用mailto方法的示例,但我的理解是实际上并没有直接从站点发送邮件。 所以我的问题是,我在哪里可以找到要放在JavaScript函数中的内容,以便直接从网站发送电子邮件。 function sendMail() { /* ...code here... */ } 回答1 您不能直接使用javascript发送电子邮件。 但是,您可以打开用户的邮件客户端: window.open('mailto:test@example.com'); 还有一些参数可以预填充主题和身体: window.open('mailto
  • 是否可以使用Outlook / Office 365 REST API从电子邮件中检索RFC 2822(或任何其他)标头?(Is it possible to retrieve the RFC 2822 (or any) headers from an email with the Outlook/Office 365 REST API?)
    问题 我正在处理的应用程序需要访问电子邮件的标头,尤其是诸如return-path , in-reply-to和references类的标头。 理想情况下,我们希望能够访问电子邮件的所有RFC 2822标头。 Outlook / Office 365 REST API是否可以实现? 如果没有,是否可以使用任何API? 回答1 更新: InternetMessageHeaders属性已添加到Outlook API的beta终结点,因此您可以在不使用扩展属性的情况下获得此属性。 不过,您确实必须通过$select显式请求该属性。 就像是: GET https://outlook.office.com/api/beta/me/mailfolders/inbox/messages? $select=Subject,InternetMessageHeaders 对于Graph:该属性还存在于Graph的beta端点中的消息上,因此您可以执行以下操作: GET https://graph.microsoft.com/beta/me/mailfolders/inbox/messages? $select=subject,internetMessageHeaders 对于非Beta终结点:API不直接提供访问权限。 但是