Windows メール送信をバッチファイルで行う

このページでは Windows 環境においてバッチファイルあるいはPowershell スクリプトによりメールを送信するサンプルプログラムを紹介します。
次の2通りの方法を紹介します。

シンプルなメール送信

基本的なサンプルプログラムを紹介します。これはメールサーバがローカルアドレス(127.0.0.1) の場合です。送信時の認証は行いません。ポート番号もデフォルトの25番です。セキュリティの観点から現状ではこのようなSMTPサーバは存在しないでしょう。

【SendMail.ps1】

#
############### メール送信サンプルプログラム by Powershell #################

Powershell でメールを送信する Powershell のサンプルプログラムです。
WindowsではデフォルトでPowershelが使用できるのでこのサンプルは動作するはずです。
#>

$From = "test@example.com"
$Reply = "test@example.com"
$SMTPServer = "10.0.0.1"
$Port = 25
$UserName = ""
$Password = ""
$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
$SMTPClient.EnableSsl=$false
$SMTPClient.Credentials=New-Object Net.NetworkCredential($UserName , $Password)

# メール本文作成 ========================================================

$To = "postmaster@testdomain.local"
$Subject = "タイトル"
$body = "本文"

# メール送信 ========================================================

$Mail=New-Object Net.Mail.MailMessage($From,$To,$Subject,$body)
$SMTPClient.Send($Mail)

コマンドプロンプトから実行する場合は次のように実行します。

C:\>powershell .\SendMail.ps1

権限エラー "このシステムではスクリプトの実行が無効になっているため、ファイル SendMail.ps1 を読み込むことができません"が発生する場合は以下コマンドを実行する

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

もし SMTP 認証が必須に設定されている場合は次のエラーが発生します。この場合はSMTP 認証の処理も必要です。(次のサンプルです)

 "1" 個の引数を指定して "Send" を呼び出し中に例外が発生しました: "メールを送信できませんでした。"
発生場所 C:\temp\SendMail.ps1:29 文字:1
+ $SMTPClient.Send($Mail)
+ ~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SmtpException

SMTP認証を行い送信する

次の例ではCredentials にユーザ名とパスワードを設定することにより SMTP 認証を行っています。

 <#
############### メール送信サンプルプログラム by Powershell #################
#>


$From = "test@achme.com"
$Reply = "test@achme.com"
$SMTPServer = "10.0.0.1"
$Port = 25
$User = "authuser"
$Pass = "password"
$SMTPClient=New-Object Net.Mail.SmtpClient($SMTPServer,$Port)
$SMTPClient.EnableSsl=$false
$SMTPClient.Credentials=New-Object Net.NetworkCredential($User,$Pass)

# メール本文作成 ========================================================

$To = "postmaster@testdomain.local"
$Cc = ""
$Bcc = ""
$Subject = "タイトル"
$Textbody = "本文"
$AddAttachment = ""

# メール送信 ========================================================

$Mail=New-Object Net.Mail.MailMessage($From,$To,$Subject,$body)
#$Mail.Cc.Add($Cc)
#$Mail.Bcc.Add($Bcc)
#$Attachment=New-Object Net.Mail.Attachment($AddAttachment)
#$Mail.Attachments.Add($Attachment)
$SMTPClient.Send($Mail)

認証に失敗した場合は次のエラーが発生します。

 "1" 個の引数を指定して "Send" を呼び出し中に例外が発生しました: "認証に失敗しました。"
発生場所 C:\temp\SendMail.ps1:35 文字:1

ファイルを添付する

メールにファイルを添付する場合は、次の行を修正します。

$Mail.Attachments.Add("c:\temp\test.txt")

1行で修正する

Send-MailMessage コマンドレットによりメールを送信することが可能です。

$p = @{
From = "tester@example.com"
To = "postmaster@testdomain.local"
Subject = "タイトル"
Attachments = @("C:\temp\test1.txt","C:\temp\test2.txt","C:\temp\test1.bmp")
BCC = "user1@testdomain.local"
CC = "user2@testdomain.local"
Body = "本文"
BodyAsHTML = $False
Credential = Get-Credential
DeliveryNotificationOption = "onSuccess"
Priority = "High"
Encoding = "UTF8"
Port = "25"
SmtpServer = "192.168.11.15"
UseSSL = $False
}

# Notice: Splatting requires @ instead of $ in front of variable name
Send-MailMessage @p

"Send-MailMessage : リモート サーバーに接続できません。"と表示される場合はそもそもメールサーバに到着していません。途中の経路でブロックされていないかなど確認してください。

[戻る]