2012-04-10 5 views
0

전자 메일 설정 클래스를 통해 전자 메일 본문에있는 항목 목록을 채우려고합니다. Outlook에서 전자 메일을 열려고 할 때 항목 목록이 필요한 항목을 볼 수 있습니다. - 신체되는 마지막 항목의 결과전자 메일 본문에 항목 목록 채우기

public class EmailSetup 
{ 
    string toEmailSetup = string.Empty; 
    string fromEmailSetup = string.Empty; 
    string domainName = string.Empty; 
    string emailServer = string.Empty; 

    public void ApplicationFailedEmailSetup(List<string>ApplicationsInactive,DateTime dateRun) 
    { 
     toEmailSetup = ConfigurationManager.AppSettings["To mailid"]; 
     fromEmailSetup = ConfigurationManager.AppSettings["From mailid"]; 
     domainName = ConfigurationManager.AppSettings["Domain Name"]; 
     emailServer = ConfigurationManager.AppSettings["Email Server"]; 
     try 
     { 
      var messager = new MailMessage(); 
      messager.To.Add(toEmailSetup); 
      messager.Subject = "Applications Crashed/Closed"; 
      messager.From = new MailAddress(fromEmailSetup); 
      try 
      { 
       messager.Body = "Following applications you are monitoring are closed are crashed:"; 
       **foreach (var item in ApplicationsInactive) 
       { 
        messager.Body = item; 
       }** // Here i am trying to populate list of applications. 
      } 
      catch (Exception) 
      { 
       throw; 
      } 

      var smtp = new SmtpClient(emailServer); 
      smtp.EnableSsl = true; 

      try 
      { 
       smtp.DeliveryMethod = SmtpDeliveryMethod.Network; 
       smtp.UseDefaultCredentials = false; 
       smtp.Send(messager); 
      } 
      catch (Exception) 
      { 

       throw; 
      } 

     } 
     catch (SmtpException ex) 
     { 
      throw new ApplicationException 
       ("SmtpException has occured: " + ex.Message); 
     } 

    } 

} 

답변

4

루프에서이 줄은 문제입니다. 물론,이 작업을 수행 할 수있는 더 많은 방법이 있습니다

messager.Body += item; 

,이 사람은 실제로 약간의 실수입니다 : 대신 추가하고자합니다. StringBuilder 클래스를 살펴보고 형식화 된 문자열을 만들고 이메일 본문을 만든 다음 StringBuilder 개체의 .ToString()으로 이메일 본문을 설정하면됩니다.

당신이 실제로 의미있는 방법으로 예외를 처리하지 않는 경우
catch (Exception) 
{ 
    throw; 
} 

, 왜 전혀 그것을 잡을 : 또한


, 보조 노트로,이 코드는 당신에게 어떤 목적으로 제공되지 않습니다? 이 코드는 예외를 던질 것이므로 예외를 throw하도록하십시오. 여기서 그것을 잡을 아무런 이유가 없습니다. 이것은 단지 코드에 노이즈를 생성하는 것입니다.

또한,이 또한 나쁜 : 당신은 원래의 예외를 억제하고 완전히 새로운 하나를 만드는

catch (SmtpException ex) 
{ 
    throw new ApplicationException 
     ("SmtpException has occured: " + ex.Message); 
} 

. 원래 예외에서 스택 추적 및 기타 유용한 정보를 잃어 버리고 있습니다. SmtpException 초를 ApplicationException 초로 변환하려는 특별한 이유가 있습니까? 최소한 정보가 완전히 손실되지 않도록 ApplicationExceptionInnerException 속성을 SmtpException으로 설정하십시오.

그러나 요점은 위에서와 마찬가지로 실제로 의미있는 방식으로 예외를 처리하지 않는 것입니다. 컨텍스트가 추가되지 않고 로깅이 수행되지 않고 어쨌든 예외가 발생합니다. 다시 말하지만, 이것은 코드의 잡음입니다. 실제로 처리하지 않으면 예외를 잡을 이유가 없습니다.

+0

감사합니다. 내 코드를 수정했습니다. 항목 목록을 채울 수 있지만 모두 한 줄로 표시됩니다. – 62071072SP

+1

@ 62071072 : 추가 서식이 적용됩니다. 당신이 접근하는 방식은 이메일이 HTML인지 아닌지에 달려 있습니다. 귀하의 코드에 HTML이 표시되지 않으므로 나는 추측하고 있습니다. 그러나 우선,'messager.Body + = item + Environment.NewLine;과 같은 간단한 것을 시도해 볼 수 있습니다. – David

3

현재 코드는 각 반복에 몸을 덮어 그것을 각 항목을 할당한다 :

다음은 내 코드입니다.

messager.Body = "Following applications you are monitoring are closed are crashed:"; 
messager.Body += string.Join(", ", ApplicationsInactive); 

주 대신 = 단지 + = 연산자

는 대신 몸에 APPEND해야합니다.

또한 루프가 필요하지 않습니다. string 클래스의 편리한 Join() 메서드를 사용하면 더 적은 코드와 더 읽기 쉬운 코드로 동일한 결과를 얻을 수 있습니다. 그래서 마지막 항목이 루프 다음이있을 것이다,

messager.Body = item; 

당신은 Body 재산 때마다 덮어 쓰기있어 :

+0

ApplicationsInactive는 목록입니다. join() 메서드에 목록을 추가 할 수 없습니다. – 62071072SP

+0

@ 62071072 [.NET 4.0] (http://msdn.microsoft.com/en-us/library/system)로 시작할 수 있습니다. .string.join (v = vs.100) .aspx) - 이전 프레임 워크의 경우'string.Join (","ApplicationsInactive.ToArray()); ' –

+0

으로 보내 주시면 감사하겠습니다. 그러나 모든 항목은 한 줄로 채워져 있습니다. 예 : 모니터링중인 응용 프로그램이 닫히면 충돌이 발생합니다 : abc, akdksa, aodjal – 62071072SP

관련 문제