簡體   English   中英

SMTP sendasync在Windows 7中有效,但在XP中失敗

[英]SMTP sendasync works in Windows 7 but fails in XP

通過smtp從我們內部的C#應用​​程序發送單個eamil時,我正收到一條錯誤消息,我很掙扎。 它在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;

我嘗試只為smtp服務器使用IP地址,嘗試禁用消息中的ssl,確保禁用所有防火牆,禁用所有病毒軟件。 我在本地XP計算機上為IIS安裝了smtp,但是由於我沒有將它用作服務器,所以這沒有任何意義,也無法解決問題。

正如我指出的那樣,該代碼在Win7中有效,但在XP中無效。 有什么想法嗎?

我們的解決方案只是將Windows XP計算機升級到Windows7。就權限而言,在這兩個Windows版本之間發送smtp消息的方式必須進行操作系統級別的更改。 它在Win7中完美運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM