分享我常用的一則 PowerShell 私房小技巧 - 在 Windows 桌面環境透過 Outlook 寄信。

面對一堆煩人的日常瑣事,我習慣用 PowerShell 寫些自動化或半自動化小幫手程式,替我完成枯燥又沒營養的人工作業,應用情境中難免有寄信需求。用程式發信的方法很多,像是透過 SMTP呼叫 EWS (Exchange Web Service)... 等等,但 SMTP 需要伺服器端授權 Relay 轉信,EWS 要找到 Web Service 網址指定登入身分等,都需要相關條件配合。我的小幫手程式多半是在登入 PC 時執行,而大部分辦公環境 Outlook 幾乎會全程開啟,於是一條超簡便的寄信捷徑出現了 - 何不請 Outlook 幫我們寄信呢?程式不用管郵件伺服器 IP、登入身分,只要 Outlook 平常能收發信,信就一定寄得出去。

我寫了一支 Send-OutlookMail.ps1 來示範,傳入收件地址、主旨、內文就完成寄信工作;內文如果以 < 起首會視為 HTML 格式處理,故內容支援字體、大小、顏色,給檔名還可夾附件,程式碼完全不用管連的是 Exchange、Hotmail 還是 Gmail,也不需要知道寄件者帳號密碼,是不是很方便呢?

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $rcpt,
    [Parameter(Mandatory = $true)]
    [string]
    $subject,
    [Parameter(Mandatory = $true)]
    [string]
    $body,
    $attachment
)

$outlookApp = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
if (!$outlookApp) {
    throw "請先開啟 Outlook 程式"
}
# Microsoft.Office.Interop.Outlook.OlItemType.olMailItem = 0
$mailItem = $outlookApp.CreateItem(0)
$rcpt.Split(',') | ForEach-Object {
    # Microsoft.Office.Interop.Outlook.OlMailRecipientType.olTo = 1 (olCC = 2, olBCC = 2)
    $mailItem.Recipients.Add($_).Type = 1
}
$mailItem.Subject = $subject
if ($body.StartsWith('<')) {
    $mailItem.HTMLBody = $body
}
else {
    $mailItem.Body = $body
}
$attachment | ForEach-Object {
    if ($_) {
        if (Test-Path -Path $_ -PathType Leaf) {
            # Microsoft.Office.Interop.Outlook.olAttachmentType.olByValue = 1
            # olByValue = 1 (副本), olByReference = 4 (Outlook 2007 不支援), olEmbeddeditem = 5 (.msg), olOLE = 6
            $fullPath = (Resolve-Path $_).Path
            $mailItem.Attachments.Add($fullPath, 1) | Out-Null
        }
        else {
            Write-Host "Invalid attachment path - $_" -ForegroundColor Red
        }
    }
}
$mailItem.Send()

實測一下:

.\Send-OutlookMail mail-address@mail.com 這是純文字測試信 "純文字內容"
"1234" | Out-File "test.txt"
.\Send-OutlookMail mail-address@mail.com 這是彩色測試信 '<div>可以有<span style="color:red">紅色的字</span>耶</div>' test.txt

成功!

Example of using PowerShell to sending Email via Outlook application.


Comments

# by 王董

Powershell真的要寄信不用特地用Outlook,有發信函式可用。

# by CCY

樓上miss the point, 用發信函式還得針對要使用的mail service設定, 這隻script只要帶到原本有設定好outlook的電腦,開了outlook 都可以用

Post a comment


27 + 11 =