2012-11-06 41 views
0

我剛剛嘗試製作c#控制檯程序。我們的想法是製作一個小型的自包含應用程序,它將檢查數據庫並通過電子郵件向一羣用戶發送一個列表,例如每天早上它會自動運行。從c#控制檯應用程序發送郵件在服務器中生成winsock錯誤10054

我還沒有到目前爲止,只是試圖讓現在的基礎第一。通過在線查看教程,我已經能夠連接到數據庫並在控制檯中顯示一個列表。然而,發送郵件不太成功。

如果我在while循環中包含發送郵件的代碼,它會生成一堆單個郵件,所以出於某種原因可以工作。但那不是我想要的。我希望列表運行並編譯一個將成爲消息正文的列表。在那部分程序運行後,我想發送郵件。問題是它不起作用,當我查看服務器日誌時,SMTP會話已打開,但終止並說套接字錯誤發送對數據的響應下一行說Winsock錯誤10045並且會話終止。

任何想法爲什麼發生這種情況?真的是沒有意義的,我的事情是,它的工作原理,如果while循環中運行...

這裏是整個程序,因爲它目前爲:

namespace SendMails 
{ 
class ConnectToMySQL 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     string connStr = createConnstr("192.168.111.1","database","login","passwd"); 

     MySqlConnection conn = null; 
     MySqlDataReader reader = null; 

     try 
     { 
      conn = new MySqlConnection(connStr); 
      conn.Open(); 

      string stm = "SELECT id, name, surname FROM Kat WHERE Contact = 'Yes' AND Contactwhen <= '"+ DateTime.Today + "'"; 
      MySqlCommand cmd = new MySqlCommand(stm, conn); 
      reader = cmd.ExecuteReader(); 

      //The actual output on the screen. 
      while (reader.Read()) 
      { 
       Console.WriteLine(reader.GetInt32(0) + ": " + reader.GetString(1) + " " + reader.GetString(2));      
      } 

     } 
     catch (MySqlException ex) 
     { 
      Console.WriteLine("Error: {0}", ex.ToString()); 

     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 

     createMail("[email protected]", "[email protected]", "Test message", "Here is your test message."); 

    } 

    //This builds a mysql connection string 
    public static string createConnstr(string server, string databaseName, string user, string passw) 
    { 
     //build connection string 
     string connStr = "server=" + server + ";database=" + databaseName + ";uid=" + user + ";password=" + passw + ";"; 

     //return connection string 
     return connStr; 
    } 

    //This sends an email 
    static void createMail(string recipient, string from, string subject, string msg) 
    { 
     System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(); 
     message.To.Add(recipient); 
     message.Subject = subject; 
     message.From = new System.Net.Mail.MailAddress(from); 
     message.Body = msg; 
     System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("192.168.111.1"); 
     try 
     { 
      Console.WriteLine("Sending mail..."); 
      smtp.Send(message); 
      Console.WriteLine("Mail was sent successfully!"); 
     } 
     catch (Exception ep) 
     { 
      Console.WriteLine("failed to send mail:"); 
      Console.WriteLine(ep.Message); 
     } 
    } 

} 

}

+0

是在此「192.168.111.1」上配置的郵件服務器。 – Pranav

+0

這個錯誤說:操作不受支持。 _所引用對象的類型不支持所嘗試的操作。通常,這發生在文件描述符引用不支持此操作的文件或套接字時,例如試圖接受數據報套接字上的連接。_ – Pranav

+0

您是否在IIS中配置SMTP虛擬服務器?如果是,你需要添加如下:client.Credentials = CredentialCache.DefaultNetworkCredentials;如果否,請參閱下面的鏈接:http://msdn.microsoft.com/en-us/library/8b83ac7t(v=vs.85).aspx –

回答

0

問題現在已經解決了。解決方案令人尷尬地微不足道。

僅需添加smtp.Dispose();後行smtp.Send(message);

+0

我難住到這個帖子尋找與使用.NET 2的舊應用程序非常相同的錯誤信息;此解決方案僅適用於.NET 4以上,因爲[dispose方法](http://msdn.microsoft.com/en-us/library/System.Net.Mail.SmtpClient_methods%28v=vs.90%29.aspx )在早期版本中不可用。有關更多信息,請參閱[post](https://connect.microsoft.com/VisualStudio/feedbackdetail/view/465515/connection-is-closed-by-the-smtpclient-without-sending-a-quit-command)在微軟連接框架的這種行爲。 – Paolo

相關問題