Public/Import/Add-ForwarderToExoMailbox.ps1

function Add-ForwarderToExoMailbox {
    <#
    .SYNOPSIS
    Waits for an Exchange Online Mailbox to be provisioned then adds a forwarder.
    Prefix of forwarder is the mailbox's PrimarySmtpAddress and the Suffix is specified at runtime.
 
    .DESCRIPTION
    Waits for an Exchange Online Mailbox to be provisioned then adds a forwarder.
    Prefix of forwarder is the mailbox's PrimarySmtpAddress and the Suffix is specified at runtime.
 
    .PARAMETER ForwardSuffix
    Example -ForwardSuffix 'forward.contoso.com'
 
    .PARAMETER PrimarySmtpAddress
    To specify PrimarySmtpAddress of the mailbox in which to add a forward.
    This is instead of using the pipeline
 
    .PARAMETER OutputPath
    Output path for log files. Example -OutputPath c:\scripts
 
    .PARAMETER User
    This parameter is fed via the pipeline like the following example:
    Import-Csv .\users.csv | Add-ForwarderToExoMailbox 'forward.contoso.com' -OutputPath c:\scripts -Verbose
 
    .EXAMPLE
    Import-Csv .\users.csv | Add-ForwarderToExoMailbox 'forward.contoso.com' -OutputPath c:\scripts -Verbose
 
    .EXAMPLE
    Add-ForwarderToExoMailbox -ForwardSuffix 'forward.contoso.com' -PrimarySmtpAddress 'jane@contoso.com' -OutputPath c:\scripts -Verbose
 
    .EXAMPLE
    Add-ForwarderToExoMailbox -ForwardSuffix 'forward.contoso.com' -PrimarySmtpAddress 'jane@contoso.com','joe@contoso.com' -OutputPath c:\scripts -Verbose
 
    .NOTES
    CSV must have at least one column with header named login
 
    for example...
 
    DisplayName, Login, Email
    Jane Smith, Jane@contoso.com, Jane@contoso.com
    Joe Smith, Joe@contoso.com, Joe@contoso.com
 
    OR perhaps just one column
 
    Login
    Jane@contoso.com
    Joe@contoso.com
    Fred@contoso.com
    Sally@contoso.com
 
    #>


    [CmdletBinding(DefaultParameterSetName = 'UPN')]
    param(

        [Parameter(Position = 0, Mandatory)]
        [string]
        $ForwardSuffix,

        [Parameter(Position = 1, ParameterSetName = "UPN")]
        [Alias("UPN")]
        [string[]]
        $PrimarySmtpAddress,

        [Parameter(Mandatory = $true)]
        [String] $OutputPath,

        [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Pipeline")]
        [Alias("InputObject")]
        [object[]]
        $User

    )
    begin {

        $LogFileName = $(Get-Date -Format yyyy-MM-dd)
        $Log = Join-Path $OutputPath ($LogFileName + "-Add_Fowarder-Log.csv")
        $ForwardSuffix = $ForwardSuffix.Trim('@')

    }
    process {
        switch ($PSCmdlet.ParameterSetName) {
            "UPN" {
                foreach ($Object in $PrimarySmtpAddress) {
                    Write-Host "Object: $($Object.Login)"
                    $Filterstring = "PrimarySmtpAddress -eq '{0}'" -f $Object.Login
                    if ($Mailbox = Get-Mailbox -Filter $Filterstring) {
                        $Forward = '{0}@{1}' -f $Mailbox.PrimarySmtpAddress.Split('@')[0], $ForwardSuffix
                        try {
                            $Mailbox | Set-Mailbox -ForwardingSmtpAddress $Forward -erroraction stop
                            Write-Verbose ("SUCCESS: Mailbox forwarder set {0}" -f $Mailbox.DisplayName)
                            $AfterSet = Get-Mailbox -Filter $Filterstring
                            Write-Host "$($AfterSet.DisplayName) New Forwarding Address: $($AfterSet.ForwardingSmtpAddress)" -ForegroundColor Green
                            [PSCustomObject]@{
                                Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                                Result             = 'SUCCESS'
                                Action             = 'SETFORWARD'
                                Object             = $Object.Login
                                PrimarySmtpAddress = $Mailbox.PrimarySmtpAddress
                                DisplayName        = $Mailbox.DisplayName
                                ExchangeGuid       = $Mailbox.ExchangeGuid
                                ForwardingBefore   = $Mailbox.ForwardingSmtpAddress
                                FowardingAfter     = $AfterSet.ForwardingSmtpAddress
                                FullNameError      = 'SUCCESS'
                                Message            = 'SUCCESS'
                                ExtendedMessage    = 'SUCCEES'
                            } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                        }
                        catch {
                            Write-Verbose ("FAILED: Mailbox forwarder not set {0}" -f $Mailbox.DisplayName)
                            [PSCustomObject]@{
                                Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                                Result             = 'FAILED'
                                Action             = 'SETFORWARD'
                                Object             = $Object.Login
                                PrimarySmtpAddress = $Mailbox.PrimarySmtpAddress
                                DisplayName        = $Mailbox.DisplayName
                                ExchangeGuid       = $Mailbox.ExchangeGuid
                                ForwardingBefore   = $Mailbox.ForwardingSmtpAddress
                                FowardingAfter     = 'FAILED'
                                FullNameError      = $_.Exception.GetType().fullname
                                Message            = $_.CategoryInfo.Reason
                                ExtendedMessage    = $_.Exception.Message
                            } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                        }
                    }
                    else {
                        Write-Verbose ("FAILED: Mailbox not found {0}" -f $Object.Login)
                        [PSCustomObject]@{
                            Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                            Result             = 'FAILED'
                            Action             = 'MAILBOXNOTFOUND'
                            Object             = $Object.Login
                            PrimarySmtpAddress = 'MAILBOXNOTFOUND'
                            DisplayName        = 'MAILBOXNOTFOUND'
                            ExchangeGuid       = 'MAILBOXNOTFOUND'
                            ForwardingBefore   = 'MAILBOXNOTFOUND'
                            FowardingAfter     = 'MAILBOXNOTFOUND'
                            FullNameError      = 'MAILBOXNOTFOUND'
                            Message            = 'MAILBOXNOTFOUND'
                            ExtendedMessage    = 'MAILBOXNOTFOUND'

                        } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                    }
                }
            }
            "Pipeline" {
                if ($MyInvocation.ExpectingInput) {
                    $User = , $User
                }

                foreach ($Object in $User) {
                    Write-Host "Object: $($Object.Login)"
                    $Filterstring = "PrimarySmtpAddress -eq '{0}'" -f $Object.Login
                    if ($Mailbox = Get-Mailbox -Filter $Filterstring) {
                        $Forward = '{0}@{1}' -f $Mailbox.PrimarySmtpAddress.Split('@')[0], $ForwardSuffix
                        try {
                            $Mailbox | Set-Mailbox -ForwardingSmtpAddress $Forward -erroraction stop
                            Write-Verbose ("SUCCESS: Mailbox forwarder set {0}" -f $Mailbox.DisplayName)
                            $AfterSet = Get-Mailbox -Filter $Filterstring
                            Write-Host "$($AfterSet.DisplayName) New Forwarding Address: $($AfterSet.ForwardingSmtpAddress)" -ForegroundColor Green
                            [PSCustomObject]@{
                                Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                                Result             = 'SUCCESS'
                                Action             = 'SETFORWARD'
                                Object             = $Object.Login
                                PrimarySmtpAddress = $Mailbox.PrimarySmtpAddress
                                DisplayName        = $Mailbox.DisplayName
                                ExchangeGuid       = $Mailbox.ExchangeGuid
                                ForwardingBefore   = $Mailbox.ForwardingSmtpAddress
                                FowardingAfter     = $AfterSet.ForwardingSmtpAddress
                                FullNameError      = 'SUCCESS'
                                Message            = 'SUCCESS'
                                ExtendedMessage    = 'SUCCEES'
                            } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                        }
                        catch {
                            Write-Verbose ("FAILED: Mailbox forwarder not set {0}" -f $Mailbox.DisplayName)
                            [PSCustomObject]@{
                                Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                                Result             = 'FAILED'
                                Action             = 'SETFORWARD'
                                Object             = $Object.Login
                                PrimarySmtpAddress = $Mailbox.PrimarySmtpAddress
                                DisplayName        = $Mailbox.DisplayName
                                ExchangeGuid       = $Mailbox.ExchangeGuid
                                ForwardingBefore   = $Mailbox.ForwardingSmtpAddress
                                FowardingAfter     = 'FAILED'
                                FullNameError      = $_.Exception.GetType().fullname
                                Message            = $_.CategoryInfo.Reason
                                ExtendedMessage    = $_.Exception.Message
                            } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                        }
                    }
                    else {
                        Write-Verbose ("FAILED: Mailbox not found {0}" -f $Object.Login)
                        [PSCustomObject]@{
                            Time               = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
                            Result             = 'FAILED'
                            Action             = 'MAILBOXNOTFOUND'
                            Object             = $Object.Login
                            PrimarySmtpAddress = 'MAILBOXNOTFOUND'
                            DisplayName        = 'MAILBOXNOTFOUND'
                            ExchangeGuid       = 'MAILBOXNOTFOUND'
                            ForwardingBefore   = 'MAILBOXNOTFOUND'
                            FowardingAfter     = 'MAILBOXNOTFOUND'
                            FullNameError      = 'MAILBOXNOTFOUND'
                            Message            = 'MAILBOXNOTFOUND'
                            ExtendedMessage    = 'MAILBOXNOTFOUND'

                        } | Export-Csv -Path $Log -NoTypeInformation -Append -Encoding UTF8
                    }
                }
            }
        }
    }
    end {

    }

}