【问题标题】:How to add ItemAddEventHandler for multiple folders in outlook using C#?如何使用 C# 为 Outlook 中的多个文件夹添加 ItemAddEventHandler?
【发布时间】:2021-09-24 21:10:36
【问题描述】:

我们在 Outlook 中添加了一些规则,可以根据某些条件将项目移动到某个文件夹。

示例:如果电子邮件发件人是 xyz@gmail.com 并且主题包含特定关键字,可以说“新闻”,然后将该电子邮件移至文件夹“NewsFolder”,如果电子邮件发件人是 prq@gmail.com,则将该电子邮件移至“InterestFolder” “ 文件夹。等等

我想在将项目添加到特定文件夹时执行一些操作,我在 app.config 中添加了用于检查文件夹名称的配置。我尝试使用 itemAdd 事件处理程序,但失败了。

下面是我的代码。

Outlook.NameSpace outlookNameSpace;
Outlook.MAPIFolder inbox;
Outlook.Items items;

Private void ThisAddIn_Startup(object sender, system.EventArgs e)
{
           //configuration will come from app.config file
        
            string configuration="news,NewsFolder|interest,InterestFolder"; //comma separated by keyword, folder name
            string[] conf = configuration.split('|');
            foreach(string singleConfiguartion in conf)
           {
                  string[] config = singleConfiguraiton.Split(','); 
                  string configFolderName= config[1].ToString(); //get folder name from configuration
                  Application.ActiveExplorer().CurrentFolder = inbox.Folders[configFolderName];
                  Outlook.MAPIFolder currentFolder = inbox.Folders[configFolderName];
                  items= currentFolder.Items;
                  items.ItemAdd+= new Outlook.ItemEvents_ItemAddEventHandler(ItemAddedEventHandler);
           }
    
}    

void ItemAddedEventHandler(Object item)
{

}

如果我只想为“收件箱”文件夹添加事件处理程序,这种方式是可行的。但我想为“NewsFolder”和“InterestFolder”添加事件处理程序。

【问题讨论】:

    标签: c# outlook vsto outlook-addin


    【解决方案1】:

    创建一个包含 Items 集合并实现 ItemAdd 事件处理程序的包装类。然后,您可以将这些包装器保存在列表中。在我脑海中浮现:

    private List<FolderWrapper> _folders = new List<FolderWrapper>();
    ...
    foreach(string singleConfiguartion in conf)
    {
        ...
        _folders.Add(new FolderWrapper(currentFolder));
    }
    
    public class FolderWrapper
    {
        private MAPIFolder _folder;
        private Items _items;
        public FolderWrapper(MAPIFolder folder)
        {
            _folder = folder;
            _items = _folder.Items;
            _items.ItemAdd += ItemAddedEventHandler;
        }
        private ItemAddedEventHandler(object Item)
        {
            MessageBox.Show($"new item is created in {folder.Name}");
        } 
    }
    

    【讨论】:

    • 当我打开 Outlook 时,它会将配置中的最后一个文件夹设置为默认文件夹。如何解决这个问题?
    • 我不确定您所说的“它正在将配置中的最后一个文件夹设置为默认文件夹”。你真的需要展示你的代码。
    • 例如 string configuration="news,NewsFolder|interest,InterestFolder ,在此配置中,最后读取的文件夹是 "interestFolder" ,当我打开 Outlook 时,它会将其设为默认文件夹。
    • 我仍然不明白您所说的“它使这个文件夹成为默认文件夹”是什么意思。你的意思是它成为默认的收件箱文件夹?或者它在 Outlook 中被选中?或者您只收到来自该文件夹的通知?
    • 当我打开 Outlook 时,它会默认打开该文件夹。我找到了它...这是因为我将当前文件夹设置为 Outlook.MAPIFolder currentFolder = inbox.Folders[configFolderName];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2019-07-04
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    相关资源
    最近更新 更多