Excelからメール送信(PowerShell+.Netライブラリ)
2024-01-16 記載
概要 : PowerShell+.Netライブラリの威力を試すためExcelからメール送信してみます
Keyword : PowerShell, WshShell, System.Net.Mail.SmtpClient, sendmail, VBA, Excel
VBScriptは廃止予定ですが、その代替と目されているPowerShell+.Netライブラリがあれば、ほぼなんでもできるでしょうと期待されています。
VBScript+COMでも、ほぼなんでもできたわけですが、初期設定で動いてしまうのがウイルスの温床になってしまった、という反省から、PowerShellは初期設定では動かないようになっているそうです。
「期待されています」と書きましたが未来の話ではなく、ずっと昔からいつでも使えていたのです。
では試してみます。
Excelからメール送信。
これは普通、Outlook.Applicationに任せるのがOffice流。
.Netライブラリでは、メールを受信して読んで、というようなメーラー的な処理まではできないけど、送信だけならsendmailするようにサクっとできるそうです。
Public Sub SendMail(ByVal sTo As String, ByVal sSubject As String, ByVal sBody As String)
Dim wsh As New IWshRuntimeLibrary.WshShell 'CreateObject("WScript.Shell")
Dim sCmd As String
sCmd = "powershell.exe -command " & Chr(34) & "& { "
sCmd = sCmd & "[reflection.assembly]::loadwithpartialname('System.Net.Mail.SmtpClient')"
sCmd = sCmd & "; $from = '<送信元メールアドレス>'"
sCmd = sCmd & "; $smtpclient = New-Object System.Net.Mail.SmtpClient('smtp.gmail.com', 587)"
sCmd = sCmd & "; $smtpclient.EnableSsl = $true"
sCmd = sCmd & "; $smtpclient.Credentials = New-Object System.Net.NetworkCredential($from, '<app-password>')"
sCmd = sCmd & "; $smtpclient.Send($from, '%TO%', '%SUBJECT%', '%BODY%')"
sCmd = sCmd & " }" & Chr(34)
sCmd = Replace(sCmd, "%TO%", sTo)
sCmd = Replace(sCmd, "%SUBJECT%", sSubject)
sCmd = Replace(sCmd, "%BODY%", sBody)
wsh.Run sCmd, 0 ' 0=Window非表示
End Sub
GMailでアプリパスワード取得済みのケース。
宛先1件のみ、でテスト用です。
実際、サクっと送れました。14行で。
14行って多いですけど(^^;
でも圧縮したら4行です。
そこよりも『結局WshShell使ってるの?』という点がナンですけど。
New IWshRuntimeLibrary.WshShell
するように
PowerShellオブジェクトを作れたらスマートなのですが、そうするとWshShellを通してPowerShellもウイルスの温床というレッテルを貼られてしまうので、そうはさせなかったのでしょう。