C# &引用;试图以其访问权限所禁止的方式访问套接字”;使用SMTP时
当数据库中的某些值超过其阈值时,我尝试发送SMTP电子邮件 我已经在Windows防火墙中允许了端口25587和465,并在防病毒软件中禁用了防止群发邮件的选项。下面给出了我正在使用的代码C# &引用;试图以其访问权限所禁止的方式访问套接字”;使用SMTP时,c#,asp.net,sockets,email,smtp,C#,Asp.net,Sockets,Email,Smtp,当数据库中的某些值超过其阈值时,我尝试发送SMTP电子邮件 我已经在Windows防火墙中允许了端口25587和465,并在防病毒软件中禁用了防止群发邮件的选项。下面给出了我正在使用的代码 using System.Net; using System.Net.Mail; using System.Net.Security; using System.Security.Cryptography.X509Certificates; MailMessage mailMsg = new MailMe
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
MailMessage mailMsg = new MailMessage();
mailMsg.To.Add("to@domain.com");
// From
MailAddress mailAddress = new MailAddress("from@domain.com");
mailMsg.From = mailAddress;
// Subject and Body
mailMsg.Subject = "MCAS Alert";
mailMsg.Body = "Parameter out of range";
SmtpClient smtpClient = new SmtpClient("smtp.servername.com", 25);
smtpClient.UseDefaultCredentials = false;
smtpClient.Timeout = 30000;
System.Net.NetworkCredential credentials =
new System.Net.NetworkCredential("username", "passwrod");
smtpClient.Credentials = credentials;
smtpClient.EnableSsl = true;
//ServicePointManager.ServerCertificateValidationCallback = delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
smtpClient.Send(mailMsg);
堆栈跟踪
[SocketException (0x271d): An attempt was made to access a socket in a way forbidden by its access permissions xx.xx.xx.xx:25]
System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) +208
System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception) +464
[WebException: Unable to connect to the remote server]
System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6) +6486360
System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback) +307
System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback) +19
System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout) +324
System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint) +141
System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint) +170
System.Net.Mail.SmtpClient.GetConnection() +44
System.Net.Mail.SmtpClient.Send(MailMessage message) +1554
[SmtpException: Failure sending mail.]
System.Net.Mail.SmtpClient.Send(MailMessage message) +1906
Admin_Alert.SMTPAuth() in c:\Users\spandya\Documents\Visual Studio 2012\WebSites\WebSite3\Admin\Alert.aspx.cs:61
Admin_Alert.Page_Load(Object sender, EventArgs e) in c:\Users\spandya\Documents\Visual Studio 2012\WebSites\WebSite3\Admin\Alert.aspx.cs:22
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +51
System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +772
我还缺少什么?防火墙入站规则适用于这些特定端口地址。请确认您的防火墙允许出站流量,并且您没有被防病毒软件阻止
我收到了同样的问题,罪魁祸首是防病毒软件 好的,认识到这里的含义非常重要 文档称SmtpClient不支持通过465的SSL 似乎您别无选择,只能使用您的邮件主机可能不支持的STARTTLS。如果您的主机需要使用SSL over 465,则可能必须使用其他库 引自 SmtpClient类仅支持用于RFC 3207中定义的传输层安全SMTP的SMTP服务扩展。在此模式下,SMTP会话在未加密的通道上开始,然后客户端向服务器发出STARTTLS命令,以切换到使用SSL的安全通信。更多信息,请参见互联网工程任务组(IETF)发布的RFC 3207
另一种连接方法是在发送任何协议命令之前预先建立SSL会话。此连接方法有时称为SMTP/SSL、SSL上的SMTP或SMTPS,默认情况下使用端口465。当前不支持使用SSL的此备用连接方法。Windows防火墙为我创建了此错误。SMTP试图在587端口发送到GMAIL。将端口587添加到出站规则[Outbound HTTP/SMTP/RDP]解决了此问题。我遇到了以下错误:
System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions
当另一个程序使用端口时,我遇到了同样的问题。它在本地机器上工作正常,但在服务器上出现问题。我已更改SMTP设置。这对我来说很好 如果您使用的是GoDaddy Plesk主机,请使用以下SMTP详细信息
Host = relay-hosting.secureserver.net
Port = 25
如果其他答案不起作用,您可以检查是否有其他人正在使用netstat的端口:
netstat-ano | findstr
如果没有任何内容正在使用该端口,则可能会排除该端口,请尝试此命令以查看该范围是否被其他内容阻止:
netsh interface ipv4 show excludedportrange protocol=tcp
执行此操作如果您使用的是GoDaddy,我使用的是Lets Encrypt SSL,如果您需要,您可以获得它
下面是代码-该代码在asp.net core 2.0中,但应在以上版本中工作
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MailKit.Net.Smtp;
using MimeKit;
namespace UnityAssets.Website.Services
{
public class EmailSender : IEmailSender
{
public async Task SendEmailAsync(string toEmailAddress, string subject, string htmlMessage)
{
var email = new MimeMessage();
email.From.Add(new MailboxAddress("Application Name", "applicationId@gmail.com"));
email.To.Add(new MailboxAddress(toEmailAddress, toEmailAddress));
email.Subject = subject;
var body = new BodyBuilder
{
HtmlBody = htmlMessage
};
email.Body = body.ToMessageBody();
using (var client = new SmtpClient())
{
//provider specific settings
await client.ConnectAsync("smtp.gmail.com", 465, true).ConfigureAwait(false);
await client.AuthenticateAsync("youremailid@gmail.com", "sketchunity").ConfigureAwait(false);
await client.SendAsync(email).ConfigureAwait(false);
await client.DisconnectAsync(true).ConfigureAwait(false);
}
}
}
}
错误是来自发送计算机还是接收计算机?检查堆栈跟踪的编辑是否尝试从相关计算机远程登录到此端口以确保路由已打开?类似于
telnet smtp.mydomain.com 25的内容
mainSocketException(0x271d)
是为端口块抛出的,因此您可以检查netstat-anb |查找“25”
在该服务器上或telnet smtp.servername.com 25
从远程检查该端口是否在smtp服务器上打开?我尝试了telnet,但它说无法连接到端口25上的主机。我目标的端口是25。我正在尝试使用outlook中的电子邮件而不是gmail发送邮件。@SPandya您不能使用outlook“发送邮件”。Outlook是一个邮件客户端。您需要一个出站SMTP网关。在大多数情况下(与企业一样),outlook正在连接到Microsoft Exchange服务器,该服务器是您将使用的SMTP网关。许多ISP不允许居民用户推送SMTP邮件(因为僵尸网络和受感染的垃圾邮件计算机),我不是从Outlook发送。我是从该组织提供的SMTP邮件服务器执行此操作的,请确保您了解SmtpClient类在SSL方面的限制。我已在windows防火墙的入站和出站上允许了目标端口25。我已禁用了防病毒和防火墙。异常的堆栈跟踪是否已更改?这对于通过Plesk解决我的电子邮件问题非常有用。我的本地测试使用主机smtpout.secureserver.com工作,但当站点在Plesk上运行时,不断抛出错误。检查排除的端口范围是我的窍门。无法判断我的应用程序的默认配置使用了排除的范围,错误也没有以任何方式表明这一点。