The type initializer for 'MimeKit.ParserOptions' threw an exception
除了使用MimeKit的DkimSigner和MailKit的Smtp客户端外,我还使用现有的System.Net.Mail.MailMessage进行测试,并带有MimeKit的支持以直接转换为MimeMessage。
我正在获取"'MimeKit.ParserOptions'的类型初始值设定项引发异常"。在堆栈跟踪中提到"在MimeKit.MimeMessage.CreateFromMailMessage(MailMessage消息)"
还有一个内部例外情况:"'MimeKit.Utils.CharsetUtils'的类型初始值设定项引发了异常。" Stacktrace:'位于MimeKit.ParserOptions..cctor()的MimeKit.ParserOptions..ctor()
我的开发箱上没有任何异常,但仅执行直到转换并签名,而不是实际的smtp发送。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| Dim netMail As New System .Net.Mail.MailMessage
netMail .From = New System .Net.Mail.MailAddress("[email protected]")
netMail .To.Add(txtTo .Text)
netMail .Subject = txtSubject .Text
netMail .Body = txtContent .Text
Dim mimeMail As MimeMessage = CType(netMail, MimeMessage )
Dim headersToSign = New List (Of HeaderId )
headersToSign .Add(HeaderId .From)
headersToSign .Add(HeaderId .To)
headersToSign .Add(HeaderId .Subject)
headersToSign .Add(HeaderId .Date)
Dim privateKeyPath = AppDomain .CurrentDomain.BaseDirectory +"\\App_Data\
sa.private"
Dim signer = New Cryptography .DkimSigner(privateKeyPath, "lionandlambchurch.com", "key1")
Dim loggerPath = AppDomain .CurrentDomain.BaseDirectory +"\\logs\\smtp-mailkit.log"
mimeMail .Sign(signer, headersToSign, Cryptography .DkimCanonicalizationAlgorithm.Relaxed, Cryptography .DkimCanonicalizationAlgorithm.Simple)
' Don't attempt sending locally
If Request .Url.Host.ToLower().Contains("localhost") Then Return
Using client As New MailKit .Net.Smtp.SmtpClient(New ProtocolLogger (loggerPath ))
client .Connect("relay-hosting.secureserver.net", 25, False)
If chkAuthenticate .Checked Then
client .Authenticate("[email protected]", "****")
End If
client .Send(mimeMail )
client .Disconnect(True)
End Using |
- 看看这个github.com/jstedfast/MimeKit/blob/master/MimeKit/Utils/…
有同样的问题,我通过在Visual Studio中打开NuGet控制台并安装了最新的System.Text.Encoding.CodePages包来解决了此问题:
install-Package System.Text.Encoding.CodePages
基于异常,错误是在转换过程中发生的,不是发送错误。
由于某些原因,MimeKit.ParserOptions的静态构造函数失败,因为MimeKit.Utils.CharsetUtils的静态构造函数失败。
查看MimeKit的代码,我能想到的就是您的服务器不支持UTF-8或Latin1。
例如System.Text.Encoding.GetEncoding (65001, new EncoderExceptionFallback (), new DecoderExceptionFallback ());或Encoding.GetEncoding (28591, new EncoderExceptionFallback (), new DecoderExceptionFallback ());引发异常。
老实说,我什至不知道怎么可能。
您在服务器上使用什么.NET?
- 这是在哥达服务器上。使用.NET 4.5
-
您可以确认它不支持UTF8和/或Latin1吗?
-
我确认,他们的共享Windows托管仅支持UTF-8,不支持Latin1
-
您有可能获得Latin1支持吗?
-
我得到的回应是他们的Linux计划将支持Latin1,但不支持Windows计划,"没有添加方法"。
-
好的,一种可行的解决方法是使用PCL版本的MimeKit和MailKit,因为它们使用我的Portable.Text.Encoding库进行字符集转换,而不是系统编码。
-
我以前没有PCL的经验。您可以粗略为此所需的步骤吗?我确实在本地克隆了MimeKit存储库并打开了MimeKit.sln,但它无法打开三个项目,包括Android,CoreFX和iOS(我需要Xamirin吗?)。可移植项目将无法编译。我正在使用Visual Studio 2013社区版更新4。第一次尝试后,我刚刚安装了Microsoft.Net可移植库参考程序集。仍然没有建立。还是已经有编译的PCL版本可用?我的Web应用程序的构建还有哪些其他注意事项?
-
Xamarin是iOS和Android项目所必需的,是的,但是您可以禁用(或删除)那些项目。 CoreFX项目需要VS2015(也可以将其删除)。您遇到什么构建错误?
-
我安装了VS Comunity 2015,并且正在构建减去ios / android项目的东西。我从可移植项目的发行版本中获取MimeKit.dll和Portable.Text.Encoding.dll。我可以将它与已经从Nuget获得的MailKit.dll一起使用吗?没有在github上的MailKit存储库页面中看到可移植的内容,因此我不需要编译该存储库?
-
Ewww ....老实说,我不 MimeKit的PCL版本旨在与MailPhone的WindowsPhone版本一起使用(我忘记了我没有真正的PCL PC版本的MailKit),但是它也可以与.NET 4.5版本的MailKit一起使用,我只是尚未测试该配对。我唯一想到的潜在陷阱是,在这种情况下MimeKit使用Portable.Text.Encoding,而MailKit使用System.Text.Encoding,但这可能并不重要。
-
顺便说一句,请确保引用Portable.Text.Encoding.dll,因为PCL MimeKit.dll需要它。
-
由于您正在使用nuget,因此您可以编辑packages.config并添加以下内容:<package id="MimeKit" version="1.2.21" targetFramework="portable45-net45+win8+wp8" /> <package id="Portable.BouncyCastle" version="1.8.0" targetFramework="portable45-net45+win8+wp8" />
-
我开始怀疑这是否行得通……我忘了MailKit也使用BouncyCastle,它可能不喜欢PCL BouncyCastle:-\\\\
-
如果此PCL技巧不起作用,您能否确定System.Text.Encoding.GetEncoding (1252);是否起作用以及System.Text.Encoding.GetEncoding (20127);是否起作用?如果28591失败,也许我可以使用其中之一作为后备。
-
我已经在GitHub上修补了MimeKit,以尝试先回退到windows-1252然后回退到us-ascii,从而从系统上缺少iso-8859-1的支持中恢复过来。我很确定至少us-ascii是核心的一部分。但是,如果您可以测试上面列出的2种编码中的哪一种在您的系统上,那将是很好的,这样我可以确定我的假设是正确的。
-
我将测试这些编码并进行报告
-
System.Text.Encoding.GetEncoding(1252)有效,而System.Text.Encoding.GetEncoding(20127)有效
-
很好,谢谢!这表明我的解决方法应该可以为您解决问题。您可能可以只构建.NET 4.5版本的MimeKit,然后将MimeKit.dll放到您的项目中,而不是使用MimeKit nuget(唯一的更改是此变通方法)。
-
我还必须在GitHub上修补MailKit,因为它也希望iso-8859-1在那里,所以您也需要抓住它。下一个版本将具有这些修复程序。
-
使用补丁编译您的代码。对不起,我的错误记录器中仍然看到相同的异常。但是,我确实关闭了自定义异常,以完整查看ASP.NET红色屏幕。我的错误记录器显然只记录了两个异常级别。实际上,报告了三个例外。红色屏幕堆栈跟踪中的第三个也是第一个是
-
[VerificationException:操作可能会使运行时不稳定。 .Utils.CharsetUtils..cctor()516
-
这可能很有用:dotnet4hosting.asphostcentral.com/post/…
-
或这样:stackoverflow.com/questions/23683182/…