2011-08-01 20 views
1

smtpを使用して社内のC#アプリケーションから個々のeamilsを送信するときに表示されるエラーメッセージに苦労しています。 Windows 7では正常に動作しますが、XPマシンでは次のエラーメッセージが表示されます。 Googleでは、GoogleのメールアカウントとGoogleのsmtp.gmail.comメールサーバーを使用して配信しています。ファイアウォールはオフになり、障害の発生したマシンでMcAfeeが無効になります。バッククライアントアプリケーションにエラーメッセージは次のとおりです。SMTP sendasyncはWindows 7では動作しますが、XPでは失敗します

Error occurred when sending mail to [email protected] System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. ---> System.Net.Sockets.SocketException: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied 
    at System.Net.Sockets.Socket.BeginReceive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, AsyncCallback callback, Object state) 
    at System.Net.Sockets.NetworkStream.BeginRead(Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state) 
    --- End of inner exception stack trace --- 
    at System.Net.Mail.SmtpConnection.ConnectAndHandshakeAsyncResult.End(IAsyncResult result) 
    at System.Net.Mail.SmtpClient.ConnectCallback(IAsyncResult result) 
    --- End of inner exception stack trace --- 

当社のC#コードは、私たちはメール送信の結果とユーザーインターフェースを更新することができますマルチスレッド化されています。私はこれらの2つのメソッドを含むメーラー・クラスを用意して、メッセージをセットアップして送信します。

public void Send() 
    { 
     m_frmAccess.Invoke(m_frmAccess.UpdateDelegate, 
     new Object[] { "" }); 

     SmtpClient client = new SmtpClient("smtp.gmail.com", 587) 
      { 
       Credentials = new NetworkCredential("[email protected]", "xxxxxxxxx"), 
       EnableSsl = true 
      }; 

     try 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.Append("Message Body"); 
      LinkedResource logo = new LinkedResource("DA-NewBrand-Stack-100px-for.jpg"); 
      logo.ContentId = "companylogo"; 
      htmlView.LinkedResources.Add(logo); 
      m_Errormessage = ""; 
      MailAddress to = new MailAddress(m_To); 
      MailAddress from = new MailAddress(m_From, "Company"); 
      MailAddress cc = new MailAddress("[email protected]", "Name"); 
      MailMessage message = new MailMessage(from, to); 
      message.CC.Add(cc); 
      message.AlternateViews.Add(htmlView); 
      message.IsBodyHtml = true; 
      message.BodyEncoding = System.Text.Encoding.UTF8; 
      message.Subject = m_Subject; 
      client.Timeout = 10000; 
      message.SubjectEncoding = System.Text.Encoding.UTF8; 
      object userState = message; 
      client.SendCompleted += new SendCompletedEventHandler(SmtpClient_OnCompleted); 
      client.SendAsync(message, userState); 

     } 
     catch (Exception ex) 
     { 
      m_Errormessage = ""; 
      m_Errormessage = ex.Message + Environment.NewLine + ex.StackTrace.ToString() + Environment.NewLine +    ex.InnerException + Environment.NewLine; 
      m_frmAccess.Invoke(m_frmAccess.UpdateDelegate, 
      new Object[] { m_Errormessage }); 
     } 

    } 



    public void SmtpClient_OnCompleted(object sender, AsyncCompletedEventArgs e) 
    { 
     //Get the Original MailMessage object 
     m_result = ""; 
     MailMessage mail = (MailMessage)e.UserState; 


     //write out the subject 
     string subject = mail.Subject; 
     try 
     { 
      if (e.Cancelled) 
      { 
       m_result = "Send canceled for message to " + mail.To.ToString(); 
      } 
      if (e.Error != null) 
      { 
       m_result = "Error occurred when sending mail to " + mail.To.ToString() + " " + e.Error.ToString(); 
      } 
      else 
      { 
       m_result = "Message to " + mail.To.ToString() + " was sent."; 
      } 
      m_frmAccess.Invoke(m_frmAccess.UpdateDelegate, 
        new Object[] { m_result }); 

     } 
     catch (Exception ex) 
     { 
      m_result = ex.Message + ex.InnerException.ToString(); 
     } 

    } 

これらの3つの方法はwinformにあります。私はすべてのファイアウォールがあることを確認すること、メッセージでSSLを無効にしようとした、SMTPサーバのIPアドレスだけを使用してみましたが更新デリゲート

public delegate void UpdateTextCallback(string text); 
    public UpdateTextCallback UpdateDelegate; 

ために次のことを宣言する形で

public void UpdateText(string message) 
    { 
     txtMessage.Text = message; 

    } 

    private void ThreadMethod() 
    { 
     clsSmtpEmailer smtpMailer = new clsSmtpEmailer(this); 
     CollectDataToEmail(smtpMailer); 
     smtpMailer.Send(); 
    } 

    private void btnSendEmail_Click(object sender, EventArgs e) 
    { 

     myThread = new Thread(new ThreadStart(ThreadMethod)); 
     myThread.Start(); 

    } 

無効にすると、すべてのウィルスソフトウェアが無効になります。ローカルXPマシンにIIS用のsmtpをインストールしましたが、サーバーとして使用していないので、それは意味をなさないし、問題を解決しませんでした。

私が指摘したように、コードはWin7では動作しますが、XPでは動作しません。何かご意見は?

+0

Windows XPサービスパックが2であると仮定しますか? – rene

+0

は、Windows XPドメインに参加していますか?許可?それはWindows 7上で上昇していますか? pingは機能しますか? – rene

答えて

0

私たちのソリューションは、Windows XPマシンをWindows 7にアップグレードすることでした。アクセス許可に関して、これら2つのバージョンのWindows間でsmtpメッセージが送信される方法にOSレベルの変更が必要です。それはWin7で完璧に動作します。

関連する問題