c#将多附件outlook电子邮件拆分/复制到单个电子邮件中,每个电子邮件带有一个附件

c#将多附件outlook电子邮件拆分/复制到单个电子邮件中,每个电子邮件带有一个附件,c#,.net,visual-studio,C#,.net,Visual Studio,我正在开发一个工作流,将每个PDF附件作为单独的订单处理。这是别人写的,我无法控制里面发生了什么。它只需要每个outlook电子邮件都必须有一个且只有一个PDF附件 由于我无法修改工作流程,我必须拆分/复制任何包含多个(2个或更多)附件的电子邮件,并将原始电子邮件的副本与每个附件一起保存 我尝试了以下方法,它创建了副本,但没有从副本中删除附加附件 foreach(ordersFolder.Items中的变量i) { 如果((i是MailItem)==false) { 继续; } MailIte

我正在开发一个工作流,将每个PDF附件作为单独的订单处理。这是别人写的,我无法控制里面发生了什么。它只需要每个outlook电子邮件都必须有一个且只有一个PDF附件

由于我无法修改工作流程,我必须拆分/复制任何包含多个(2个或更多)附件的电子邮件,并将原始电子邮件的副本与每个附件一起保存

我尝试了以下方法,它创建了副本,但没有从副本中删除附加附件

foreach(ordersFolder.Items中的变量i)
{
如果((i是MailItem)==false)
{ 
继续;
}
MailItem=(MailItem)i;
如果(item.Attachments.Count>1)
{
foreach(项目附件中的var附件)
MailItem newMail=(MailItem)item.Copy();//这很有效
var restAttachments=newMail.Attachments.Where(x=>x.FileName!=attachment.FileName).ToList();//这会给出所有不需要的文件的列表
foreach(restAttachments中的var restAttachmentItem)
{
var attachmentToRemove=newMail.Attachments.FirstOrDefault(x=>x.FileName==resattachmentItem.FileName);
var indexToRemove=attachmentToRemove.Index;//返回2
newMail.Attachments.Remove(indexToRemove);//这不起作用
}
}
}
//注意-我注意到基于零的索引和基于1的索引之间存在差异。所以,在复制了电子邮件后,我尝试了以下方法,但仍然没有成功
newMail.Attachments.Remove(1)//无效
newMail.Attachments.Remove(2)//无效
//如果您能提供帮助,请同时帮助删除原始多附件电子邮件(MailItem)

根据我的测试,您可以尝试以下代码删除指定的附件

 foreach (Outlook.MailItem item in testFolder.Items)
        {
            if(item.Attachments.Count>1)
            {
                foreach (Outlook.Attachment attachment in item.Attachments)
                {
                    if(!attachment.FileName.Contains(".png"))
                    {
                        Outlook.MailItem newMail = item.Copy();
                        var restAttachments = newMail.Attachments.Cast<Outlook.Attachment>().Where(x => x.FileName != attachment.FileName).ToList(); //this gives me list of all unwanted ones
                        foreach (var restAttachmentItem in restAttachments)
                        {
                            var attachmentToRemove = newMail.Attachments.Cast<Outlook.Attachment>().FirstOrDefault(x => x.FileName == restAttachmentItem.FileName);
                            var indexToRemove = attachmentToRemove.Index;
                            newMail.Attachments.Remove(indexToRemove);
                            newMail.Save();

                        }
                    }
                   
                }
            }
           
        }
foreach(testFolder.Items中的Outlook.MailItem项)
{
如果(item.Attachments.Count>1)
{
foreach(Outlook.Attachment在item.Attachments中的附件)
{
如果(!attachment.FileName.Contains(“.png”))
{
Outlook.MailItem newMail=item.Copy();
var restAttachments=newMail.Attachments.Cast().Where(x=>x.FileName!=attachment.FileName).ToList();//这将提供所有不需要的文件的列表
foreach(restAttachments中的var restAttachmentItem)
{
var attachmentToRemove=newMail.Attachments.Cast().FirstOrDefault(x=>x.FileName==restAttachmentItem.FileName);
var indexToRemove=附件ToRemove.Index;
newMail.Attachments.Remove(indexToRemove);
Save();
}
}
}
}
}
如果(!attachment.FileName.Contains(“.png”)用于过滤png文件,则代码


注意:请记住在删除附件后使用newMail.save方法保存您的电子邮件。

尝试使用newMail.Attachments.RemoveAt(indexToRemove)我尝试过,但附件没有包含RemoveAt的定义,intellisense要求我将其更改回Remove。不要认为RemoveAt是附件中的一个函数。感谢您的回复,虽然目前还没有解决方案,但我明白了为什么它不会从副本或原始电子邮件中删除附件,因为每个副本都是具有相同会话ID和会话索引的原始副本的精确克隆。所以,当您想要删除附件时,可能会有三封具有完全相同元数据的电子邮件。RemoveAt来自列表。附件是一个列表吗?如果列表中包含任何其他类型的IEnumerable,您可以尝试将其转换为列表。@Jesusantander谢谢您,您好,是的,这非常有效。您好,是的,这非常有效,因为在创建单独的电子邮件时,只有在有三个或更多附件的情况下,才会在结尾创建一封空白的新邮件。试图弄清楚,但到目前为止没有用。也许我可以把if子句放在if resattachment.count>0然后只做foreach(resattachments中的var resattachmentItem)……哦,不,我只是注意到它没有创建没有任何附件的空白电子邮件,它在电子邮件签名中创建了一个额外的徽标原因-认为image001.png是一个附件。我将尝试过滤掉它,但是如果你知道任何方法,请告诉我。@rinuk,我已经更新了过滤png文件的代码。你可以检查一下。当场完成。非常感谢你。问题解决了。