首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell和MailKit -脚本失败

Powershell和MailKit -脚本失败
EN

Stack Overflow用户
提问于 2021-03-03 21:18:28
回答 2查看 1.3K关注 0票数 2

我正在尝试使用新的MailKit / Mimekit,而不是Powershell中的发送邮件。我在Powershell画廊找到了Send-MailKitMessage 1.0.1

我的需求很简单,Powershell将只用于内部警报,因此我简化了代码以满足我的需要。

代码语言:javascript
运行
复制
    ***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#不能为空}}

代码语言:javascript
运行
复制
        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相对较新,但我能够处理前面的所有问题,从而得到上面的代码。

我非常感谢所能提供的任何指导。

EN

回答 2

Stack Overflow用户

发布于 2021-03-03 21:47:01

  1. Send-MailKitMessage是一个应该安装的通讯模块。遵循这里
  2. [MailboxAddress] ( [MimeKit.MailboxAddress] )这样的类型需要从DLL文件中加载,但是如果您只使用PSM1文件,则没有DLL从其中加载。
  3. 目前版本为3.1.0 ( 2021-03-04)
  4. 它(v3.1.0)只在PowerShell 7+上工作,因为它使用的是三元算子 whick PSv7。我认为可以很容易地将它移植回PSv5,但这需要测试。
  5. 如果不想安装模块,请下载nupkg文件,使用7zip解压缩,然后尝试使用以下方式:
代码语言:javascript
运行
复制
Import-Module -Name 'C:\...\send-mailkitmessage.3.1.0\Send-MailKitMessage.psd1'

或者像这样:

代码语言:javascript
运行
复制
[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'
票数 3
EN

Stack Overflow用户

发布于 2021-03-05 15:12:24

虽然我在尝试合并发送邮件时取得了一些进展,但我仍然遇到了意想不到的错误。我决定回到基础,因为我的需求是基本的,我只是发送内部警报电子邮件。我创建了这个测试PS1文件:

代码语言:javascript
运行
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66465059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档