.net - System.net.mail.SmtpClient 无法从具有 NTLM 身份验证的服务器发送邮件
问题描述
.Net Core 版本:3.1 服务器:Linux(Ubuntu 18.04 LTS)
问题
我们的用例是使用 SMTP 服务器向客户发送电子邮件。此 SMTP 服务器配置了 NTLM 作为身份验证机制。当我们在 .NetCore 中使用默认的“System.net.mail.SmtpClient”包时,它甚至无法创建成功的连接。因此,使用 .NetCore 构建的 Linux 服务器上的电子邮件发送失败。
代码片段
我们尝试了以下代码片段来发送邮件:
SmtpClient client = new SmtpClient();
client.Port = smtp.Port;
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Credentials = new NetworkCredential(smtp.Login, smtp.Password);
client.Host = smtp.Server;
client.EnableSsl = smtp.EnableSSL;
mail.Body = builder.ToString();
client.Send(mail);
错误
“GSSAPI 操作失败并出现错误 - 请求了不受支持的机制。NTLM 身份验证需要 GSSAPI 插件“gss-ntlmssp”。因此我们在运行构建的 linux 服务器上安装了包“gss-ntlmssp”,但它仍然给出错误.
最新错误
System.ComponentModel.Win32Exception (0x80090020):GSSAPI 操作失败并出现错误 - 提供的名称无效(名称为空)。
有人可以建议解决此问题的正确方法或解决此问题的任何方法吗?
解决方案
我发现了同样的错误并通过将“System.net.mail.SmtpClient”替换为“MailKit.Net.Smtp”来解决它。包链接 - https://www.nuget.org/packages/MailKit/
你可以试试下面的代码
var message = new MimeMessage();
message.From.Add(MailboxAddress.Parse(emailConfiguration.EmailCredential.UserName));
message.To.Add(MailboxAddress.Parse(appUser.Email));
message.Subject = isReset ? emailConfiguration.EmailTemplete.ResetPasswordEmailSubject : emailConfiguration.EmailTemplete.SetPasswordEmailSubject;
message.Body = new TextPart(TextFormat.Plain) { Text = body };
SmtpClient smtp = new SmtpClient();
smtp.Connect(emailConfiguration.EmailCredential.Host, emailConfiguration.EmailCredential.Port, SecureSocketOptions.StartTls);
smtp.Authenticate(emailConfiguration.EmailCredential.UserName, emailConfiguration.EmailCredential.Password);
try
{
smtp.Send(message);
}
catch (Exception ex)
{
// Console.Write(ex);
}
finally
{
smtp.Disconnect(true);
}
推荐阅读
- php - Composer 依赖冲突(带有包的项目)
- javascript - 如何解决将 select 的值传递给服务器的问题?
- c# - 在使用对象时从一种实现类型转换为另一种实现类型是否可以?
- c++ - OpenGL C++(制作简单窗口时抛出错误)
- java - 如何从android studio中的另一个包扩展类-java
- r - 查找模式并过滤起始位置
- transloadit - 估计 Transloadit 装配持续时间
- java - 不明白哪个数据类型是 name.gettext().tostring()
- python - 如果启用了张量相等,如何解决错误变量是不可散列的。相反,使用 tensor.experimental_ref() 作为键
- ruby-on-rails - 为什么我在 Rails 应用程序中的时间字段也显示日期?