2012-01-04 1 views
0

Я пытаюсь написать этот тип программы, как указано в вопросе. Я неудачно потерпел неудачу и, не повезло в msdn или google, я спрашиваю умных умов StackOverflow. Мой код ниже для тех, кто интересуется его чтением.Программа, которая отправляет уведомление по электронной почте, если url не работает

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

Im писать это визуальная студия 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; 
    } 
} 

}

+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 для создания сложных строк. SMTP для писем будет работать много лучше, на мой взгляд, какая версия .Net вы используете btw – MethodMan

ответ

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

1

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

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

1

вы можете захотеть, чтобы проверить другой статус. например. если статус «Успех» ничего не делает, иначе отправьте сообщение по электронной почте.

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

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

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

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

+0

Upvote для запоминания классов IDisposable. Это было мое первое наблюдение. –