0

我想知道是否有办法从公用文件夹附件中获取文件扩展名?

背景: 我们正在使用一个软件 (AttachmentsProcessor) 从公共文件夹结构中的电子邮件中提取所有附件并将其保存到文件系统中。该软件在电子邮件中放置一个 .lnk,它指向文件系统中的位置。所以我们可以通过双击打开附件。

最近,我们将公用文件夹结构从内部 Exchange 移至 Office365 / Exchange Online。在此过程中,我们尝试将所有提取的附件放回电子邮件中。在我们进行了一些测试之后,我们注意到这对某些电子邮件不起作用。我们仍然将 .lnk 作为附件。

那我在找什么? 我想在 powershell 中编写一个脚本,它向我显示所有电子邮件和相应文件夹(Identites)的列表,其中附加了一个 .lnk 文件。

在我的搜索中,我发现了一些适用于邮箱但不适用于公用文件夹的东西。

-> 获取邮箱 | 导出邮箱 -AttachmentFilenames "*.PDF"

-> 获取邮箱 | New-MailboxExportRequest -ContentFilter {Attachment -like "*.PDF"}

任何帮助都会非常好。;-)

感谢您的关注彼得

4

1 回答 1

0

我不能公开为您编写所有代码。但我有一些东西可以让你开始。此脚本将递归遍历您的公用文件夹并查找带有附件的项目。循环内的最后一点代码当前将文件保存到磁盘,但您可以在此处用一些逻辑替换它以执行您需要它执行的操作(即按附件过滤、拉取链接信息等)。

$TargetDirectory = "C:\temp\PublicFolders"

function process-folders-recursive($folder, $path) {
    if($folder.DefaultMessageClass -ne "IPM.Appointment" -and $folder.DefaultMessageClass -ne "IPM.Contact")
    {
        $path = (Join-Path $path $folder.name)
        write-host $folder.class $path
        if($folder.Items.Count -gt 0 ){
            foreach($item in $folder.Items){
              if($item.MessageClass -ne "IPM.Appointment")
              {
                #Write-Host $item.name
                if($item.Attachments.Count -gt 0 ) {
                    if(!(Test-Path -path $path)){
                        New-Item -ItemType directory -Path $path
                    }
                    foreach($attch in $item.Attachments){
                        try
                            {
                            Write-Host $attch.FileName
                            $fileName = $attch.FileName
                            $fileNameAndPath = (Join-Path $path $fileName)
                            $attch.saveasfile($fileNameAndPath)
                        }
                        catch [System.Exception]
                        {
                            Write-Host $path $fileName # $_.Exception.ToString()
                        }
                    }
                  }
                }
            }
        }
        $folder.Folders | ForEach { process-folders-recursive $_ $path}  
   }
}

$objOutlook = New-Object -comobject outlook.application
$objNamespace = $objOutlook.GetNamespace(“MAPI”)

#Get Outlook folder with name Public Folders
$publicFolders  = $objNamespace.Folders | Where { $_.name.StartsWith("Public Folders") } | Select -f 1

#Go into the "All Public Folders" folder
$AllPublicFolders = $publicFolders.Folders | Where { $_.name -eq "All Public Folders" } | Select -f 1

#Recurse through the Public Folders
process-folders-recursive $AllPublicFolders $TargetDirectory
于 2014-09-15T15:40:04.890 回答