2017-01-09 8 views
1

Я хочу сохранить вложение от конкретного отправителя, у которого есть определенное расширение файла в приложении. У меня проблемы с частью if. Я получаю ошибку времени выполнения 438: объект не поддерживает это свойство или метод.Почему я получаю объект не поддерживает свойство mailitem SenderEmailAddress?

Sub GetAttachments() 

    Dim ns As NameSpace 
    Dim folder As Outlook.MAPIFolder 
    Dim Item As Object 
    Dim Atmt As Attachment 
    Dim FileName As String 
    Dim i As Integer 
    Set ns = GetNamespace("MAPI") 
    Set Inbox = ns.GetDefaultFolder(olFolderInbox) 
    i = 0 

    If Inbox.Items.Count = 0 Then 
     MsgBox "There are no messages in the Inbox.", vbInformation, _ 
       "Nothing Found" 
     Exit Sub 
    End If 

    For Each Item In Inbox.Items 

     If Item.SenderEmailAddress = "[email protected]" Then 
      For Each Atmt In Item.Attachments 
       ' This path must exist! Change folder name as necessary. 
       If Right(Atmt.FileName, 3) = ".py" Then 
        FileName = "C:\Users\bill\Desktop\TEST\" & Atmt.FileName 
        Atmt.SaveAsFile FileName 
        i = i + 1 
       End If 
      Next Atmt 
     End If 
    Next Item 

    If i > 0 Then 
     MsgBox "I found " & i & " attached files." _ 
     & vbCrLf & "I have saved them into the C:\Users\bill\Desktop\TEST folder." _ 
     & vbCrLf & vbCrLf & "Have a nice day.", vbInformation, "Finished!" 
    Else 
     MsgBox "I didn't find any attached files in your mail." , vbInformation, "Finished!" 
    End If 

GetAttachments_exit: 
    Set Atmt = Nothing 
    Set Item = Nothing 
    Set ns = Nothing 
    Exit Sub 

GetAttachments_err: 
    MsgBox "An unexpected error has occurred." _ 
     & vbCrLf & "Please note and report the following information." _ 
     & vbCrLf & "Macro Name: GetAttachments" _ 
     & vbCrLf & "Error Number: " & Err.Number _ 
     & vbCrLf & "Error Description: " & Err.Description _ 
     , vbCritical, "Error!" 
    Resume GetAttachments_exit 
End Sub 
+0

https://msdn.microsoft.com/en-us/library/office/ff868262.aspx Если mpfInbox.Items (я) .class = olMail Тогда – niton

+0

Какие 'if'? 'Item.Sender' или' if atmt'? – 0m3r

+0

Если «Item.Sender» – Chris

ответ

-2

Смотрите этот пример

Filter = "[SenderEmailAddress] = '[email protected]'" 
    Set Items = Inbox.Items.Restrict(Filter) 

    ii = 0 

    For i = Items.Count To 1 Step -1 
     Set Item = Items.Item(i) 

     For Each Atmt In Item.Attachments 
      ' This path must exist! Change folder name as necessary. 
      If Right(Atmt.FileName, 3) = ".py" Then 
       FilePath = "C:\Temp\" 
       FileName = Atmt.FileName 
       Atmt.SaveAsFile FilePath & FileName 
       ii = ii + 1 
      End If 
     Next Atmt 
    Next 
2

Папка может содержать различные типы предметов. Некоторые из них не предоставляют имущество SenderEmailAddress. Попробуйте сначала проверить класс товара (или MessageCLass).

Также вы можете получить проблему с безопасностью, если вы автоматизируете Outlook из другого приложения. См. Outlook "Object Model Guard" Security Issues for Developers.

И не interate на все элементы в папке:

For Each Item In Inbox.Items 
    If Item.SenderEmailAddress = "[email protected]" Then 

Вы можете использовать методы класса Items Find/FindNext или Restrict вместо этого. Подробнее об этих методах в следующих статьях:

Также вы можете найти AdvancedSearch метод класса Application полезно. Ключевыми преимуществами использования метода AdvancedSearch в Outlook являются:

  • Поиск выполняется в другом потоке. Вам не нужно запускать другой поток вручную, так как метод AdvancedSearch автоматически запускает его в фоновом режиме.
  • Возможность поиска любых типов предметов: почты, назначения, календаря, заметок и т. Д. В любом месте, то есть за пределами определенной папки. Методы Ограничения и Найти/FindNext могут применяться к определенной коллекции элементов (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка запросов DASL (пользовательские свойства могут также использоваться для поиска). Подробнее об этом можно узнать в статье Filtering в MSDN. Чтобы повысить эффективность поиска, ключевые слова Instant Search можно использовать, если для хранилища включен Instant Search (см. Свойство IsInstantSearchEnabled класса Store).
  • Вы можете остановить процесс поиска в любой момент, используя метод Stop в классе Search.

Для получения дополнительной информации см. Advanced search in Outlook programmatically: C#, VB.NET.

+0

, я удалил «Item». от "Item.SenderEmailAddress." чтобы выглядеть следующим образом: 'Для каждого элемента In Inbox.Items Если SenderEmailAddress =" [email protected] "Then' и это удалило сообщение об ошибке, но оно не нашло ничего, что бы соответствовало этому условию. – Chris

+1

Нет необходимости удалять элемент 'Item'. Свойство не имеет никакого смысла без объекта. –

 Смежные вопросы

  • Нет связанных вопросов^_^