通过 Outlook 插件编辑电子邮件正文中的文本

Posted

技术标签:

【中文标题】通过 Outlook 插件编辑电子邮件正文中的文本【英文标题】:Editing text in body of email via Outlook add-in 【发布时间】:2018-08-16 13:56:32 【问题描述】:

以下是 MS Outlook 的加载项。可以扫描电子邮件的正文,如果存在某个(特定的词或模式)词,则会出现一个 MessageBox。但是,我想知道是否可以在没有任何 MessageBox 的情况下更改单词的显示方式或编辑电子邮件正文中的文本。例如,一个词(如公司名称)可以转换为超链接(即 Google 到 www.google.com 或 Microsoft 到 www.microsoft.com),并且在 Outlook 上阅读电子邮件的用户总是看到超链接而不是单词本身。

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
using System.Drawing;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Text.RegularExpressions;


namespace FirstOutlookAddIn

    public partial class ThisAddIn
    
        public static string[] data = new string[10];
        public static Stopwatch timer = new Stopwatch();
        Outlook.NameSpace outlookNameSpace;
        Outlook.MAPIFolder inbox;
        Outlook.Items items;

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        

            timer = Stopwatch.StartNew(); ReadMail();
            outlookNameSpace = this.Application.GetNamespace("MAPI");
            inbox = outlookNameSpace.GetDefaultFolder(
                    Microsoft.Office.Interop.Outlook.
                    OlDefaultFolders.olFolderInbox);
            items = inbox.Items;

            items.ItemAdd += new Outlook.ItemsEvents_ItemAddEventHandler(ReadSingleMail); // Modified method to run for single email

        

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        
            // Hinweis: Outlook löst dieses Ereignis nicht mehr aus. Wenn Code vorhanden ist, der 
            // ausgeführt werden muss, wenn Outlook geschlossen wird, informieren Sie sich unter http://go.microsoft.com/fwlink/?LinkId=506785
        

        static void ReadSingleMail(dynamic item)
        
            string bodyText; // Email body
            string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); //Path to My Documents

            if (item != null)
            
                bodyText = item.Body;
            
            else
            
                return; // If no e-mail body, exit function.
            
        

        static void ReadMail()
        
            //Set up OCR
            string bodyText;
            string mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            //Get unread emails from Inbox
            Microsoft.Office.Interop.Outlook.Application app = null;
            Microsoft.Office.Interop.Outlook._NameSpace ns = null;
            Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
            app = new Microsoft.Office.Interop.Outlook.Application();
            ns = app.GetNamespace("MAPI");
            inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            Outlook.Items unreadItems = inboxFolder.Items.Restrict("[Unread]=true");
            int max_runs;
            //Go through each Unread email
            if (unreadItems.Count > 10)  max_runs = 10; 
            else max_runs = unreadItems.Count;

            for (int counter = 1; counter <= max_runs; counter++)
            
                //Reinitialize Data array
                for (int index = 0; index <= 8; index++)
                
                    data[index] = "";
                
                dynamic item = unreadItems[counter];
                bodyText = item.Body;
                Match match = Regex.Match(bodyText, "Insert searched pattern here");

                if (match.Success)
                
                    MessageBox.Show(match.Value);
                    match = match.NextMatch();
                

                        
        

        #region Von VSTO generierter Code

        /// <summary>
        /// Erforderliche Methode für die Designerunterstützung.
        /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
        /// </summary>
        private void InternalStartup()
        
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        

        #endregion
    

【问题讨论】:

出现什么消息框? @BugFinder,出现的消息框通过我的示例代码中的正则表达式打印搜索到的单词/模式的值。似乎是因为我只是为了举例而以这种方式对其进行了编程。我希望我很清楚并且能够回答您的问题。如果没有,请告诉我。 所以如果你不想要消息框,不要编码一个 @BugFinder,是的。但我的问题是是否可以编辑传入电子邮件的电子邮件正文中的文本。 MessageBox 只是用于演示目的的示例。我想展示我到目前为止所做的尝试。 嗯.. 可以而且应该是不同的东西,但当然你可以收到一封电子邮件,让它自动更改邮件中的内容并保存它.. 你可以在 Outlook 中使用规则来做到这一点..但你需要去尝试一下 【参考方案1】:

如下创建函数 ReadMail() 替换文本,正如我想要的那样。

static void ReadMail()
    Microsoft.Office.Interop.Outlook.Application app = null;
    Microsoft.Office.Interop.Outlook._NameSpace ns = null;
    Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
    app = new Microsoft.Office.Interop.Outlook.Application();
    ns = app.GetNamespace("MAPI");
    inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
    Outlook.Items Items = inboxFolder.Items.Restrict("[LastModificationTime] > '01/1/2003'");

    foreach (var item in Items)
        var mail = (Outlook.MailItem)item;
        mail.Body = mail.Body.Replace("Text to be replaced", "Replacing text");
        mail.Save();
    


【讨论】:

以上是关于通过 Outlook 插件编辑电子邮件正文中的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何插入到Outlook电子邮件正文中的HTML文件

通过outlook发送R Markdown输出作为正文电子邮件(RDCOMclient)

Outlook VSTO附件在邮件主题中选择了文本和上下文菜单

邮件模板——科普篇

从任何外部应用程序启动编辑器窗口时,Outlook插件不会显示

使用C#回复/回复所有特定的Outlook邮件