我正在尝试使用新的MailKit / Mimekit,而不是Powershell中的发送邮件。我在Powershell画廊找到了Send-MailKitMessage 1.0.1
我的需求很简单,Powershell将只用于内部警报,因此我简化了代码以满足我的需要。
***using namespace MailKit
using namespace MimeKit
$emailDLL = "F:\Apps\Email\MailKit.dll"
$mimeDll = "F:\Apps\Email\MimeKit.dll"
Add-Type -Path $emailDLL
[System.Reflection.Assembly]::LoadFile($mimeDll)#扩展用于调用脚本的类(MimeKit程序集首先从清单文件加载,因此在此模块加载时可用)类MailboxAddressExtended : MailboxAddress {#不允许无参数构造MailboxAddressExtended(string$Name,string $Address ):base($Name,$Address){ string$Name,#可以是空字符串$Address#不能为空}}
class InternetAddressListExtended : InternetAddressList {}
$List = New-Object InternetAddressListExtended # of type MimeKit.InternetAddress
$smtpClient = New-Object MailKit.Net.Smtp.SmtpClient
$message = [MimeKit.MimeMessage]::new()
$TextPart = [MimeKit.TextPart]::new("html")
#endregion
[string[]]$recipients = "email@testdomain.com".Split(',').Trim()
$from = "Dev_Test@testdomain.com"
$smtpSvr = '190.132.148.22'
$smtpPort = 25
function sendEmail ($subjectline,$msgbody) {
$message.From.Add($from)
foreach ($address in $recipients) {$List.Add($address)}
$message.To.AddRange($List)
$TextPart.Text = $msgbody
$message.Body = $TextPart
$message.Subject = $subjectline
if(!$smtpClient.IsConnected) {
$smtpClient.Connect($smtpSvr)
}
if ($smtpClient.IsConnected) {
$smtpClient.Send($message)
$smtpClient.Disconnect($true)
}***
}当我在PS1脚本中运行上述代码时,会得到一个错误:
找不到MailboxAddress类型
我可以在Powershell窗口中手动输入相同的代码,它可以正常工作。我使用了PS5 v5.1,PS7 v7.1,我得到了同样的错误。我使用了上述代码,因为它允许我向多个个人/组发送电子邮件。虽然Powershell相对较新,但我能够处理前面的所有问题,从而得到上面的代码。
我非常感谢所能提供的任何指导。
发布于 2021-03-03 21:47:01
Send-MailKitMessage是一个应该安装的通讯模块。遵循这里[MailboxAddress] ( [MimeKit.MailboxAddress] )这样的类型需要从DLL文件中加载,但是如果您只使用PSM1文件,则没有DLL从其中加载。nupkg文件,使用7zip解压缩,然后尝试使用以下方式:Import-Module -Name 'C:\...\send-mailkitmessage.3.1.0\Send-MailKitMessage.psd1'或者像这样:
[System.Reflection.Assembly]::LoadFile('C:\...\send-mailkitmessage.3.1.0\Libraries\BouncyCastle.Crypto.dll')
[System.Reflection.Assembly]::LoadFile('C:\...\send-mailkitmessage.3.1.0\Libraries\MailKit.dll')
[System.Reflection.Assembly]::LoadFile('C:\...\send-mailkitmessage.3.1.0\Libraries\MimeKit.dll')
Import-Module -Name 'C:\...\send-mailkitmessage.3.1.0\Send-MailKitMessage.psm1'发布于 2021-03-05 15:12:24
虽然我在尝试合并发送邮件时取得了一些进展,但我仍然遇到了意想不到的错误。我决定回到基础,因为我的需求是基本的,我只是发送内部警报电子邮件。我创建了这个测试PS1文件:
using namespace MailKit
using namespace MimeKit
$emailDLL = "F:\Apps\Email\MailKit.dll"
$mimeDll = "F:\Apps\Email\MimeKit.dll"
Add-Type -Path $emailDLL
[System.Reflection.Assembly]::LoadFile($mimeDll)
[System.Reflection.Assembly]::LoadFile($emailDLL)
class MailboxAddressExtended : MailboxAddress { #does not allow parameterless construction
MailboxAddressExtended([string]$Name, [string]$Address ) : base($Name, $Address) {
[string]$Name, #can be null
[string]$Address #cannot be null
}
}
class InternetAddressListExtended : InternetAddressList {}
$List = New-Object InternetAddressListExtended # of type MimeKit.InternetAddress
$message = [MimeKit.MimeMessage]::new()
$TextPart = [MimeKit.TextPart]::new("html")
[string[]]$recipients = "name@company.net".Split(',').Trim()
$from = "Dev_Mailkit@company.net"
$smtpSvr = 'xxx.xxx.xxx.xxx'
$smtpPort = 25
$message.From.Add($from)
foreach ($address in $recipients) {$List.Add($address)}
$message.To.AddRange($List)
$smtpClient = New-Object MailKit.Net.Smtp.SmtpClient
$TextPart.Text = "Mailkit Test 30000"
$message.Body = $TextPart
$message.Subject = "Another Test"
if(!$smtpClient.IsConnected) {
$smtpClient.Connect($smtpSvr)
}
if ($smtpClient.IsConnected) {
$smtpClient.Send($message)
$smtpClient.Disconnect($true)
}```
@filimonic I greatly appreciate the feedback, which is how I was able to overcome my initial obstacles.https://stackoverflow.com/questions/66465059
复制相似问题