サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

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もウイルスの温床というレッテルを貼られてしまうので、そうはさせなかったのでしょう。


投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog