SMTP sendasync работает в Windows 7, но не работает в XP - PullRequest
1 голос
/ 02 августа 2011

Я борюсь с сообщением об ошибке, которое я получаю при отправке отдельных eamils ​​из нашего собственного приложения на C # через smtp. Он отлично работает в Windows 7, но мы получаем следующее сообщение об ошибке на наших компьютерах с XP. Мы используем нашу почтовую учетную запись Google и почтовый сервер Google smtp.gmail.com для доставки. Брандмауэры отключены, а McAfee отключен на неисправных компьютерах. сообщение об ошибке клиентскому приложению:

Error occurred when sending mail to xxxxxx@xxxxxxx.com 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 # является многопоточным, поэтому мы можем обновить пользовательский интерфейс с результатами отправки почты. У меня есть почтовый класс, содержащий эти два метода для установки и отправки сообщения.

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

        SmtpClient client = new SmtpClient("smtp.gmail.com", 587)   
           {
               Credentials = new NetworkCredential("xxxxxxxxx@xxxxxxx.com", "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("xxxx@xxxxxxx.com", "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();
        }

    }

Эти три следующих метода находятся в winform.

    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();

    }

в форме я заявляю следующее для обновляющего делегата

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

Я попытался использовать только IP-адрес для сервера smtp, попытался отключить ssl в сообщении, убедившись, что все брандмауэры отключены, все антивирусные программы отключены. Я установил smtp для IIS на локальном компьютере с XP, но поскольку я не использую его в качестве сервера, это не имело смысла и не решило проблему.

Как я уже говорил, код работает в Win7, но не в XP. Есть мысли?

1 Ответ

0 голосов
/ 04 августа 2011

Нашим решением было просто обновить компьютеры с Windows XP до Windows 7. Должно быть изменение уровня ОС в способе отправки сообщений smtp между этими двумя версиями Windows в отношении разрешений.В Win7 работает без нареканий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...