PowershellでYahooのSMTPサーバーからメールを送信するサンプル

コンピュータ

はじめに

Powershellスクリプトからメールが送信出来ると何かと便利です。
たとえばバッチ処理の結果をメール送信して出先で受け取ったり、Evernoteなどのクラウドサービスにメールで投稿するなどでアイディア次第で色々な場面で活用出来ます。メールを送信するためにはメールの送信サーバーが必要です。私を含め多くの方がYahooのアカウントをお持ちだと思います。
今回はYahooのSMTPサーバーからメール送信する方法をご紹介します。

PowerShellスクリプトを初めて実行する場合

PowerShellスクリプトの実行を許可してください。
Powershellのps1ファイルを実行する方法
PowersehllをはじめるにあたりWindowsのコマンドラインインターフェースであるPowershellはコマンドレットと言われる命令をテキストファイルに記述したスクリプトファイルを実行することが出来ます。Powershellはその名...

スクリプト

<#
.SYNOPSIS
Yahooのメールアカウントからメールを送信する。
<CommonParameters> はサポートしていません

.DESCRIPTION
テキストメール

.EXAMPLE
Send-YahooMail -UserName ユーザ名 -Password パスワード -ToEMailAddress メアド
 -Subject 件名 -Body 本文

.PARAMETER UserName
Yahooアカントのユーザー名

.PARAMETER Password
Yahooアカントのパスワード

.PARAMETER Password
送信先メールアドレス

.PARAMETER Subject
件名

.PARAMETER Body
本文

#>
function Send-YahooMail
{
    param(
        [string]
        $UserName,
        [string]
        $Password,
        [string]
        $ToEMailAddress,
        [string]
        $Subject,
        [string]
        $Body
    )
    begin {
        $Smtp = New-Object Net.Mail.SmtpClient("smtp.mail.yahoo.co.jp", 587)
        $Smtp.EnableSsl = $false
        $Smtp.Credentials  = New-Object Net.NetworkCredential(
            $UserName, $Password)
    }

    process {
        
        # 件名JIS->Base64
        $enc = [System.Text.Encoding]::GetEncoding("iso-2022-jp")
        $str2 = $Subject | % {
            $s = $_
            (1..2) | % {
                $s = [Convert]::ToBase64String($enc.GetBytes($s))
                $s = ("=?{0}?B?{1}?=" -f "iso-2022-jp", $s)
            }
            $s
        }

        $Mail = New-Object Net.Mail.MailMessage(
                "${UserName}@yahoo.co.jp",
                $ToEMailAddress,
                $str2,
                $Body)

        $Smtp.Send($mail)
        $Mail.Dispose()
    }
    end {
        $Smtp.Dispose()
    }
}
if (-not($MyInvocation.PSCommandPath)) {
    $usr  = "UserName" # Yahooユーザ名
    $pass = "Password" # Yahooパスワード
    $to   = "EmalAdress" # 送信先アドレス
    $sub  = "テストメール" # 件名
    $bdy  = "本文"     # 本文
    Send-YahooMail $usr $pass $to $bdy $sub
}

注意点

私がはまった点はSMTPサーバーのポート($port)を465を指定してSSL($smtp.EnableSsl = $true)にするとメールの送信失敗します。
とりあえず送信出来る組合せが見つかりましたので原因は興味がありませんが、Net.Mail.SmtpClientは今のところSMTPS(ポート465)が使えないらしいです。

スクリプトの実行環境

プロダクト名
Windows 7 Professional
ビルド番号
7601.23934
Powershellバージョン
5.1.14409.1005
.NET Framework
.NET Framework 4.7

スポンサーリンク


コメント