Вложение MailItem неизвестно

У меня есть письмо, содержащее только подпись в виде изображения и вложение, как на скриншоте ниже.

Вложение MailItem неизвестно

Я сохраняю это письмо как C:\mail.msg, а затем пытаюсь прочитать его по приведенному ниже коду:

var oApp = new Microsoft.Office.Interop.Outlook.Application();
MailItem outlookMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItemFromTemplate(@"C:\mail.msg");

//there are 2 attachments inside
foreach(var att in outlookMsg.Attachments) 
{
    att.SaveAsFile($@"C:\{att.FileName}");
}

Проблема

Внутри MailItem есть вложения 2 с именами:

-empty.xlsx

-lot4.xlsx

Если я изменю расширение lot4.xlsx на lot4.png, его можно будет открыть как изображение в подписи.

Кто-то видел эту странную ситуацию, когда вложение добавляется с неверным именем?

Как конкретно вы запрашиваете имя / расширение файла? Можете ли вы показать нам код и свойство, которое вы используете для чтения / проверки имени? Это либо очень странная ошибка в API взаимодействия Outlook, с которой вы столкнулись, либо проблема в другом месте вашего собственного кода.

user10058046 17.12.2018 11:37

@ JᴀʏMᴇᴇ, когда я сохраняю файлы, я могу проверить имя

Antoine V 17.12.2018 15:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
217
2

Ответы 2

Вы можете скачать вложения, используя приведенный ниже код:

private void ThisApplication_NewMail()
{
    Outlook.MAPIFolder inBox = this.Application.ActiveExplorer()
        .Session.GetDefaultFolder(Outlook
        .OlDefaultFolders.olFolderInbox);
    Outlook.Items inBoxItems = inBox.Items;
    Outlook.MailItem newEmail = null;
    inBoxItems = inBoxItems.Restrict("[Unread] = true");
    try
    {
        foreach (object collectionItem in inBoxItems)
        {
            newEmail = collectionItem as Outlook.MailItem;
            if (newEmail != null)
            {
                if (newEmail.Attachments.Count > 0)
                {
                    for (int i = 1; i <= newEmail
                       .Attachments.Count; i++)
                    {
                        newEmail.Attachments[i].SaveAsFile
                            (@"C:\TestFileSave\" +
                            newEmail.Attachments[i].FileName);
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        string errorInfo = (string)ex.Message
            .Substring(0, 11);
        if (errorInfo == "Cannot save")
        {
            MessageBox.Show(@"Create Folder C:\TestFileSave");
        }
    }
}

Для получения дополнительной информации перейдите по этой ссылке:

Как: программно сохранять вложения из элементов электронной почты Outlook

С Microsoft EWS это очень просто сделать:

ссылка: http://johnlabtest.blogspot.com/2014/01/save-attachments-from-exchange-mail-box.html

static void Main(string[] args)
{
      ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
      service.Credentials = new WebCredentials("[email protected]", "password");
      service.TraceEnabled = true;
      service.TraceFlags = TraceFlags.All;
      service.AutodiscoverUrl("[email protected]", RedirectionUrlValidationCallback);

      var messages = new List<EmailMessage>();

      // only get unread emails
      SearchFilter folderSearchFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false);
     // we just need the id in our results
     var itemView = new ItemView(10) {PropertySet = new PropertySet(BasePropertySet.IdOnly)};

     FindItemsResults<Item> findResults = service.FindItems(folder.Id, folderSearchFilter, itemView);

     foreach (Item item in findResults.Items.Where(i => i is EmailMessage))
     {
        EmailMessage message = EmailMessage.Bind(service, item.Id, new PropertySet(BasePropertySet.IdOnly, ItemSchema.Attachments, ItemSchema.HasAttachments));
        messages.Add(message);
     }

  // loop through messages and call processemail here.
}

public static void ProcessEmail(EmailMessage message)
{
     string saveDir = ConfigurationManager.AppSettings["AttachmentSaveDirectory"];
     if (message.HasAttachments)
     {
        foreach (Attachment attachment in message.Attachments.Where(a=> a is FileAttachment))
        {
            FileAttachment fileAttachment = attachment as FileAttachment;
            fileAttachment.Load(); // populate the content property of the attachment

            using (FileStream fs = new FileStream(saveDir + attachment.Name, FileMode.Create))
            {
               using (BinaryWriter w = new BinaryWriter(fs))
               {
                  w.Write(fileAttachment.Content);
               }
            }
        }
    }
message.IsRead = true;
message.Update(ConflictResolutionMode.AutoResolve); // push changes back to server
}

private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
     // The default for the validation callback is to reject the URL.
     bool result = false;
     Uri redirectionUri = new Uri(redirectionUrl);
     // Validate the contents of the redirection URL. In this simple validation
     // callback, the redirection URL is considered valid if it is using HTTPS
    // to encrypt the authentication credentials. 
    if (redirectionUri.Scheme == "https")
    {
       result = true;
    }
       return result;
}

Другие вопросы по теме