Powershell 之POP3郵件管理

################################################################################
#配置信息

$config=New-Object psobject
$config|Add-Member -MemberType NoteProperty -Name Server -Value "mail.xxx.com"                               #服務器地址
$config|Add-Member -MemberType NoteProperty -Name POP3Port -Value 995                                        #POP3協議端口
$config|Add-Member -MemberType NoteProperty -Name IMAPPort -Value 993                                        #IMAP協議端口
$config|Add-Member -MemberType NoteProperty -Name Account -Value "[email protected]"                              #賬號
$config|Add-Member -MemberType NoteProperty -Name Passwd -Value "Aa123456"                                   #密碼
$config|Add-Member -MemberType NoteProperty -Name OnlyReceiveHeader -Value "false"                           #是否只下載郵件頭信息(true-啓用,false-禁用)
$config|Add-Member -MemberType NoteProperty -Name ResultSize -Value "11"                                     #設置分頁大小
$config|Add-Member -MemberType NoteProperty -Name EnablePage -Value "true"                                   #是否啓用分頁設置(true-啓用,false-禁用)
$config|Add-Member -MemberType NoteProperty -Name DownAttachPath -Value "false"                              #是否下載附件(true-啓用,false-禁用)
$config|Add-Member -MemberType NoteProperty -Name AttachPath -Value "D:\PSTemplate\Attachments"              #郵件附件存放地址
$config|Add-Member -MemberType NoteProperty -Name ClassFilePath -Value "c:\LumiSoft.Net.dll"                 #代碼庫文件

#POP3協議
function Login-POP3{
    [void][reflection.assembly]::LoadFile($Config.ClassFilePath)
    $pop3=New-Object LumiSoft.Net.POP3.Client.POP3_Client
    if($pop3.IsConnected -ne 'true'){
        $pop3.Connect($Config.Server,$Config.POP3Port,'true')
        try{$pop3.Login($Config.Account,$Config.Passwd)}catch{Write-Warning "無法登錄到服務器";Write-Host $Error[0];break}
    }
    return $pop3
}
#IMAP協議
function Login-IMAP{
    [void][reflection.assembly]::LoadFile($Config.ClassFilePath)
    $iMAP=New-Object LumiSoft.Net.IMAP.Client.IMAP_Client
    if($iMAP.IsConnected -ne "true"){
        $iMAP.Connect($Config.Server,$Config.IMAPPort,$true)
        try{$iMAP.Login($Config.Account,$Config.Passwd)}catch{Write-Warning "無法登錄到服務器";Write-Host $Error[0];break}
    }
    return $iMAP
}

#下載附件
function Download-Attach{
    param($MailString)
    $Attachments=$MailString.GetAttachments($true,$true)
    foreach($Entity in $Attachments){
        if($Entity.ContentDescription -ne $null){
            $FileName=$Entity.ContentDescription
            if($FileName -ne $null){
                [System.IO.DirectoryInfo]$Dir=$config.AttachPath+"\"+$UID
                if(! $Dir.Exists){
                    $Dir.Create()
                }
                [string]$Path=[System.IO.Path]::Combine($Dir.FullName,$FileName)
                [LumiSoft.Net.MIME.MIME_b_SinglepartBase]$ByteObj=$Entity.Body
                [System.IO.Stream]$DecodedDataStream=$ByteObj.GetDataStream()
                try{
                    $FS=New-Object System.IO.FileStream($Path,[System.IO.FileMode]::Create)
                }finally{
                    [void][LumiSoft.Net.Net_Utils]::StreamCopy($DecodedDataStream,$FS,4000)
                }
                $FS.Dispose()
                Remove-Variable 'FS'
                Remove-Variable 'DecodedDataStream'
                Write-Host "$Path 文件已成功下載!" -ForegroundColor Green
            }
        }
    }
}

#格式化數據
function Data-Format{
    $psobject=New-Object psobject
    $psobject| Add-Member -MemberType NoteProperty -Name ID -Value $i
    $psobject| Add-Member -MemberType NoteProperty -Name UID -Value $UID
    #$psobject| Add-Member -MemberType NoteProperty -Name IsDisposed -Value $IsDisposed
    $psobject| Add-Member -MemberType NoteProperty -Name Date -Value $MailString.Date
    $psobject| Add-Member -MemberType NoteProperty -Name From -Value $MailString.From.Address
    $psobject| Add-Member -MemberType NoteProperty -Name To -Value $MailString.To.Address
    $psobject| Add-Member -MemberType NoteProperty -Name Cc -Value $MailString.cc.Address
    $psobject| Add-Member -MemberType NoteProperty -Name Bcc -Value $MailString.bcc.Address
    $psobject| Add-Member -MemberType NoteProperty -Name Subject -Value $MailString.Subject
    $psobject| Add-Member -MemberType NoteProperty -Name Body -Value $MailString.BodyHtmlText
    $psobject| Add-Member -MemberType NoteProperty -Name Size -Value $MailSize
    $psobject| Add-Member -MemberType NoteProperty -Name MessageID -Value $MailString.MessageID
    $psobject| Add-Member -MemberType NoteProperty -Name IsMarkedForDeletion -Value $IsMarkedForDeletion
    return $psobject
}
#
function Get-MailMessage{
    $pop3=Login-POP3
    $AllMails=$pop3.messages | Sort-Object -Property SequenceNumber -Descending
    if(!$AllMails){
        Write-Warning "當前郵箱賬號沒有郵件"
        exit 1
    }
    #總郵件數
    $Counts=$AllMails.Count
    #第一封郵件編號
    #[int]$FirstNumber=$AllMails[0].SequenceNumber
    #分頁設置
    if($config.EnablePage -eq 'true'){
        [int]$ResultSize=$config.ResultSize
    }else{
        $ResultSize=$Counts
    }
    #動態數組整合郵件信息
    $Lists=New-Object System.Collections.ArrayList
    #編號
    $i=1
    Write-Host "當前賬號中總共有" -NoNewline
    Write-Host $Counts  -ForegroundColor Green -NoNewline
    Write-Host "封郵件," -NoNewline
    #如果郵件總數小於分頁數,則取出所有數據
    if($Counts -le $ResultSize){
        Write-Host "已經爲您獲取最新的" -NoNewline
        Write-Host "$Counts" -NoNewline -ForegroundColor Green
        Write-Host "封郵件。"
        foreach($Mails in $AllMails){
            [String]$IsDisposed=$Mails.IsDisposed
            [int]$Number=$Mails.SequenceNumber
            [int]$UID=$Mails.UID
            [int]$MailSize=$Mails.Size
            [String]$IsMarkedForDeletion=$Mails.IsMarkedForDeletion
            if($config.OnlyReceiveHeader -eq 'True'){
                $MailString=[LumiSoft.Net.Mail.Mail_Message]::ParseFromByte($Mails.HeaderToByte())
            }else{
                $MailBytes=$Mails.MessageToByte()
                $MailString=[LumiSoft.Net.Mail.Mail_Message]::ParseFromByte($MailBytes)
                #######處理附件
                if($config.DownAttachPath -eq 'true'){
                    Download-Attach $MailString
                }
                #######
            }
            $DataFormat=Data-Format
            [void]$Lists.Add($DataFormat)
            $i++
        }
        return $Lists
        Remove-Variable 'Lists'
    }else{
        Write-Host "已經爲您獲取最新的" -NoNewline
        Write-Host "$ResultSize" -NoNewline -ForegroundColor Green
        Write-Host "封郵件。"
        $j=1
        foreach($Mails in $AllMails){
            if($j -gt $ResultSize){
                $Lists
                Remove-Variable 'Lists'
                $Lists=New-Object System.Collections.ArrayList
                Write-Host "是否繼續執行,每次將提取" -NoNewline
                Write-Host $ResultSize -ForegroundColor Green -NoNewline
                Write-Host  "條記錄 (y/n):"
                $rh=Read-Host
                if($rh -eq "n"){
                    return $Lists
                }else{
                    $j=1
                }
            }
            [String]$IsDisposed=$Mails.IsDisposed
            [int]$Number=$Mails.SequenceNumber
            [int]$UID=$Mails.UID
            [int]$MailSize=$Mails.Size
            [String]$IsMarkedForDeletion=$Mails.IsMarkedForDeletion
            if($config.OnlyReceiveHeader -eq 'True'){
                $MailString=[LumiSoft.Net.Mail.Mail_Message]::ParseFromByte($Mails.HeaderToByte())
            }else{
                $MailBytes=$Mails.MessageToByte()
                $MailString=[LumiSoft.Net.Mail.Mail_Message]::ParseFromByte($MailBytes)
                #######處理附件
                if($config.DownAttachPath -eq 'true'){
                    Download-Attach $MailString
                }
                #######
            }
            $DataFormat=Data-Format
            [void]$Lists.Add($DataFormat)
            $i++
            $j++
        }
        return $Lists
        Remove-Variable 'Lists'
    }
}

<#
$iMAP=Login-IMAP
$iMAP.SelectFolder('inbox')
$seqSet=[LumiSoft.Net.IMAP.IMAP_t_SeqSet]::Parse("1000:*")

$a=New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i_Envelope
$b=New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i_Uid
$c=New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i_Flags
$d=New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i_InternalDate
$e=New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i_Rfc822


#New-Object LumiSoft.Net.IMAP.IMAP_t_Fetch_i

#>


Get-MailMessage | Out-GridView


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章