You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Debian 10服务器上C#程序SMTP发送邮件失败求助

解决Debian 10上C#程序发送邮件时kernel32.dll缺失的问题

你遇到的问题本质是EASendMail包依赖Windows专属的系统库(kernel32.dll),而这个库在Linux环境下完全不存在,所以.NET Core运行时无法加载它,导致发送邮件环节报错。下面给你两个可行的解决方案:

方案一:改用跨平台的SMTP库(推荐)

最稳妥的方式是替换为完全支持跨平台的邮件库,比如MailKit(搭配MimeKit处理邮件内容),这两个库是.NET生态中跨平台邮件发送的标准选择,在Windows、Linux、macOS上都能正常工作。

步骤1:安装NuGet包

在你的项目中安装MailKit和MimeKit:

dotnet add package MailKit
dotnet add package MimeKit

步骤2:替换原有代码

把你原来的EASendMail代码替换为以下跨平台实现,逻辑和你的原代码完全对应:

using MailKit.Net.Smtp;
using MimeKit;

// 创建邮件内容
var message = new MimeMessage();
message.From.Add(new MailboxAddress("发送者名称", fromEmail));
message.To.Add(new MailboxAddress("接收者名称", toEmail));
message.Subject = "Subject";
message.Body = new TextPart("plain")
{
    Text = "Body"
};

// 配置SMTP服务器
using (var client = new SmtpClient())
{
    // 连接服务器,注意根据Exchange配置调整是否启用SSL
    // 如果Exchange要求SSL,使用SecureSocketOptions.Auto或SecureSocketOptions.SslOnConnect
    await client.ConnectAsync(exchange, 25, SecureSocketOptions.None);
    
    // 如果服务器需要认证
    await client.AuthenticateAsync(email, pass);
    
    Console.WriteLine("start to send email ...");
    await client.SendAsync(message);
    await client.DisconnectAsync(true);
    Console.WriteLine("email was sent successfully!");
}

注意:如果你的Exchange服务器要求SSL加密,需要把SecureSocketOptions.None改为SecureSocketOptions.Auto,并可能调整端口为587(STARTTLS)或者465(SSL直连),具体根据你的Exchange服务器配置来定。

方案二:检查EASendMail的跨平台支持

如果你坚持要使用EASendMail,需要确认你使用的版本是否支持.NET Core/.NET 5+的跨平台运行。有些旧版本的EASendMail是专门针对.NET Framework(Windows-only)开发的,没有适配Linux。你可以查看EASendMail的官方文档,确认是否有针对.NET Core的版本,或者是否提供了Linux兼容的二进制文件。不过这个方案的不确定性较高,因为很多Windows专属的库很难在Linux上兼容。

关于System.Net.Mail的补充

你提到System.Net.Mail也无法正常工作,大概率不是平台依赖的问题,而是配置问题:比如Exchange服务器是否要求SSL、端口是否正确、认证方式是否匹配等。如果改用MailKit后仍有问题,可以检查服务器的SMTP配置(比如是否开启了匿名访问、是否需要NTLM认证等),MailKit对各种认证方式的支持更完善。

内容的提问来源于stack exchange,提问作者Timebreaker900

火山引擎 最新活动