2012-01-04 112 views
0

我试图按照问题中所述编写这种类型的程序。我失败了,在msdn或google没有运气之后,我正在问StackOverflow的智慧。我的代码低于那些有兴趣阅读它的人。如果url关闭,发送电子邮件通知的程序

我希望这个程序在执行时能够读取一个URL,看它是否处于活动状态并正常工作。如果不是,并且我的回复不好,则会发送电子邮件通知某人该网站已关闭。

我写这是visual studio 2010与C#和3.5net。该程序正在从我的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 2012-01-04 21:12:59

+1

您没有使用['SmtpClient'](http://msdn.microsoft.com/zh-cn/library/system.net.mail.smtpclient%28v=VS.90%29.aspx)用于电子邮件的任何原因部分? – Yahia 2012-01-04 21:13:22

+0

是这个库发送电子邮件Java库或.NET网络库..也在你的C#代码中,你正在使用操作符重载的字符串..我建议使用StringBuilder来构建复杂的字符串..电子邮件的SMTP将工作多更好地在我看来什么版本的.Net你使用btw – MethodMan 2012-01-04 21:14:29

回答

2

我从来没有使用XOUtilities,为什么不使用.NET中包含的库?只要确保你的项目有System.Net的引用,那么你可以做这样的事情:

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

来源这个片段的: http://social.msdn.microsoft.com/Forums/en/netfxnetcom/thread/a75533eb-131b-4ff3-a3b2-b6df87c25cc8

+0

是啊我不知道为什么我会尝试从另一个.net项目包括一个库,我应该完全按照你说的去做。 Tyvm。 – javasocute 2012-01-04 22:31:47

1

你不喜欢的System.Net.Mail命名空间和使用MailMessage?然后你使用SmtpClient并发送它(所有从你自己的.NET环境的舒适)

顺便说一句,我会发布的例子,但msdn有一些很好的。

1

你可能要检查是否有不同的状态。例如。如果状态是成功,则不做任何事,否则发送电子邮件。

您可以配置默认的主机,端口和地址从配置文件,然后新建立一个smtpclient发送消息

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

你也可能会碰到OOM取决于(内存不足)从数据库返回的记录数。我建议迭代数据阅读器而不是加载数据表。

最后,你会想要处理实施IDisposable的对象。 StreamReaderSqlConnection/Command是最明显的。

+0

Upvote用于记住IDisposable类。这是我第一次观察。 – 2012-01-04 21:28:20

相关问题