求助:如何使用MailKit从自有网站域名发送邮件(附代码配置)
问题排查与修复方案
核心问题点
- SSL连接参数错误:端口465要求SSL加密连接,原代码中
ConnectAsync的第三个参数传false会导致连接失败。 - 变量名大小写不匹配:代码中存在
email_message/email_Message、fileBytes/filebytes这类大小写不一致的变量,会引发编译或运行错误。 - 未配置发件人显示名称:配置中的
DisplayName未被使用,发件人信息不完整。
修正后的代码
SendAsync方法修正
private async Task SendAsync(MimeMessage mailMessage) { using (var client = new SmtpClient()) { try { // 465端口使用SSL加密连接 await client.ConnectAsync(_mailSettings.Host, _mailSettings.Port, SecureSocketOptions.SslOnConnect); client.AuthenticationMechanisms.Remove("XOAUTH2"); await client.AuthenticateAsync(_mailSettings.UserName, _mailSettings.Password); await client.SendAsync(mailMessage); } catch (Exception error) { Console.WriteLine(error.Message); throw; } finally { await client.DisconnectAsync(true); client.Dispose(); } } }
CreateEmailMessage方法修正
private MimeMessage CreateEmailMessage(Message message) { var emailMessage = new MimeMessage(); // 使用配置中的DisplayName和UserName构建发件人 emailMessage.From.Add(new MailboxAddress(_mailSettings.DisplayName, _mailSettings.UserName)); emailMessage.To.AddRange(message.To); emailMessage.Subject = message.Subject; var bodyBuilder = new BodyBuilder { HtmlBody = message.Content }; if (message.Attachments != null && message.Attachments.Count > 0) { byte[] fileBytes; foreach (var attachment in message.Attachments) { using (var ms = new MemoryStream()) { attachment.CopyTo(ms); fileBytes = ms.ToArray(); } // 修正变量名大小写:fileBytes而非filebytes bodyBuilder.Attachments.Add(attachment.Filename, fileBytes, ContentType.Parse(attachment.ContentType)); } } emailMessage.Body = bodyBuilder.ToMessageBody(); return emailMessage; }
额外检查项
- 确认SMTP服务可用性:联系域名托管商,确认
sigmaworldco.com的SMTP服务已开启,且允许从你的服务器IP访问。 - 端口与加密方式匹配:
- 465端口对应SSL加密(
SecureSocketOptions.SslOnConnect) - 587端口对应STARTTLS加密(
SecureSocketOptions.StartTls)
- 465端口对应SSL加密(
- 验证账号密码:确保
info@sigmaworldco.com的密码正确,部分托管商可能要求使用应用专用密码而非邮箱登录密码。 - 域名MX记录配置:确认域名的MX记录已正确指向托管商的邮件服务器,否则收件方可能无法接收邮件。
内容的提问来源于stack exchange,提问作者Mohaned Ghawar
相关产品推荐
相关产品推荐

