如果网址已关闭,则会发送电子邮件通知的程序

时间:2012-01-04 21:08:42

标签: c# .net visual-studio-2010 email httpresponse

我正在尝试编写问题中所述的此类程序。我悲惨地失败了,在msdn或google上没有运气之后,我问的是StackOverflow的聪明才智。对于那些有兴趣阅读它的人,我的代码如下。

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

我写的是带有C#和3.5net的visual studio 2010。该程序正在从SQL Server 2008的数据库中读取信息(URLS和电子邮件地址),数据库将根据每个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;
    }
}

}

3 个答案:

答案 0 :(得分:2)

我从未使用过XOUtilities,为什么不使用.NET中包含的库?只需确保您的项目有对System.Net的引用,然后您可以执行以下操作:

System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
message.To.Add("luckyperson@online.microsoft.com");
message.Subject = "This is the Subject line";
message.From = new System.Net.Mail.MailAddress("From@online.microsoft.com");
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

答案 1 :(得分:1)

您不喜欢System.Net.Mail命名空间并使用MailMessage?然后使用SmtpClient并将其发送出去(所有这些都来自您自己的.NET环境的舒适)

顺便说一下,我发布了一些例子,但msdn有一些好的。

答案 2 :(得分:1)

您可能想要检查其他状态。例如。如果状态为成功则不执行任何操作,否则发送电子邮件。

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

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

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

最后,您将要处理实现IDisposable的对象。 <{1}}和StreamReader / SqlConnection是最明显的。