web-dev-qa-db-ja.com

コンソールアプリケーションから電子メールを送信しているときにソケット例外が発生した原因は何ですか?

メールを送信する基本的なコンソールアプリを作成しようとしています。問題は、Socket例外が発生し続けることです。

アクセス許可xxx.xxx.x.xxx:25で禁止されている方法でソケットにアクセスしようとしました。

Windowsファイアウォールをオフにしましたが、何も変更されませんでした。資格情報を指定して、または指定せずに実行しようとしました。また、ポート25と資格情報を使用してsmtp.mail.yahoo.comを含むさまざまなSMTPサーバーを使用しようとしましたが、うまくいきませんでした。この例外の原因となる問題は何ですか?

私はWindows7でVS2008を実行しています。以下は私のコードサンプルと私が得る例外です。

static void Main(string[] args)
{
        String recipient = "[email protected]";
        String sender = "[email protected]";

        MailMessage message = new MailMessage();
        message.From = new MailAddress(sender);
        message.To.Add(new MailAddress(recipient));
        message.Subject = "Subject";
        message.Body = "Body";

        SmtpClient smtp = new SmtpClient
        {
            Host = "smtp.server",
            Port = 25,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            //UseDefaultCredentials = false,
            //Credentials = new NetworkCredential("validemail", "validpassword"),                
            Timeout = 3000
        };

        try
        {
            smtp.Send(message);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

そして私が得た例外:

System.Net.Mail.SmtpException: Failure sending mail. ---> 
System.Net.WebException: Unable to connect to the remote server --->
System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions xxx.xxx.x.xxx:25
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state,
IAsyncResult asyncResult, Int32 timeout, Exception& exception)
   --- End of inner exception stack trace ---
   at System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket
6, Int32 timeout)
   at System.Net.PooledStream.Activate(Object owningObject, Boolean async, Int32 timeout, GeneralAsyncDelegate asyncCallback)
   at System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
   at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   at System.Net.Mail.SmtpConnection.GetConnection(String Host, Int32 port)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at ...Program.Main(String[] args) in ...\Program.cs:line xxx
10
anetafr

私はかつて非常によく似た状況にあり、アンチウイルスがそのポートをブロックしていることが判明しました。可能なオプションは次のとおりです。 http://social.msdn.Microsoft.com/Forums/br/transactsql/thread/c083c2c6-f74e-42cd-a811-4329ff7aa5f1

17
Mariusz.W

ポート25は有効で利用可能ですか?たとえば このスレッド は、別のサービスが排他的にアクセスできる可能性があることを説明しています。

このコードを別のマシン(セキュリティが低い)で試しましたか?修正の一部としてそれを意味するのではなく、コード自体が問題ないことを確認するためだけです。

0

ポートを割り当てないか、EnableSSL = trueを使用しないでください。これの1つを行うことはあなたの問題を解決します。

この方法で行うことが許可されていない通信を開始しようとしています。

0
Murtuza Kabul

EnableSslで遊んでみてください。 msdnの例外の理由:

EnableSslはtrueに設定されていますが、SMTPメールサーバーはEHLOコマンドへの応答でSTARTTLSをアドバタイズしませんでした。

例外のStatusCodeも確認してください。

0
Andrew