背景:
尝试在Win10上使用Powershell发送电子邮件,并希望使用端口587和TLS 1.2与SMTP服务器通信。
尝试使用Nuget Gallery包:MailKit及其依赖项MimeKit,因为考虑到安全问题,Microsoft不建议使用System.Net.Mail.SmtpClient。
使用Powershell Install-Package cmdlet安装MailKit(这似乎有效),然后对MimeKit也是如此,但MimeKit包安装失败(正如您所看到的,异常字符串对依赖循环的确切性质没有特别帮助):
PS C:binps1renew_certs> Install-Package -Name 'MimeKit' -Source "https://www.nuget.org/api/v2" -Force
Install-Package : Dependency loop detected for package 'MimeKit'.
At line:1 char:1
+ Install-Package -Name 'MimeKit' -Source "https://www.nuget.org/api/v2 ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : Deadlock detected: (MimeKit:String) [Install-Package], Exception
+ FullyQualifiedErrorId :
DependencyLoopDetected,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage
PS C:binps1renew_certs> ($error[0].Exception.GetBaseException())
Dependency loop detected for package 'MimeKit'.
这里关于依赖循环异常的另一个答案建议在Install-Package cmdlet上使用-SkipDependency参数,这样就避免了安装异常。
我继续尝试运行我的代码,但这导致了一个异常(与这个问题的异常非常相似),在这种情况下,
PS C:binps1renew_certs> ($error[0].Exception.GetBaseException())
结果字符串指示无法加载的文件或程序集是Portable.BouncyCastle包,该包被标识为MimeKit的依赖项。
因此,我使用了Portable.BouncyCastle的安装包(我没有使用-SkipDependencies,所以我认为它们已经安装),然后在代码中也使用了Add-Type来加载DLL。
这似乎阻止了BouncyCastle相关的例外情况;然而,现在运行代码会产生一个异常,这就是我问题的主题:
代码:
Add-Type -Path "C:Program FilesPackageManagementNuGetPackagesSystem.Text.Encoding.CodePages.6.0.0libnetstandard2.0System.Text.Encoding.CodePages.dll"
Add-Type -Path "C:Program FilesPackageManagementNuGetPackagesPortable.BouncyCastle.1.9.0libnetstandard2.0BouncyCastle.Crypto.dll"
Add-Type -Path "C:Program FilesPackageManagementNuGetPackagesMimeKit.3.3.0libnetstandard2.0MimeKit.dll"
Add-Type -Path "C:Program FilesPackageManagementNuGetPackagesMailKit.3.3.0libnetstandard2.0MailKit.dll"
$SMTP = New-Object MailKit.Net.Smtp.SmtpClient
$Message = New-Object MimeKit.MimeMessage
<#
$TextPart = [MimeKit.TextPart]::new("plain")
$TextPart.Text = "There was a deployment"
<#
例外:
PS C:binps1renew_certs> . "c:binps1renew_certssend_email.ps1"
New-Object : Exception calling ".ctor" with "0" argument(s): "The type initializer for 'MimeKit.ParserOptions' threw an exception."
At C:binps1renew_certssend_email.ps1:9 char:13
+ $Message = New-Object MimeKit.MimeMessage
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
PS C:binps1renew_certs> ($error[0].Exception.GetBaseException())
Could not load file or assembly 'System.Text.Encoding.CodePages, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its
dependencies. The system cannot find the file specified.
PS C:binps1renew_certs>
System.Text.Encoding.CodePages被列为MimeKit的依赖项,所以我试图解决类似于BouncyCastle的情况,但System.Text.Eccoding.CodePage的安装也因依赖项循环而失败。所以,我确实安装了-SkipDependencies标志,并在代码中显式添加了带有AddType的DLL;然而,仍然是同样的例外。
MimeKit中指出的System.Text.Encoding.CodePages的依赖项为(>=4.5.1),安装的是System.Text.Encoding.CodePages.6.0.0目录。异常错误字符串表示无法加载的文件或程序集版本为4.1.1.0,但我在库中没有看到任何4.1.*版本。
我想知道它是否是System.Text.Encoding.CodePages的依赖项,然后我试图安装System.Memory包,但它也因依赖项循环错误而失败,看着它的依赖项选项卡,我不知所措。
是否有任何方法可以查看依赖循环错误发生的确切原因,或者实际缺少哪些文件?
这个问题可能完全是另一回事吗?
异常字符串表示";系统找不到指定的文件"是否可以查看未找到的确切文件路径?
当我在VS Code中运行Powershell调试器时,异常被抛出到[MimeKit.TextPart]::new("plain")。无论如何都要调试到DLL中?
您需要的恰恰是System.Text.Encoding.CodePages v4.5.1(6.0.0破坏了兼容性)。
你可能仍然有错误,因为你使用了-SkipDependencies,所以谁知道你还缺少什么。