Почему петли в почтовом ящике из последних писем пропускают файлы? - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь загрузить вложения электронной почты в почтовый ящик Outlook на основе полученной даты. Мой код загружает вложения, но пропускает файлы.

Например: я пытался зациклить электронную почту с последней электронной почтой (Дата получения: 14.01.2009). Зацикливаясь на 10-15 электронных письмах, он неожиданно переходит к чтению электронного письма, полученного 12/07/2018.

Sub saveemailattachment()

'Application setup
Dim objOL As Outlook.Application
Set objOL = New Outlook.Application

Dim ONS As Outlook.Namespace
Set ONS = objOL.GetNamespace("MAPI")

Dim olfolder As Outlook.Folder
Set olfolder = ONS.GetDefaultFolder(olFolderInbox)

Dim olmail As Outlook.MailItem
Set olmail = objOL.CreateItem(olMailItem)

Dim olattachment As Outlook.Attachment
Dim i As Long
Dim filename As String
Dim VAR As Date

'Loop through all item in Inbox
For i = olfolder.Items.Count To 1 Step -1 'Iterates from the end backwards

    Set olmail = olfolder.Items(i)

    For Each olmail In olfolder

        VAR = Format(olmail.ReceivedTime, "MM/DD/YYYY")
        filename = olmail.Subject

        If VAR = "1/14/2019" Then  
            For Each olattachment In olmail.Attachments
                olattachment.SaveAsFile "C:\Users\Rui_Gaalh\Desktop\Email attachment\" & olattachment.filename
            Next

        Else

        End If

        'Mark email as read
        olmail.UnRead = False
        DoEvents
        olmail.Save
    Next
Next

MsgBox "DONE"

End Sub

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Не просматривайте все элементы в папке - в некоторых папках может быть десять тысяч сообщений. Используйте Items.Find/FindNext или Items.Restrict с запросом типа "[ReceivedTime] >= '2019-01-14' AND [ReceivedTime] < '2019-01-15'".

В случае Items.Find/FindNext у вас не будет проблем с пропущенными электронными письмами. В случае Items.Restrict используйте понижающий цикл от обратного отсчета до 1 шага -1.

0 голосов
/ 05 апреля 2019

Спасибо за все ваши предложения. Код работает отлично. Пожалуйста, найдите окончательный код ниже:

    Option Explicit
    Sub saveemailattachment()

    'Application setup
     Dim objOL As Outlook.Application
     Set objOL = New Outlook.Application

    Dim ONS As Outlook.Namespace
    Set ONS = objOL.GetNamespace("MAPI")

    Dim olfolder As Outlook.Folder
    Set olfolder = ONS.GetDefaultFolder(olFolderInbox)

    Dim olmail As Object

    Dim olattachment As Outlook.Attachment
    Dim i As Long
    Dim InboxMsg As Object
    Dim filename As String


    'Set variables
    Dim Sunday As Date
    Dim Monday As Date
    Dim Savefolder As String

    Dim VAR As Date
    Dim Timestamp As String

    Monday = ThisWorkbook.Worksheets(1).Range("B2")
    Sunday = ThisWorkbook.Worksheets(1).Range("B3")
    Savefolder = ThisWorkbook.Worksheets(1).Range("B4")

'Loop through all item in Inbox
For i = olfolder.Items.Count To 1 Step -1 'Iterates from the end backwards
    DoEvents
    Set olmail = olfolder.Items(i)
    Application.Wait (Now + TimeValue("0:00:01"))


        'Check if olmail is emailitem
        If TypeOf olmail Is Outlook.MailItem Then

               'Set time fram
                VAR = olmail.ReceivedTime 'Set Received time
                Timestamp = Format(olmail.ReceivedTime, "YYYY-MM-DD-hhmmss") 'Set timestamp format


                If VAR <= Sunday And VAR >= Monday Then


                    For Each olattachment In olmail.Attachments
                    Application.Wait (Now + TimeValue("0:00:01"))


                    'Download excel file and non-L10 file only
                    If (Right(olattachment.filename, 4) = "xlsx" Or Right(olattachment.filename, 3) = "xls")Then

                        'Set file name
                        filename = Timestamp & "_" & olattachment.filename

                        'Download email
                        olattachment.SaveAsFile Savefolder & "\" & filename

                        Application.Wait (Now + TimeValue("0:00:02"))

                        End If
                    Next


                Else

                End If

                'Mark email as read
                olmail.UnRead = False
                DoEvents
                olmail.Save

    Else
    End If
Next


MsgBox "DONE"

End Sub
0 голосов
/ 16 января 2019

Если вы просто пытаетесь сохранить вложения электронной почты, полученные «14.01.2009», тогда

не нужно
For Each olmail In olfolder

Next 

Когда вы уже используете

For i = olfolder.Items.Count To 1 Step -1

next 

Вот еще один objOL.CreateItem(olMailItem) ?? удалите его, также Dim olmail as a generic Object - в папке «Входящие» есть другие объекты, кроме MailItem.

Dim olmail As Outlook.MailItem
Set olmail = objOL.CreateItem(olMailItem)

Установите olMail в цикле, затем проверьте, является ли olMail значение MailItem

Пример * +1031 ** * одна тысяча тридцать две Option Explicit Sub saveemailattachment() 'Application setup Dim objOL As Outlook.Application Set objOL = New Outlook.Application Dim ONS As Outlook.NameSpace Set ONS = objOL.GetNamespace("MAPI") Dim olfolder As Outlook.Folder Set olfolder = ONS.GetDefaultFolder(olFolderInbox) Dim olmail As Object Dim olattachment As Outlook.attachment Dim i As Long Dim filename As String Dim VAR As Date 'Loop through all item in Inbox For i = olfolder.items.Count To 1 Step -1 'Iterates from the end backwards DoEvents Set olmail = olfolder.items(i) If TypeOf olmail Is Outlook.MailItem Then VAR = Format(olmail.ReceivedTime, "MM/DD/YYYY") filename = olmail.Subject If VAR = "1/14/2019" Then For Each olattachment In olmail.Attachments olattachment.SaveAsFile _ "C:\Users\Rui_Gaalh\Desktop\Email attachment\" _ & olattachment.filename Next 'Mark email as read olmail.UnRead = False End If End If Next MsgBox "DONE" End Sub Вы также должны изучить Items.Restrict метод

https://stackoverflow.com/a/48311864/4539709


Метод Items.Restrict является альтернативой использованию метода Find или метода FindNext для итерации по определенным элементам в коллекции. Методы Find или FindNext работают быстрее, чем фильтрация, если имеется небольшое количество элементов. Метод Restrict значительно быстрее, если в коллекции много предметов, особенно если ожидается, что в большой коллекции будет найдено только несколько предметов.


Фильтрация элементов с использованием сравнения строк , поддерживаемая фильтрами DASL, включает в себя эквивалентность, префикс, фразу и сопоставление подстроки. Обратите внимание, что при фильтрации по свойству Subject префиксы, такие как «RE:» и «FW:», игнорируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...