web-dev-qa-db-ja.com

SMTPの使用中に「アクセス許可で禁止されている方法でソケットにアクセスしようとしました」

データベースの特定の値がしきい値を超えたときに、SMTPメールを送信しようとしています。

Windowsファイアウォールでポート25、587、および465を既に許可し、アンチウイルスで大量メールを防止するオプションを無効にしました。私が使用しているコードは以下のとおりです

using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

 MailMessage mailMsg = new MailMessage();
        mailMsg.To.Add("[email protected]");
        // From
        MailAddress mailAddress = new MailAddress("[email protected]");
        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

ここで他に何が欠けていますか?これらの特定のポートアドレスには、ファイアウォールの着信規則があります。

19
SPandya

ここでの意味を理解するのは非常に重要です。

465以上のSSLはSmtpClientではサポートされていないとドキュメントに記載されています。

メールホストでサポートされていない可能性のあるSTARTTLSを使用する以外に選択肢がないようです。ホストで465を超えるSSLの使用が必要な場合は、別のライブラリを使用する必要があります。

http://msdn.Microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl(v = vs.110).aspx から引用

SmtpClientクラスは、RFC 3207で定義されているトランスポート層セキュリティを介したセキュアSMTPのSMTPサービス拡張のみをサポートします。このモードでは、SMTPセッションは暗号化されていないチャネルで開始し、クライアントからサーバーにSTARTTLSコマンドが発行されて切り替えられますSSLを使用した安全な通信。詳細については、Internet Engineering Task Force(IETF)によって公開されているRFC 3207を参照してください。

別の接続方法では、プロトコルコマンドが送信される前にSSLセッションが事前に確立されます。この接続方法は、SMTP/SSL、SMTP over SSL、またはSMTPSと呼ばれることもあり、デフォルトではポート465を使用します。SSLを使用するこの代替接続方法は現在サポートされていません。

12
SlaterCodes

ファイアウォールがアウトバウンドトラフィックを許可しており、ウイルス対策ソフトウェアによってブロックされていないことを確認してください。

私は同じ問題を受け取り、犯人はウイルス対策ソフトウェアでした。

19
Glenn Ferrie

私はこのエラーを受け取りました:

System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions

ポートが別のプログラムによって使用されたの場合。

7
Tom Andraszek

Windowsファイアウォールがこのエラーを作成していました。 SMTPはポート587でGMAILに投稿しようとしました。ポート587を送信ルール[送信HTTP/SMTP/RDP]に追加すると、問題は解決しました。

3
Chris Sharp

同じ問題がありました。ローカルマシンでは正常に機能していましたが、サーバーに問題がありました。 SMTP設定を変更しました。それは私のためにうまく機能します。

GoDaddy Plesk Hostingを使用している場合は、次のSMTP詳細を使用します。

Host = relay-hosting.secureserver.net
Port = 25 
0
Sandeep Jepin