2012-01-04 20 views
0

質問に記載されているこのタイプのプログラムを作成しようとしています。私は悲惨に失敗し、msdnやgoogleで運が無ければ私はStackOverflowの知性的な心を求めています。私のコードはそれを読むことに興味がある人のために以下にあります。URLがダウンした場合に電子メール通知を送信するプログラム

私はこのプログラムを実行しているときに、それがアクティブで正常に動作しているかどうかを確認するためにURLを読みたいと思います。そうでなければ、私は悪い返答を得て、誰かにそのウェブサイトがダウンしていることを知らせる電子メールが送信されます。

これは、C#と3.5netのVisual Studio 2010です。プログラムは、SQL Server 2008から自分のデータベースから情報(URLおよび電子メールアドレス)を読み取っています。データベースは、HttpResponse(OKまたはNOTOK)ごとに読み取ったサイトに基づいて情報を更新します。ウェブサイトがNOTOKの場合、電子メールが送信されます。私は、XOUlitities.Emailのダイレクトリンクライブラリを使用しています。

主な問題は、動作しないと私は理由がない理由です。それは外出し、ウェブサイトを読んで戻ってきますが、私は電子メールを受け取りません。 私の質問は、電子メール機能のための簡単な方法はありますか? XOUtilitiesのDLLを使わなくても、コマンド全体をプログラムの中に書くことはできますか?私は基本的にアドバイスを探しています。 .exeを実行すると、エラーは発生しませんが、問題は電子メール機能内で発生する可能性があります。誰かがこの問題に関してどんな光を放つことができれば、それは素晴らしいことでしょう。前もって感謝します!

using System; 
using System.Collections.Generic; 
using System.Text; 
using XOUtilities; 
using System.Web; 
using System.Net; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 
using System.IO; 

namespace WebsiteStatusCheck 
{ 
class Program 
{ 
    static string errorMsg; 

    static void Main(string[] args) 
    { 
     string connectionString = ConfigurationManager.AppSettings["ConnectionString"]; 
     string tableName = ConfigurationManager.AppSettings["WebsiteListTableName"]; 
     string mailServer = ConfigurationManager.AppSettings["MailServer"]; 
     string replyToEmail = ConfigurationManager.AppSettings["ReplyToEmail"]; 

     string query = "SELECT * FROM " + tableName; 
     SqlDataAdapter sDA = new SqlDataAdapter(query, connectionString); 
     DataTable table = new DataTable(); 
     sDA.Fill(table); 
     string[][] websites = new string[table.Rows.Count][]; 
     int i = 0; 
     table.Columns.Add("isSiteAlive"); 
     table.Columns.Add("isDBAlive"); 
     foreach (DataRow row in table.Rows) 
     { 
      string[] temp = CheckURL(row["URL"].ToString()); 
      row["isSiteAlive"] = temp[0]; 
      row["isDBAlive"] = temp[1]; 
     } 

     XOUtilities.Email email = new XOUtilities.Email(); 
     email.fromAddress = replyToEmail; 
     email.server = mailServer; 
     email.subject = "Website needs IMMEDIATE action"; 
     email.isHtml = true; 
     email.body = @"The following website looks to be down:<br /><br /><table><tr><th>URL</th><th>Website</th><th>Database</th>"; 
     foreach(DataRow row in table.Rows) 
     { 
      if (row["isSiteAlive"].ToString().Trim() != "OK" || row["isDBAlive"].ToString().Trim() != "OK") 
      { 
       string tempbody = email.body; 
       email.body += @"<tr><td><center>" + row["URL"].ToString() + @"</center></td><td><center>" + row["isSiteAlive"].ToString() + @"</center></td><td><center>" + row["isDBAlive"].ToString() + @"</center></td></tr>"; 
       email.toAddresses = row["EMAILS_CSV"].ToString().Split(new char[] { ',' }); 
       email.SendEmail(); 
       email.body = tempbody; 
      } 
     } 
    } 

    //string[0] = website value 
    //string[1] = database value 
    static string[] CheckURL(string url) 
    { 
     string[] ret = new string[2]; 
     try 
     { 
      WebClient client = new WebClient(); 
      Stream resp = client.OpenRead(url); 
      StreamReader reader = new StreamReader(resp); 
      string result = reader.ReadToEnd(); 
      ret[0] = "OK"; 
      ret[1] = result; 
     } 
     catch (WebException e) 
     { 
      errorMsg = e.Status.ToString(); 
      if (e.Status == WebExceptionStatus.ProtocolError) 
      { 
       errorMsg = ((HttpWebResponse)e.Response).StatusDescription; 
      } 
      ret[0] = errorMsg; 
      ret[1] = "unreachable"; 
     } 
     catch (Exception e) 
     { 
      errorMsg = e.Message; 
      ret[0] = errorMsg; 
      ret[1] = "unreachable"; 
     } 
     return ret; 
    } 
} 

}

+2

これまでデバッグに関して何を試しましたか?あなたはデバッガのコードを熟読しましたか?はいの場合は、すべての点が確実に機能するようになるまでデバッガコンソールウィンドウにエラーメッセージはありますか? – dgvid

+1

電子メールに['SmtpClient'](http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient%28v=VS.90%29.aspx)を使用していない理由パート? – Yahia

+0

このライブラリは、電子メールにjava libまたは.net libを送信するライブラリです。文字列の演算子オーバーロードを使用するC#コード内でも使用できます。StringBuilderを使用して複雑な文字列を作成することをお勧めします。私の意見では、どのバージョンの.NETがbtwを使用しているのですか? – MethodMan

答えて

1

あなたがSystem.Net.Mail名前空間とMailMessageを使用して好きではないのですか?次に、SmtpClientを使用して、それを送信してください(すべてあなたの.NET環境の快適さから)

私は例を投稿しますが、msdnには良いものがあります。

1

:このスニペットの

System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(); 
message.To.Add("[email protected]"); 
message.Subject = "This is the Subject line"; 
message.From = new System.Net.Mail.MailAddress("[email protected]"); 
message.Body = "This is the message body"; 
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("yoursmtphost"); 
smtp.Send(message); 

出典:念のプロジェクトがSystem.Netへの参照を持っていると、あなたはこのような何かを行うことができます。例えば。 StatusがSuccessの場合は何もせず、それ以外の場合はメールを送信します。

あなたはまたに応じて、(メモリ不足)OOMに遭遇するかもしれメッセージ

using(var email = new MailMessage {Subject = "", Body = ""}) 
{ 
    email.To.Add(recipient); 
    new SmtpClient().Send(email); 
} 

を送信するためにsmtpclientを設定ファイルからデフォルトのホスト、ポートおよびアドレスからを設定してから、新しいことができますデータベースから返されたレコードの数。データテーブルを読み込む代わりに、データリーダーを繰り返し処理することをお勧めします。

最後に、IDisposableを実装するオブジェクトを処分したいと思うでしょう。 StreamReaderおよびSqlConnection/Commandが最も明白である。

+0

IDisposableクラスを覚えておくためのUpvote。それは私の最初の観察でした。 –

関連する問題