Outlook Удалить электронную почту после сохранения - PullRequest
0 голосов
/ 09 ноября 2018

Я очень ограничен в своих навыках VBA, но я так далеко, что теперь я хочу закончить этот проект.

У меня ниже VBA код работает хорошо в моем мировоззрении.Он сохраняет требуемую электронную почту на моем диске.

Private WithEvents Items As Outlook.Items

Private Sub Application_Startup()
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Items

End Sub

Private Sub Items_ItemAdd(ByVal item As Object)

On Error GoTo ErrorHandler

    'Only act if it's a MailItem
    Dim Msg As Outlook.MailItem
    If TypeName(item) = "MailItem" Then
        Set Msg = item

    'Change variables to match need. Comment or delete any part unnecessary.
        If (Msg.SenderEmailAddress = "noreply@test.com") Or _
        (Msg.Subject = "Smartsheet") Or _
        (Msg.Subject = "Defects") And _
        (Msg.Attachments.Count >= 1) Then

    'Set folder to save in.
    Dim olDestFldr As Outlook.MAPIFolder
    Dim myAttachments As Outlook.Attachments
    Dim Att As String

    'location to save in.  Can be root drive or mapped network drive.
    Const attPath As String = "C:\"


    ' save attachment
   Set myAttachments = item.Attachments
    Att = myAttachments.item(1).DisplayName
    myAttachments.item(1).SaveAsFile attPath & Att

    ' mark as read
   Msg.UnRead = False

End If
End If


ProgramExit:
  Exit Sub

ErrorHandler:
  MsgBox Err.number & " - " & Err.Description
  Resume ProgramExit
End Sub

Я хочу добавить код для перемещения электронной почты после сохранения вложения в моей тестовой папке.Тестовая папка находится в папке «Входящие» в моем мировоззрении.

Я добавил Set FldrDest = Session.Folders("Address1").Folders("Inbox").Folders("Test")

в Private Sub Application_Startup () , а затем добавил код в свой VBA.

Код после 'пометить как прочитанное

If .Parent.Name = "Test" And .Parent.Parent.Name = "Inbox" Then
      ' MailItem is already in destination folder
    Else
      .Move FldrDest
    End If

Других изменений нет, но это приводит к ошибкам компиляции.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

MailItem.Move на самом деле является функцией , которая возвращает объект, который был перемещен в новом месте назначения. Старый объект как бы «потерян», посмотрите, как его использовать (я прокомментировал часть удаления во всем коде ;))

Set Msg = .Move(FldrDest)
MsgBox Msg.SenderEmailAddress & vbCrLf & Msg.Subject

Полный код с некоторыми предложениями по улучшению (см. '--> комментарии):

Private WithEvents Items As Outlook.Items

'location to save in.  Can be root drive or mapped network drive.
'-->As it is a constant you can declare it there (and so, use it in the whole module if you want to do other things with it!)
Private Const attPath As String = "C:\"


Private Sub Application_Startup()
    Dim olApp As Outlook.Application
    Dim objNS As Outlook.NameSpace
    Set olApp = Outlook.Application
    Set objNS = olApp.GetNamespace("MAPI")
    Set Items = objNS.GetDefaultFolder(olFolderInbox).Items
End Sub

Private Sub Items_ItemAdd(ByVal item As Object)

On Error GoTo ErrorHandler
    'Only act if it's a MailItem
    If TypeName(item) = "MailItem" Then
        Dim Msg As Outlook.MailItem
        '-->Use directly the parameter and keep it under wraps using "With", it'll improve efficiency
        With item
            'Change variables to match need. Comment or delete any part unnecessary.
            If (.SenderEmailAddress = "noreply@test.com" _
               Or .Subject = "Smartsheet" _
               Or .Subject = "Defects" _
               ) _
               And .Attachments.Count >= 1 Then


                Dim aAtt As Outlook.Attachment
                '-->Loop through the Attachments' collection
                for each aAtt in item.Attachments
                    '-->You can either use aAtt.DisplayName or aAtt.FileName
                    '-->You can test aAtt.Size or aAtt.Type

                    'save attachment
                    aAtt.SaveAsFile attPath & aAtt.DisplayName
                next aAtt

                'mark as read
                .UnRead = False

                Dim olDestFldr As Outlook.MAPIFolder
                Set FldrDest = Session.Folders("Address1").Folders("Inbox").Folders("Test")
                If .Parent.Name = "Test" And .Parent.Parent.Name = "Inbox" Then
                    'MailItem is already in destination folder
                Else
                    Set Msg = .Move(FldrDest)
                    MsgBox Msg.SenderEmailAddress & vbCrLf & Msg.Subject
                    'Msg.delete
                End If
            End If
        End With 'item
    End If


ProgramExit:
  Exit Sub

ErrorHandler:
  MsgBox Err.number & " - " & Err.Description
  Resume ProgramExit
End Sub
0 голосов
/ 13 ноября 2018

Проще, чем я думал. Просто добавил цикл с Msg.Delete.

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