本地正常的SMTP邮件代码部署服务器后报Socket权限错误求助
本地运行正常的MimeKit邮件发送代码,部署到服务器后抛出以下异常:
System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 139.162.44.23:587
对应的代码如下:
var email = new MimeMessage(); email.From.Add(new MailboxAddress("CMPL", "superuser@cmplin.com")); email.To.Add(new MailboxAddress("", cu.Email.ToString())); email.Cc.Add(new MailboxAddress("", "digitalhealth@cmplin.com")); email.Bcc.Add(new MailboxAddress("", "devcmpl@gmail.com")); email.Subject = "Thank you for contacting M/s Chowgule Mediconsult"; string Body = string.Format("Dear {0}. Thank you for submitting your request to M/s Chowgule Mediconsult Pvt. Ltd. We have received the same. Our team will contact you in 2 working days. In case you have any further queries, please feel free to contact digitalhealth@cmplin.com. Regards, Team CMPL", cu.Name); email.Body = new TextPart(MimeKit.Text.TextFormat.Plain) { Text = Body }; using (var smtp = new MailKit.Net.Smtp.SmtpClient()) { smtp.Connect("inpro4.fcomet.com", 587, false); smtp.Authenticate("superuser@cmplin.com", "******"); smtp.Send(email); smtp.Disconnect(true); } return "succfull";
这个异常核心是服务器网络层面的Socket访问权限限制,按以下步骤排查:
检查防火墙/安全组规则
确认服务器本地防火墙(Windows防火墙/Linux iptables)和云服务商安全组,是否允许出站访问139.162.44.23的587端口,若没有则添加对应放行规则。验证网络连通性
在服务器上用命令测试端口连通性:# Windows PowerShell Test-NetConnection 139.162.44.23 -Port 587# Linux nc -zv 139.162.44.23 587测试失败则说明网络被拦截,联系管理员调整策略。
检查应用运行权限
若部署在IIS,尝试将应用池身份临时改为LocalSystem测试,确认是否是应用权限不足导致无法创建Socket连接;Linux环境需确认运行应用的用户无网络访问限制,排查SELinux等安全模块是否拦截。调整SMTP连接参数
代码中当前禁用了SSL,多数SMTP服务器的587端口要求STARTTLS加密,修改连接代码:smtp.Connect("inpro4.fcomet.com", 587, MailKit.Security.SecureSocketOptions.StartTls);也可尝试切换到465端口(SSL加密),对应参数改为
SecureSocketOptions.SslOnConnect。确认SMTP服务器限制
联系邮件服务商确认inpro4.fcomet.com是否正常服务,以及服务器公网IP是否被该SMTP服务器列入访问黑名单。
内容的提问来源于stack exchange,提问作者chandrashekhar naik

