public/New-Smtp4DevContainer.ps1

<#
.SYNOPSIS
    Creates or recreates a new container with smtp4dev
.DESCRIPTION
    Creates a new container based on the latest smtp4dev image
.PARAMETER Shortcut
    Defines where to create the shortcut
.PARAMETER Reset
    Removes all the Cache from your local machine before recreating a new smtp4dev container
.PARAMETER LocalUiPort
    Defines to what local port the smtp4dev UI will be redirected
.PARAMETER LocalSmtpPort
    Defines to what local port smtp will be redirected
.EXAMPLE
    New-Smtp4DevContainer
.EXAMPLE
    New-Smtp4DevContainer -Reset
.EXAMPLE
    New-Smtp4DevContainer -Shortcut CommonStartMenu
.EXAMPLE
    New-Smtp4DevContainer -LocalSmtpPort 25 -LocalUiPort 80
#>

function New-Smtp4DevContainer {
    [CmdletBinding()]
    param(
        [parameter(Mandatory = $false)]
        [ValidateSet('None', 'Desktop', 'StartMenu', 'Startup', 'CommonDesktop', 'CommonStartMenu', 'CommonStartup', 'DesktopFolder', 'CommonDesktopFolder')]
        [string]$Shortcut = "Desktop",
        [parameter(Mandatory = $false)]
        [switch]$Reset,
        [parameter(Mandatory = $false)]
        [ValidateRange(1, [Int32]::MaxValue)]
        [Int32]$LocalUiPort = 3000,
        [parameter(Mandatory = $false)]
        [ValidateRange(1, [Int32]::MaxValue)]
        [Int32]$LocalSmtpPort = 2525
    )
    process {
        #region CheckIfNavContainerHelperIsInstalled
        if (-not (Get-InstalledModule -Name navcontainerhelper -ErrorAction SilentlyContinue)) {
            Write-Error "navcontainerhelper is not installed." -ErrorAction Stop
        }
        #endregion CheckIfNavContainerHelperIsInstalled

        Remove-Smtp4DevContainer

        Write-Verbose "Pull Container"
        $null = Invoke-Docker -imageName "rnwood/smtp4dev" -command pull
        if ($Reset) {
            Write-Verbose "Remove Data dir '$smtp4devDataFolder'"
            remove-item $smtp4devDataFolder -Force -Recurse
        }
        Write-Verbose "Create Data dir '$smtp4devDataFolder' if not exists"
        $null = mkdir $smtp4devDataFolder -ErrorAction SilentlyContinue
        Write-Verbose "Create Container"
        $null = Invoke-Docker -imageName "rnwood/smtp4dev" -command run -parameters @("-p $($LocalUiPort):80", "-p $($LocalSmtpPort):25", "-v C:\ProgramData\smtp4dev:C:\smtp4dev", "--name $Smtp4DevContainerName", "--hostname $Smtp4DevContainerName", "--detach")
        #$null = docker run -d -p $($LocalUiPort):80 -p $($LocalSmtpPort):25 --name smtp4dev -v C:\ProgramData\smtp4dev:C:\smtp4dev rnwood/smtp4dev

        Write-Verbose "Create Shortcut"
        $ShortcutTarget = "http://localhost:$LocalUiPort"

        try {
            $IconLocation = Join-Path -Path $smtp4devDataFolder -ChildPath "icon.ico"
            Invoke-WebRequest -OutFile $IconLocation -Uri "https://raw.githubusercontent.com/rnwood/smtp4dev/v2.0.10/Rnwood.Smtp4dev/Resources/Icon1.ico" -TimeoutSec 5
        }
        catch {
            Write-Verbose "Icon Download failed for some reason. Fallback to iex icon"
            $IconLocation = "C:\Program Files\Internet Explorer\iexplore.exe, 3"
        }
        New-DesktopShortcut -Name $ShortcutTitle -TargetPath $ShortcutTarget -Shortcuts $Shortcut -IconLocation $IconLocation
    }
}