Программа, которая отправляет уведомление по электронной почте, если URL не работает - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь написать программу такого типа, как указано в вопросе.Я с треском провалился и после неудачи на MSDN или Google я спрашиваю умные умы StackOverflow.Мой код ниже для тех, кто заинтересован в его чтении.

Я бы хотел, чтобы при запуске эта программа прочитала URL-адрес и проверила, активна ли она и работает ли она правильно.Если это не так, и я получаю плохой ответ, отправляется электронное письмо, уведомляющее кого-то о том, что сайт не работает.

Я пишу это Visual Studio 2010 с C # и 3.5net.Программа считывает информацию (URL-адреса и адреса электронной почты) из моей базы данных из SQL Server 2008, база данных будет обновляться информацией, основанной на чтении сайтов по HttpResponse (OK или NOTOK).Если веб-сайт NOTOK, то отправляется электронное письмо.Я использую библиотеку прямых ссылок для XOUlitities.Email.

Основная проблема в том, что она не работает, и я понятия не имею, почему.Он выходит и читает сайт и возвращается, но я не получаю письмо.У меня вопрос, есть ли более простой способ для функции электронной почты?Могу ли я просто написать всю команду внутри программы без использования DLL XOUtilities?Я в основном ищу совет.Когда я запускаю .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 ]

2 голосов
/ 05 января 2012

Я никогда не использовал 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 голос
/ 05 января 2012

Вы можете проверить другой статус. например. если статус успешен, тогда ничего не делайте, в противном случае отправьте электронное письмо.

вы можете настроить хост по умолчанию, порт и адрес из файла конфигурации, а затем добавить smtpclient для отправки сообщения

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

Вы также можете столкнуться с OOM (нехватка памяти) в зависимости от количества записей, возвращаемых из базы данных. Я бы рекомендовал перебирать программу чтения данных, а не загружать данные.

и, наконец, вы захотите избавиться от объектов, реализующих IDisposable. StreamReader и SqlConnection / Command являются наиболее очевидными.

1 голос
/ 05 января 2012

Вам не нравится пространство имен System.Net.Mail и использование MailMessage? Затем вы используете SmtpClient и отправляете его (все из удобств вашей собственной среды .NET)

Кстати, я бы выложил примеры, но у msdn есть несколько хороших.

...