このページでは 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 |
次の例では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")
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 : リモート サーバーに接続できません。"と表示される場合はそもそもメールサーバに到着していません。途中の経路でブロックされていないかなど確認してください。
[戻る]