Как избежать встроенных (встроенных) изображений при сохранении вложений электронной почты Outlook

Я написал метод сохранения вложений электронной почты Outlook на жесткий диск и преобразования файла в Base64String. Когда я сохранял вложения, встроенные (встроенные) изображения также сохранялись, даже если они не были НАСТОЯЩИМИ вложениями. Я хотел сохранить только настоящие вложения. Затем я изменил метод следующим образом. Но теперь я получаю ошибку из строки .OfType ().

Вот мой код:

private string GetBase64StringForAttachments(Outlook.MailItem mailItem)
        {
            StringBuilder builder = new StringBuilder();
            Outlook.Attachments mailAttachments = mailItem.Attachments;
            
            try
            {                
                if (mailAttachments != null)
                {                    
                    Regex reg = new Regex(@"<img .+?>", RegexOptions.Singleline | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
                    MatchCollection matches = reg.Matches(mailItem.HTMLBody);

                    for (int i = 1; i <= mailAttachments.Count; i++)
                    {
                        Outlook.Attachment currentAttachment = mailAttachments[i];

                        bool isMatch = matches
                          .OfType<Match>()
                          .Select(m => m.Value)
                          .Where(s => s.IndexOf("cid:" + currentAttachment.FileName, StringComparison.InvariantCultureIgnoreCase) >= 0)
                          .Any();

                        MessageBox.Show(currentAttachment.FileName + ": " + (isMatch ? "Inline Image" : "Attached Image"));

                        if (currentAttachment != null)
                        {
                            
                            string date = DateTime.Now.ToString("yyyymmddhhmmss");
                            string path = "C:\\test\\" + date + currentAttachment.FileName; //ToDo: Create Folder
                            currentAttachment.SaveAsFile(path);

                            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                            byte[] filebytes = new byte[fs.Length];
                            fs.Read(filebytes, 0, Convert.ToInt32(fs.Length));
                            string encodedData = Convert.ToBase64String(filebytes, Base64FormattingOptions.InsertLineBreaks);
                            builder.Append(encodedData).Append(",");

                            Marshal.ReleaseComObject(currentAttachment);
                        }
                    }

                    if (builder.Length > 0)
                    {                        
                        string encodedAttachments = builder.ToString().Remove(builder.ToString().Length-1);
                        return builder.ToString();
                    }
                    else
                        return "";

                }
                else return "";
            }
            catch (Exception ex)
            {
                Debug.DebugMessage(2, "Error in GetBase64StringForAttachments : in AddinModule " + ex.Message);
                return "";
            }
            finally
            {
                Marshal.ReleaseComObject(mailAttachments);                
            }
        }

Это сообщение об ошибке:

'System.Text.RegularExpressions.MatchCollection' не содержит определения для 'OfType' и не может быть найден метод расширения 'OfType', принимающий первый аргумент типа 'System.Text.RegularExpressions.MatchCollection' (отсутствует ли директива using или ссылка на сборку?)

Что мне нужно:

  1. Я не большой поклонник LINQ. Итак, не могли бы вы посоветовать мне это?

  2. Есть ли лучший способ сделать это?

    Я уже пробовал следовать предложенным ответам на эти вопросы, и они не помогли мне

Сохранение только РЕАЛЬНЫХ вложений элемента Outlook MailItem

Не сохраняйте встраиваемые изображения в вложения (например, изображение подписи)

  1. Есть ли способ использовать Redemption для распознавания настоящих вложений?

person Kushan Randima    schedule 20.07.2015    source источник


Ответы (1)


Да, Redemption предоставляет RDOAttachment .Hidden свойство - оно проверяет HTMLBody, чтобы убедиться, что вложение не используется в качестве встроенного изображения.

Также обратите внимание, что вы можете получить доступ к данным вложения с помощью RDOAttachment .AsArray без сохранения вложения как файл в первую очередь.

Redemption.RDOSession rSession = new Redemption.RDOSession();
rSession.MAPIOBJECT = mailItem.Application.Session.MAPIOBJECT;
Redemption.RDOMail rMail= rSession.GetRDOFolderFromOutlookObject(mailItem)
foreach (Redemption.RDOAttachment attach in rMail.Attachments)
{
  if ((attach.Type == Redemption.rdoAttachmentType.olByValue) && (!attach.Hidden))
  {
     attach.SaveAsFile(path);
  }
}
next
person Dmitry Streblechenko    schedule 20.07.2015