天道酬勤,学无止境

(Office.js) ItemSend Event not firing when doing a Mail Merge from Microsoft Word

I have configured an Outlook Add In using Office.js that hooks in to the ItemSend event in order to modify an email body prior to sending the email. The add in was configured (yesterday) using the office-generator

npm install -g yo generator-office
yo office 

I modified this slightly to add a function that handles the ItemSend event

<Hosts>
  <Host xsi:type="MailHost">
    <DesktopFormFactor>
      <FunctionFile resid="Commands.Url" />
      <ExtensionPoint xsi:type="Events">
        <Event Type="ItemSend" FunctionExecution="synchronous" FunctionName="validateBody" />
      </ExtensionPoint>
      ...

The add in is functioning as expected on the Outlook Web version and on Outlook Desktop, When I send an email from the outlook desktop app, I can see that my code is running as expected.

The issue i'm running into is that I need this code to run when a Mail Merge is performed from Microsoft word, however, when I do this, my code is not being executed. Is it possible to execute a custom javascript function to modify the email body, when mail is sent from a Mail Merge in Microsoft word?

Interestingly, Hubspot's add in apparently runs successfully when sending mail this way (Mail Merge from Microsoft Word), and they are able to modify the email body (re-write links and add tracking pixel) for each email that gets sent out. So it should be possible, but I'm not sure what integration point is needed, or how they are achieving it.

Any pointers in the right direction would be greatly appreciated.

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • WithEvents object in Outlook VBA eventually fails to raise event
    Okay, looks like someone has encountered this problem before, but I didn't see any further comments or solutions. See the Edit in the accepted answer to this question. My situation is like this. I am running Outlook 2013 under Win10 x64 with an Exchange email account. I sometimes run Outlook for several days to a week or more at a time without closing it. I want to raise an event when a new item is added to the Sent Mail folder. This needs to occur after the Application ItemSend event because, let's say, I want to delete the message after it is sent, which you cannot do from within the
  • 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
  • ItemSend event is not firing
    I have an Outlook 2007 Add-in (VSTO). Any mail sent with Outlook should be modified before that. I use the Application.ItemSend event and it works fine if I send an email directly from Outlook (Inspector) or through a custom C# application that uses the Send method of the MailItem. However, there is some external application that uses Outlook to send mails - which does not trigger the ItemSend event at all. The mail is moved directly to the Outbox (I can even catch the event of ItemAdd on that folder) and then sent. Another interesting issue is that if I define a deferred delivery rule it
  • 通过 Microsoft Graph 在 Outlook 插件中获取自定义属性集(Get custom property set in Outlook Add-In via Microsoft Graph)
    问题 假设我的 Outlook 加载项(使用 Office.js)中有以下代码在约会的撰写表单上运行: const item = Office.context.mailbox.item; item.loadCustomPropertiesAsync((result) => { const props = result.value; const testProp = props.get("my_prop"); console.log("CUSTOM_PROP", testProp); props.set("my_prop", "test_value"); props.saveAsync((saveResult) => console.log("SAVE_CUSTOM_PROP", saveResult)); }); 我明白了,它实际上是保存在事件中的。 现在有一堆关于这些自定义属性的问题: 但是那些与扩展属性有某种关系吗? 是否可以通过 Outlook REST API 或 Microsoft Graph 以某种方式访问​​这些属性? 我可以使用 Microsoft Graph 和基于这些属性的筛选器创建推送通知订阅吗? (我知道我可以基于扩展属性) 如果上述问题的答案是“否”,并且自定义属性只能通过创建它们的加载项访问,是否有办法从加载项创建事件的扩展属性,即使它没有保存
  • 从 Excel 发送邮件时运行 Outlook 宏(Run Outlook Macro when sending mail from Excel)
    问题 我在 Thisoutlooksession 中有一个 VBA 代码,它在发送新邮件时运行。 但是当我使用 Excel biltin 选项发送邮件以发送附加文件时,Outlook 中的代码不会运行。 将不胜感激您的帮助。 提前致谢。 回答1 这是一种未应用某些 Outlook 功能的情况。 “您使用来自另一个 Microsoft Office 应用程序(例如 Microsoft Word、Microsoft Excel 或 Microsoft PowerPoint)的发送为或其他发送命令。当您使用命令将当前文件作为附件发送时,通常会发生这种情况。” 在 Outlook 外部创建的邮件不包括默认的 Outlook 电子邮件签名 “如果您需要所有功能都可用,您要么需要从 Outlook 本身创建电子邮件,要么也需要从其他应用程序中以编程方式创建新电子邮件。” 从另一个应用程序发送电子邮件时 Outlook 用户窗体不起作用 “这是设计使然:由 Simple MAPI 或 mailto url 创建和发送的消息不会触发 OOM 事件。这是故意完成的 - 在这些场景中存在一些问题,因此事件被完全禁用。” ItemSend 事件未触发
  • Outlook:通过 VBA-Makro 打开表单并使用 ThisOutlookSession 的设置发送邮件(Outlook: Open Form via VBA-Makro and send Mail with settings of ThisOutlookSession)
    问题
  • 如何在使用宏在 Outlook 中发送邮件之前检查详细信息? [关闭](how to check details before sending mails in outlook using macros? [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 3年前关闭。 改进这个问题 我必须向许多不同的组发送邮件,有时我发送到错误的组。 我想创建 VBA 代码来检查主题标题的前两个字母以及邮件正文中是否存在相同的两个首字母,因为我发送邮件。 如果升级正确,则应发送邮件,否则代码应显示一些错误消息。 回答1 看起来您需要处理 Application 类的 ItemSend 事件,每当发送 Microsoft Outlook 项目时都会触发该事件,由用户通过检查器(在检查器关闭之前,但在用户单击“发送”按钮之后)或当Outlook 项目(例如 MailItem)的 Send 方法在程序中使用。 请注意,传递给事件处理程序的 Cancel 参数允许取消操作。 如果事件过程将此参数设置为 true,则发送操作未完成且检查器保持打开状态。 Public WithEvents myOlApp As Outlook.Application Public Sub Initialize_handler() Set myOlApp = Outlook.Application End Sub Private Sub myOlApp_ItemSend(ByVal Item As Object, Cancel As Boolean)
  • 成功发送电子邮件时的 C# Outlook 删除事件?(C# Outlook Remove event when email sent successfully?)
    问题 我有一个插件 Outlook,我在成功发送电子邮件时创建了一个事件,代码如下: private Outlook.Items _items; private void ThisAddIn_Startup(object sender, System.EventArgs e) { Outlook.Application application = this.Application; _items = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail).Items; _items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(Items_ItemAdd); } 然后,我有用户设置,如果用户没有选择,我想删除该事件 (Items_ItemAdd)。 那我应该做吗? 回答1 好吧,跟踪已Sent Items文件夹并不是一个好主意。 Outlook 允许通过跳过已Sent Items文件夹来删除已Sent Items 。 Outlook 项目的 DeleteAfterSubmit 属性是一个布尔值,如果邮件的副本在发送时没有保存,则为 True,如果副本保存在已发送邮件文件夹中,则为 False。 因此
  • 如何检索发件人电子邮件地址(How to retrieve the sender email address)
    问题 我在 Outlook 2013 中编写了一个宏,我需要在其中检索发件人电子邮件地址作为字符串 一个简单的版本是 Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim oMail As MailItem Set oMail = Item Dim sender as String sender = oMail.SenderEmailAddress End Sub 以上效果很好。 我现在已经向 Outlook 添加了一个新的电子邮件帐户,这就是问题所在。 如果我创建一个新电子邮件,它将使用我的 default@mail.com 电子邮件地址。 如果我然后更改从其发送电子邮件的帐户(到 myOtherAccount@mail.com),VBa 中的 SenderEmailAddress 不会反映此更改......它仍然显示(在监视窗口中)为 default.mail.com 我怎样才能让 Outlook 重新检查发件人(因为我认为它在某个地方缓存了它)? 回答1 所有与发件人相关的属性都在ItemSend事件触发后设置。 您最早可以看到发件人属性是在“已发送邮件”文件夹上触发Items.ItemAdd事件时。 回答2 只需在 application:startup 中定义您的文件夹
  • VSTO Outlook ItemSend with C#
    I'm trying to add a string in the end of an Outlook email's body with VSTO private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); } void Application_ItemSend(object Item, ref bool Cancel) { if (Item is Outlook.MailItem) { Outlook.MailItem mail = (Outlook.MailItem)Item; mail.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatHTML; mail.Body += "My Sample Text"; mail.Save(); } } When i run with F5 my code from VStudio, the app isn't
  • '项目被移动或删除' Outlook.mailItem('The item is moved or Deleted' Outlook.mailItem)
    问题 我创建了一个这样的 Outlook 邮件: Outlook.Application outlookApp = new Outlook.Application(); Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem); mailItem.Subject = mailSubject; mailItem.To = ""; mailItem.Attachments.Add(totalPath); mailItem.Body = mailBody; mailItem.Importance = Outlook.OlImportance.olImportanceNormal; mailItem.Display(true); //Mail is send succesfully? 是否可以检查邮件是发送成功还是取消? 编辑:当我执行以下代码时,出现错误“项目已移动或删除” Outlook.Application outlookApp = new Outlook.Application(); Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook
  • 在特定文件夹中保存已发送项目的副本(Save Copy of Sent Item in a specific folder)
    问题 我想在特定文件夹中保存已发送邮件项目的副本。 点击“发送”时会触发以下代码。 该项目作为未发送的电子邮件项目保存在文件夹中(Outlook 显示消息:“此消息尚未发送”)。 我希望它保存为已发送的项目(就像文件夹“已​​发送的项目”)。 Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) On Error GoTo ErrorHandler Dim moveToFolder As Outlook.MAPIFolder Dim myCopiedItem As Outlook.MailItem Set ns = Application.GetNamespace("MAPI") Set moveToFolder = ns.Folders("Mailbox - My Mailbox").Folders(".Waiting_for") With Item If InStr(Item.Body, "/wf") > 0 Then Set myCopiedItem = Item.copy myCopiedItem.Move moveToFolder Else End If End With Exit Sub ErrorHandler: MsgBox "Error!" End Sub 回答1 当
  • 如何在单击发送按钮时调用宏?(How to call a macro on send button click?)
    问题 我有一个宏,它接受我选择的电子邮件的描述,并填充从模板创建的表单的“消息”字段: sText = olItem.Body Set msg = Application.CreateItemFromTemplate("C:\template.oft") With msg .Subject = "Test" .To = "user@user.com" 'Set body format to HTML .BodyFormat = Outlook.OlBodyFormat.olFormatHTML .HTMLBody = "<HTML><BODY>EmailDesc: " + sText + "</BODY></HTML>" .Display End With 在这个模板中,我有更多的字段需要填写,比如组合框......例如。 我想知道,当我点击发送按钮时,我如何获得这个组合的价值,并在发送前将其连接到电子邮件的内容? 生成这样的东西: EmailDesc: TEST SEND EMAIL BLA BLA BLA.. ComboboxValue: Item1 谢谢 回答1 您需要使用按下发送按钮时触发的Application_ItemSend event 。 您在ThisOutlookSession module创建此事件。 您的事件子可能如下所示: Private Sub
  • 在 VBScript 中处理 COM 事件取消(Handling COM event cancelation in VBScript)
    问题 我想编写一个脚本,使用 CDO 通过我们公司的 SMTP 服务器发送电子邮件。 首先,我试图为此目的编写一个 HTA 应用程序,但是让它足够舒适以便其他人可以很好地处理它变得相当繁琐(因为正确的收件人解析)。 所以现在我尝试使用常规的 Outlook-Mail 掩码首先准备邮件,然后通过 VBScript 捕获发送项目事件,将其内容提供给我的 CDO 脚本。 现在,我的代码如下所示: Dim OutlookApplication Dim MailItem Const olDiscard = 1 Const olMailItem = 0 Set OutlookApplication = WScript.CreateObject("Outlook.Application", "Outlook_") Set MailItem = OutlookApplication.CreateItem(olMailItem) MailItem.Display '(...) some code to add recipients, subject, text, etc... depending on the given WScript.Arguments While Not MailItem Is Nothing 'keep the script alive WScript.Sleep 1
  • VBA 宏 - 自定义回复按钮(VBA Macro - customize Reply Button)
    问题 我写了一个宏来在回复窗口添加密件抄送地址。 但我想在点击“回复”按钮时做同样的事情。 我无法向此按钮添加宏,因为它不是自定义按钮。 我该怎么做? 回答1 您可以重新利用内置控件。 但在这种情况下,您需要开发一个加载项,而不是 VBA 宏。 有关详细信息,请参阅 Office Fluent Ribbon 上的临时重新调整命令用途。 此外,您还可以尝试处理 Application 类的 ItemSend 事件,该事件在 Microsoft Outlook 项目发送时触发,由用户通过检查器(在检查器关闭之前,但在用户单击“发送”按钮之后)或当在程序中使用 Outlook 项目(例如 MailItem)的 Send 方法。 在事件处理程序中,您可以尝试向 Recipients 集合中添加一个新条目(请参阅相应的属性),并将“Type”属性设置为 olBcc。 回答2 这是来自超级用户。 https://superuser.com/questions/327614/outlook-macro-to-interrupt-a-reply-all “您可以通过 VBA 添加一个事件处理程序来接收 ReplyAll 事件。类似于以下内容:” Dim WithEvents insp As Outlook.Inspectors Dim WithEvents mailItem As Outlook
  • Application_Startup() 未触发(Application_Startup() not firing)
    问题
  • Outlook 2010 AddIn behaves weirdly when mail invoked from other office client
    I really need help with this one. I have written an adding that adds a some text to the subject line of an email on send it also sets the same value in a property on the email through the PropertyAccessor. This works beautifully when the email is created through the Outlook interface. The problem I have encountered is when a user is working with excel and decides to send the spreadsheet as an attachment from the Excel 2010 -> File -> Save & Send -> Send as Attachment Menu Item. This will open the outlook 2010 mail editor as you would expect, the user can address the email and press send as
  • 接受会议时获取会议时间(Get meeting time when accepting meeting)
    问题 我需要检测一个会议项目,作为 Outlook 中加载项的一部分。 它使用户可以选择根据自己的工作量(即项目、类型等)对会议进行分类,绝非易事。 我正在查看 ItemSend 事件,使用此代码 Application.ItemSend+=Application_ItemSend; Outlook.MeetingItem m = (Outlook.MeetingItem)Item; string s = m.Body; 每次发送邮件时,转换都会有错误捕获,以免打扰用户等。我尝试了一些组合来获取正确的对象,我可以从中获取 .StartTime .EndTime 例如。 但是,s 为空,我需要获取会议时间和会议正文,以缩短为短名称。 回答1 您可以使用MeeetingItem.PropertyAccessor.GetProperty访问 MAPI 属性。 对于 start 属性,DASL 属性名称为http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/820D0040 。 对于结束时间, http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/820E0040 。 请记住,属性在 UTC
  • Outlook 2010-VBA-在ItemSend中设置密件抄送(Outlook 2010 - VBA - Set bcc in ItemSend)
    问题 计划: Outlook 2010 操作系统: Win8 VBA技能:新手 笔记: 如果我删除以下选项,这将完美工作 Private Sub Application Item_Send '[3] If Item.SendUsingAccount = "Account Name here" Then 如果我不删除它(保留我的密件抄送例外),则启动Private Sub Application _Startup上的电子邮件Private Sub Application _Startup运行,但是它仅对项目[3] =“ special@domain.com”中列出的电子邮件进行密件抄送。 删除部分[3] ,两者均按编码运行。 1)启动时发送1封电子邮件,对所有列出的帐户进行密送以检查宏, 2)在当天,所有发送的电子邮件均附有正确的密件抄送,所有例外均按编码方式工作。 似乎有些东西我错过了,它阻止了每个邮件代码运行到启动邮件代码中。 我尝试了许多更改,包括添加了IF和else函数。 两者都在我的Outlook会话中运行 代码: Private Sub Application_Startup() 'Creates a new e-mail item and modifies its properties on startup 'Testing email settings
  • Crm 2011 Outlook 客户端 - 关于强制设置(Crm 2011 outlook client - Set regarding mandatory)
    问题 我们的客户正在使用 Microsoft CRM 2011 Outlook 客户端,他们有独特的业务需求。 他们希望对所有使用 Outlook 发送电子邮件的员工强制执行“设置相关”(很奇怪吧?)。 如果用户在发送电子邮件时忘记设置,outlook 应该显示一条通知消息并且不应该让用户发送电子邮件。 我找不到任何开箱即用的功能,所以我决定编写一个 Outlook 插件。 有没有办法在 Outlook 插件 ItemSend 事件中知道邮件项目具有为相关字段设置的值? 我可以获得包括 CRM:xxxxx 在内的电子邮件主题,但由于电子邮件尚未在 CRM 中创建,我不知道如何提取相关数据。 回答1 有关跟踪的信息存储在邮件的 MAPI 属性中。 请参阅随附的屏幕截图。 它们应该可以在 ItemSend 事件中访问。 您可以像这样获得此信息(来自@Ahmeds 评论) dynamic regardingId = mailItem.PropertyAccessor.GetProperty("schemas.microsoft.com/mapi/string/‌​;{00020329-0000-0000-C000-000000000046}/crmRegardingId/0x0000001F"); 回答2 我在 VS2012 和 Outlook 2010 中使用了以下代码来获取相关的