简体   繁体   English

保存附件然后在 Outlook 2010 中移动电子邮件

[英]Save attachment then move email in outlook 2010

I'm new to VB and have been struggling to try and create a VBA macro that will automatically perform the following tasks upon email receival:我是 VB 新手,一直在努力尝试创建一个 VBA 宏,该宏将在收到电子邮件时自动执行以下任务:

1) Checks to see if the email originated internally, or externally. 1) 检查电子邮件是来自内部还是外部。 (If external ignore) (如果外部忽略)
2) Checks to see if the email has an attachment. 2) 检查电子邮件是否有附件。 (If no attachment, then ignore) (如果没有附件,则忽略)
3) Checks the attachment name, should be like "report" (full name is generally "Report 12198 blah blah.pdf"). 3)查看附件名称,应该像“report”(全名一般是“Report 12198 blah blah.pdf”)。 (If attachment name is not like "report" then ignore) (如果附件名称不像“报告”,则忽略)
4) Save the attachment in G:\\Test 4) 将附件保存在 G:\\Test
5) Move the email to an Outlook folder named "Completed" 5) 将电子邮件移至名为“已完成”的 Outlook 文件夹

I've seen many sites that have code for saving attachments, moving emails to folders but no one else seems to have had the same issue as me;我见过很多网站都有保存附件、将电子邮件移动到文件夹的代码,但似乎没有其他人遇到过与我相同的问题; combining these two.结合这两者。

I initially thought I could use Outlook Rules to help do some of this, but the code I have so far (for saving attachments) doesn't show up as a script.我最初认为我可以使用 Outlook 规则来帮助完成其中的一些工作,但是到目前为止我拥有的代码(用于保存附件)没有显示为脚本。

In addition I've read on a site (can't remember which one) that you can't use a 'For Each' loop when trying to do things such as 'Move' or 'Delete', so I'm not too sure if the code below should be useable.此外,我在一个网站(不记得是哪个)上读到,在尝试执行诸如“移动”或“删除”之类的操作时不能使用“For Each”循环,因此我不太了解确定下面的代码是否应该可用。

Any help would be greatly appreciated.任何帮助将不胜感激。 This is the code I have at the moment:这是我目前的代码:

Sub GetAttachments()

On Error GoTo GetAttachments_err

Dim ns As NameSpace
Dim Inbox As MAPIFolder
Dim Item As Object
Dim Atmt As Attachment
Dim StringLength As Long
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
   For Each Atmt In Item.Attachments
        If Left(Atmt.FileName, 6) Like "*REPORT*" Then
            StringLength = Len(Atmt.FileName)
            FileName = "G:\Test\" & Left(Atmt.FileName, (StringLength - 13)) & Format(Item.CreationTime, "ddmmmyyyy") & ".pdf"
      Atmt.SaveAsFile FileName
      i = i + 1
      End If
   Next Atmt
Next Item

If i > 0 Then
   MsgBox "I found " & i & " attached files." _
      & vbCrLf & "I have saved them into the 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

Exit Sub

End Sub

I think the problem is in the declaration part.我认为问题出在声明部分。
Try to change this:尝试改变这一点:

Dim ns As NameSpace
Dim Inbox As MAPIFolder
Dim Atmt As Attachment
Dim Item as Object

with this:有了这个:

Dim ns As outlook.NameSpace
Dim Inbox As outlook.MAPIFolder
Dim Atmt As outlook.Attachment
Dim Item as outlook.MailItem

Then in your code, you only check for the attachments?然后在你的代码中,你只检查附件?
I can't seem to find the checking for internal or external?我似乎无法找到内部或外部的检查?

to check every incoming mail when received you have to do the following:要检查收到的每封邮件,您必须执行以下操作:

First put in "ThisOutlookSession"首先放入“ThisOutlookSession”

Option Explicit
Private WithEvents objInspectors As Outlook.Inspectors
Public WithEvents myreceivedItems As Outlook.Items

Private Sub Application_Startup()
    Set objInspectors = Outlook.Inspectors

Dim folder As Outlook.MAPIFolder
Set folder = oNamespace.GetDefaultFolder(olFolderInbox)
Set myreceivedItems = folder.Items
End Sub


Private Sub myreceivedItems_ItemAdd(ByVal ItemMail As Object)
If ItemMail.Class = olMail Then Call whatdotowithyourincomingmails(ItemMail, true)
End Sub

whatdotowithyourincomingmails would be the Sub that is called with every mail you receive. whatdotowithyourincomingmails 将是您收到的每封邮件都会调用的 Sub。 This can be in any module, I would not put it into thisoutlooksession.这可以在任何模块中,我不会把它放到这个outlooksession中。

the code there could be like below.那里的代码可能如下所示。 I did copy my own code and changed it to your Needs, I think it should work.我确实复制了我自己的代码并将其更改为您的需求,我认为它应该可以工作。 The Folder completed has to be a subfolder of your inbox.完成的文件夹必须是收件箱的子文件夹。 The subject of the mail will be changed, as you can see in the code - this is just to make sure you know why the mail is in completed.正如您在代码中看到的那样,邮件的主题将被更改 - 这只是为了确保您知道邮件完成的原因。 If the attachment as file already exists in G:\\test, the attachment is ignored.如果附件作为文件已存在于 G:\\test 中,则忽略该附件。 Of course that could be changed in any way (adding timestamp, ideleting existing files,...) Only mails will be moved, that have exactly one attachment with "Report" at the beginning of the Name.当然,这可以以任何方式更改(添加时间戳,删除现有文件,...)只会移动邮件,这些邮件在名称开头只有一个带有“报告”的附件。 Other attachments will be ignored.其他附件将被忽略。

Sub whatdotowithyourincomingmails (olitem As Outlook.MailItem, verschieben As Boolean)
'On Error GoTo exit_sub
Dim lngAttCount As Long, i As Long
Dim Datei As String
Dim anzahl_pdf As Integer
Dim anzahl As Integer

    lngAttCount = olitem.Attachments.Count
    anzahl_pdf = 0
'Zählen pdfs:
    If lngAttCount = 0 Then GoTo Ende_nix
        For i = lngAttCount To 1 Step -1
        With olitem.Attachments.Item(i)
        If LCase(Mid(.FileName, 1, 6)) = "report" Then anzahl_pdf = anzahl_pdf + 1
        End With
        Next i
'verarbeiten wenn 1 pdf
    If Not anzahl_pdf = 1 Then GoTo Ende_nix
        For i = lngAttCount To 1 Step -1
        With olitem.Attachments.Item(i)
         If not LCase(Mid(.FileName, 1, 6)) = "report" Then GoTo naechste
            Datei = "g:\test\" & .FileName
            If CreateObject("Scripting.FileSystemObject").FileExists(Datei) = True Then
                GoTo Ende_nix
                Else
                .SaveAsFile Datei
                anzahl = anzahl + 1
            End If
        End With
naechste:
        Next i
    olitem.Subject = olitem.Subject & " || autosaveandmove"
    If verschieben = True Then
        Call movesomewhereelse(olitem, "completed")
    End If
Ende_nix:
exit_sub:
End Sub



Sub movesomewhereelse(olitem As MailItem, move_to_as string)
Dim olfolder As MAPIFolder
Dim folderPath As String
    'the next line is looking in which Folder the item is; if you are always working with inbox it can be replaced by the path
    folderPath = GetPath_auto(olitem)
    Set olfolder = GetFolder(folderPath)

On Error GoTo exit_sub
    Dim Subfolder As Outlook.MAPIFolder
    Set Subfolder = olfolder.Folders(move_to_as)
    olitem.UnRead = False
    olitem.Move Subfolder
exit_sub: Exit Sub
End Sub



Public Function GetFolder(strFolderPath As String) As MAPIFolder
  ' strFolderPath needs to be something like
  '   "Public Folders\All Public Folders\Company\Sales" or
  '   "Personal Folders\Inbox\My Folder"
On Error GoTo schas
  Dim objApp As Outlook.Application
  Dim objNS As Outlook.NameSpace
  Dim colFolders As Outlook.Folders
  Dim objFolder As Outlook.MAPIFolder
  Dim arrFolders() As String
  Dim i As Long
 ' On Error Resume Next

  strFolderPath = Replace(strFolderPath, "\\", "")
  strFolderPath = Replace(strFolderPath, "/", "\")
  arrFolders() = Split(strFolderPath, "\")
  Set objApp = Application
  Set objNS = objApp.GetNamespace("MAPI")
  Set objFolder = objNS.Folders.Item(arrFolders(0))
  If Not objFolder Is Nothing Then
    For i = 1 To UBound(arrFolders)
      Set colFolders = objFolder.Folders
      Set objFolder = Nothing
      Set objFolder = colFolders.Item(arrFolders(i))
      If objFolder Is Nothing Then
        Exit For
      End If
    Next
  End If

  Set GetFolder = objFolder
GoTo ende
schas:
'MsgBox ("Ordner für verschieben nicht gefunden")
ende:
  Set colFolders = Nothing
  Set objNS = Nothing
  Set objApp = Nothing
End Function

Function GetPath_auto(Item As MailItem) As String
'gibt des gesamten Pfad des items zurück
  Dim folder As Outlook.MAPIFolder
  Dim folderPath As String
  Set folder = Item.Parent
  folderPath = folder.Name
  Do Until folder.Parent = "Mapi" Or folder.Parent = "Freigegebene Daten" 'Or folder.Parent = "Stamm - Postfach"
    Set folder = folder.Parent
    folderPath = folder.Name & "\" & folderPath
  Loop
  GetPath_auto = folderPath
End Function

By the way, if you want to use your script as a rule, define function as顺便说一句,如果您想使用脚本作为规则,请将函数定义为

Sub GetAttachments(mItem As MailItem)

It will then appear in the list of functions when editing a rule然后在编辑规则时它会出现在函数列表中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM