使用C#提取Outlook传递失败电子邮件主题和收件人

时间:2019-02-25 13:10:35

标签: c# asp.net outlook window ms-office

我过去经常通过Outlook发送成千上万封邮件,而且由于许多收件人离开了组织,所以我收到了很多邮件,

为了更正我的列表,我想提取主题和收件人以过滤我的主列表。

问题是我的.net程序能够获取邮件主题,而无法获取收件人。由于收件人在“收件人/抄送/密件抄送”列表中不可用,但在邮件正文中不可用,因此我必须阅读邮件正文,随后将获取电子邮件ID。

使用下面的代码,但这不是从邮件正文中读取抄送列表。

    Microsoft.Office.Interop.Outlook.Application app = null;
    Microsoft.Office.Interop.Outlook._NameSpace ns = null;
    Microsoft.Office.Interop.Outlook.ReportItem item = null;
    Microsoft.Office.Interop.Outlook.MAPIFolder inboxFolder = null;
    Microsoft.Office.Interop.Outlook.MAPIFolder subFolder = null;


        try
        {
            app = new Microsoft.Office.Interop.Outlook.Application();
            ns = app.GetNamespace("IPM.Note");
            ns.Logon (null, null, false, false);
            inboxFolder = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
            subFolder = inboxFolder.Folders["TestMail"]; //folder.Folders[1]; also works
            //MessageBox.Show("Folder Name: " + subFolder.Name, subFolder.EntryID);
            //MessageBox.Show("Num Items:  " + subFolder.Items.Count.ToString());

            for(int i=1;i<=subFolder.Items.Count;i++)
              {                   
                item = (Microsoft.Office.Interop.Outlook.ReportItem)subFolder.Items[i];                

               //var item = subFolder.Items[i];
                Console.WriteLine("Item: {0}", i.ToString());
                Console.WriteLine("Subject: {0}", item.Subject);
                //Console.WriteLine("Receipient: {0}", item); 
                Console.WriteLine("Categories: {0}", item.Categories);
                Console.WriteLine("Body: {0}", item.Body);
                Console.WriteLine("Body: {0}", item.BillingInformation);
                listBox1.Items.Add(item.Subject);                       

              }
        }
        catch(System.Runtime.InteropServices.COMException ex) 
        {
            Console.WriteLine(ex.ToString());
        }

主题正在以乱码和不可读的格式出现。

该项目。收件人/ CC /密件抄送未公开。

任何帮助/建议...

2 个答案:

答案 0 :(得分:0)

在使用传递失败电子邮件的正文中提取电子邮件地址之前,我已经使用以下方法:

private IList<string> FindEmailAddresses(string body)
{
    IList<string> emailAddresses = new List<string>;
    string emailMatch = @"\b([A-Z0-9._%-]+)@([A-Z0-9.-]+\.[A-Z]{2,6})\b";

    Regex mailReg = new Regex(emailMatch,
        RegexOptions.IgnoreCase | RegexOptions.Multiline);
    MatchCollection matches = mailReg.Matches(body);

    for (int index = 0; index < matches.Count; index++)
    {
        emailAddresses.Add(matches[index].ToString());
    }

    return emailAddresses;
}

一些注意事项:

使用的正则表达式非常简单,可以捕获格式更简单的电子邮件,但会丢失格式更复杂的地址。

我通常处理传递失败电子邮件的MailItem对象。我没有使用ReportItem。

答案 1 :(得分:0)

我认为您可以将邮件服务器设置为向您发送失败的电子邮件地址列表