[英]DllImport fails on windows XP SP3 but works on windows 7
[英]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.