web-dev-qa-db-ja.com

「トランスポート接続からデータを読み取れません:net_io_connectionclosed。」 -Windows Vista BusinessおよびSMTP

Windows Vista Businessで.NETコードからの電子メール送信をテストできません。

SSISパッケージが証明されたら、それをSSISパッケージに移行するコードを書いています。コードは、受信者のリストにエラーメッセージを電子メールで送信することです。

コードは以下のとおりですが、コードを実行すると例外が発生します。

メーリングを行うための簡単なクラスを作成しました...デザインが改善される可能性があります。より堅牢な機能、メソッドなどを実装する前に機能をテストしています。

namespace LabDemos
{
    class Program
    {
        static void Main(string[] args)
        {
            Mailer m = new Mailer();
            m.test();    
        }
    }
}

namespace LabDemos
{
    class MyMailer
    {    
        List<string> _to = new List<string>();
        List<string> _cc = new List<string>();
        List<string> _bcc = new List<string>();
        String _msgFrom = "";
        String _msgSubject = "";
        String _msgBody = "";            

        public void test(){
        //create the mail message
        MailMessage mail = new MailMessage();

        //set the addresses
        mail.From = new MailAddress("[email protected]");            

        //set the content
        mail.Subject = "This is an email";
        mail.Body = "this is a sample body";
        mail.IsBodyHtml = false;    

        //send the message
        SmtpClient smtp = new SmtpClient();
        smtp.Host = "emailservername";
        smtp.Port = 25;
        smtp.UseDefaultCredentials = true;
        smtp.Send(mail);            
    }
}

例外メッセージ

Inner Exception
{"Unable to read data from the transport connection: net_io_connectionclosed."}

Stack Trace
"   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n   at System.Net.Mail.SmtpConnection.GetConnection(String Host, Int32 port)\r\n   at System.Net.Mail.SmtpTransport.GetConnection(String Host, Int32 port)\r\n   at System.Net.Mail.SmtpClient.GetConnection()\r\n   at System.Net.Mail.SmtpClient.Send(MailMessage message)"


Outer Exception
  System.Net.Mail.SmtpException was unhandled
  Message="Failure sending mail."
  Source="System"
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
       at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40
       at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.IOException
       Message="Unable to read data from the transport connection: net_io_connectionclosed."
       Source="System"
       StackTrace:
            at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
            at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
            at System.Net.Mail.SmtpConnection.GetConnection(String Host, Int32 port)
            at System.Net.Mail.SmtpTransport.GetConnection(String Host, Int32 port)
            at System.Net.Mail.SmtpClient.GetConnection()
            at System.Net.Mail.SmtpClient.Send(MailMessage message)
       InnerException: 
37
John DaCosta

この問題を引き起こす可能性のあるものがいくつかありますが、ここで私が見つけたものをいくつか紹介します。質問:「Exchange」と言いますが、これはExchangeサーバーですか?ホストは認証を必要としますか(クライアントに認証を追加する必要があるかもしれません)?最初にやろうとするのは、ホスト名ではなく静的IPアドレスにホストを割り当てて、それが最初に機能するかどうかを確認することです。表示される場合は、おそらくDNSマッピングの問題です。

仮想化を使用してExchangeサーバーを実行している場合、物理ホスティングサーバー名またはIPではなく、仮想サーバーのホストIPにSmtpClientを構成する必要があります。 [既定のSMTP仮想サーバー]を右クリックして[プロパティ]を選択し、[アクセス]タブに移動して[リレー]をクリックし、SMTP要求をSMTPサーバーに送信するコンピューターのIPアドレスを追加します。 (ASP.netサイト)

これが機能しない場合は、サーバーがSMTPパケットの送信をブロックしているためです。 SMTPメッセージを送信するボックスをSMTPサーバーに必ず追加する必要があります。これは、IISの認証タブを介して行われます。

また、メールクライアントを破棄するか、「using」ステートメントでクライアントを使用する必要があることを指摘したいと思います。これにより、「QUIT」がサーバーに確実に送信され、接続が正常に閉じられます。

using(SmtpClient smtp = new SmtpClient())
{
    smtp.Host = "emailservername";
    smtp.Port = 25;
    smtp.UseDefaultCredentials = true;
    smtp.Send(mail)
}
16
Joe Fairchild

IISを再起動します。すべてを再起動するために、これはばかげているように聞こえます。 (そして古いスレッドにぶつかってすみません)。しかし、時々再起動するIISは魔法のように動作します。まったく同じ問題に直面し、再起動すると解決しました。

一時的に「localhost」という名前を解決できなかったことが原因である可能性があります。私はここに投稿しているので、今直面している人がさらに調査を試みる前にこの簡単な修正を試してみるでしょう。それが役に立てば幸い

7
JohnSM

IIS 7でlocalhost(Use Localhost)を使用している場合は、localhostまたは127.0.0.1ではなく、マシンのIPアドレスに変更します

また、以下のリンクに従って、メールサーバーリレーを適宜更新してください。

メールボックスは利用できません。サーバーの応答は:5.7.1 [email protected]の中継ができませんでした

6
Sujit Senapati

SMTPサービスの設定でIPアドレスを指定した場合は、IIS7内でマシンのIPアドレスを指定し、localhostを指定しないようにしてください。

IIS7では「localhost」を簡単に選択できますが、たとえばIPが10.0.0.1の場合、このエラーが発生します

6
Simon_Weaver

VistaおよびWindows 7にはSMTPサーバーがありません。この機能はWindows XPから削除されたため、SMTPサーバーを明示的にセットアップする必要があります。いくつかのツールが市販されています。また、SMTPを構成したら、電子メールの送信に使用するサーバー名を必ず確認してください。

3
Joy

サーバー(仮想サーバー)に複数のIPがあり、ホストがlocalhostを指している間に、SMTP仮想サーバーが1つの特定のIPに割り当てられているため、同じ問題が発生しました。

 <smtp deliveryMethod="Network">
       <network Host="localhost" port="25" defaultCredentials="false"/>
 </smtp>

これには2つの解決策があります:

  1. コードを変更し、HostをlocalhostではなくSMTP Virtual Serverが使用している特定のIPに設定します。
  2. SMTP仮想サーバーIPをすべて未割り当てに変更します

SMTP仮想サーバーのIPを表示/変更するには:[既定のSMTP仮想サーバー]を右クリックして、[プロパティ]を選択し、[全般]タブでIPアドレスを変更/表示します。

これが同じ問題で誰かの一日を救うことを願っています。

2
Amir Chatrbahr

.NET Framework v4.5を使用してWindowsサービスアプリケーションをVBで開発しましたが、最近この問題に遭遇しました。

まず、少しの背景-Disposeメソッドを呼び出すことで解決されたエラー「サービスが利用できません。送信チャネルを閉じます。サーバーの応答は次のとおりです。各電子メールが送信された後のSmtpClientオブジェクト。非常に安全にするために、MailMessageオブジェクトでDisposeを呼び出しました。

さて、「1セッションでメッセージが多すぎる」という問題は解決されましたが、「トランスポート接続からデータを読み取れません:net_io_connectionclosed」エラーが発生することがありました。驚くばかり。電子メールクラスを一貫して実装していなかったことが判明しました。あるインスタンスでは破棄されていましたが、別のインスタンスではそうではありませんでした。

私にとって両方の問題を解決した例は次のとおりです(VBですが、あなたはアイデアを得ています):

With New clsEmail(True)
    With .Message
        .To.Add("[email protected]")
        .Subject = msgSubject
        .Body = msgContents
    End With

    .Server.Send(.Message)
    .Server.Dispose()
    .Message.Dispose()
End With

私の電子メールクラスには、特に、メッセージ(System.Net.Mail.MailMessage)とサーバー(System.Net.Mail.SmtpClient)の2つのプロパティがあります。これらはこの例で破棄されます。

私のサービスで電子メールを送信するすべてのインスタンスがこのように実装された後、何百もの電子メールが送信された後、単一の問題は発生していません。

1
Joshua Barker

あなたのコードは不完全ですダッシュはそれを識別するのに正しいです。それ以外の場合は、smtpコンポーネントがインストールされているかどうかをチェックします link text

1
Kamran Shahid

私は最後の6時間にこの問題に直面していますが、私はその上に新しいので、次の方法でこの問題を解決しようとしています

1)コマンドプロンプトを開きました(たとえば、Ctrl + Rでcmdと入力して入力します)。
2)SMTPサーバーのpingを確認し、応答を確認します。
3)応答があった場合は問題ありません。次のステップ4に進むと、別の賢明なsmtp名が間違っています。
4)次に、telnet smtpポート(例:25)が開いているかどうかを確認します。
5)このcmdを使用して、SMTP応答を確認します。
6) telnet "yoursmtpname" "portno" (例:telnet smtp.gmail.com 25)
7)telnetが機能しない場合は、コントロールパネルからインストールするか、新しい機能を追加してください。
8)正常に機能している場合、合格結果は次のようになります。
9)220 mx.google.com ESMTP.

上記の手順を使用して、SMTP接続の準備ができているか、メールを送信できないかを確認できます。

1
Amol Shiledar

Vista Business OSにはIIS SMTPが付属していません。これはパズルの欠けている部分だと思います。この問題に幸運はありましたか?

1
John DaCosta

.NET 4.0にアップグレードし、すべてのセキュリティ更新プログラムを適用する

0
rus