【问题标题】:Editing text in body of email via Outlook add-in通过 Outlook 插件编辑电子邮件正文中的文本
【发布时间】: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 中使用规则来做到这一点..但你需要去尝试一下

标签: c# visual-studio outlook-addin


【解决方案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();
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2017-09-17
    • 2015-12-05
    • 2017-07-28
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多