2012-01-09 3 views
0

Я пытаюсь создать систему для отправки бюллетеней с моего сайта.Как получить сообщение о том, что почта была отправлена ​​через SmtpClient C#

Я создаю его как консольное приложение, которое затем я буду выполнять ежедневно из планировщика окон.

Я хочу, чтобы некоторые системы регистрировались в системе, поэтому я добавляю самую простую функцию журнала.

Письма отправляются штрафом, но я бы хотел написать в журнале, когда отправляется почта. Проблема в том, что я не знаю, как получить событие из SmtpClient, когда почта была отправлена ​​или почта не была отправлена.

public void SendMails(List<Agent> agents, string logfilename) 
{ 
    foreach (Agent agent in agents) 
    { 
     MailMessage mail = new MailMessage(); 
     mail..... 

     SmtpClient client = new SmtpClient(); 
     client..... 

     try 
     { 
      client.Send(mail); 
      WriteLog(logfilename, "Sent mail to: " + mail.To[0].Address); 
     } 
     catch (SmtpException smtpexception) 
     { 
      WriteLog(logfilename, "SMTP EXCEPTION: " + smtpexception.Message); 
     } 
     catch (Exception e) 
     { 
      WriteLog(logfilename, "EXCEPTION: " + e.Message); 
     } 
    } 
} 

public void WriteLog(string filename, string message) 
{ 
    TextWriter tw = new StreamWriter(@"c:\MailLogs\" + filename + ".txt"); 
    tw.WriteLine(message); 
    tw.Close(); 
} 

Итак, как изменить код, так что я могу написать журнал после того, как программа на самом деле знает, была ли отправлена ​​почта или нет ...

ответ

1

если выполнить линию client.Send(mail);, которая не является async, и он не выбрасывает исключение, это означает, что почта была отправлена.

Вне зависимости от того, поставляется ли оно или нет, вы не сможете видеть, как это обрабатывается вашим SMTP-сервером, и насколько я знаю, SmtpClient не поддерживает это событие.

+0

Да, но почта будет помещена в очередь на сервере smtp, и программа завершится до того, как будут исключены какие-либо исключения, поскольку исключения задерживаются. Я попробовал тестирование с несколькими адресами, и все письма были отправлены, но не все строки журнала были написаны. – Jesper

+0

Я не вижу, как все строки журнала не были написаны, потому что единственный способ, которым строка журнала «Отправленные письма к:» не будет выполняться, - это если выбрано исключение, а затем почта не должна отправляться. Возможно, вы используете несколько потоков, и ошибка возникает в методе WriteLog? Попробуйте записать его в консоль/debug вместо файла и посмотреть, выводит ли он все письма. –

+0

Если я добавляю Console.ReadLine() в конце основного метода и просто позволяю ему сидеть и ждать. Все строки написаны. Если нет, кажется, что некоторые из последних журналов не написаны, хотя письма отправляются ... Это все. – Jesper

0

SmtpClient sc = новый SmtpClient();

sc.SendCompleted + = новый SendCompletedEventHandler (SendAsyncCallback);

0

Ваш код сам делает это сейчас. Если WriteLog() пишет Sent Email to..., это означает, что письмо было отправлено другим.