2011-12-31 3 views
1

사용자에게 짧은 퀴즈를 제공하는 웹 응용 프로그램을 개발 중입니다. 시스템은 QuizID 및 IsSent 열로 구성된 데이터베이스의 Quiz 테이블을 검사합니다.이메일을 보낸 후 'IsSent'열의 값을 업데이트하는 방법은 무엇입니까?

IsSent 열 (비트 데이터 형식)의 값이 0 (false)이면 시스템에서 모든 사용자에게 퀴즈를 보냅니다. 1이 있으면 퀴즈가 이미 전송되었음을 의미합니다.

나는 응용 프로그램이 전자 메일을 보내도록 할 수 있지만 지금은 전자 메일을 보낸 후 IsSent 값을 1 또는 true로 업데이트하려고하지만 어떻게해야할지 모르겠다.

아무에게도 어떻게 할 수 있습니까?

내 코드 :

당신은 당신의 QuizIDs을 추적 할 필요가
protected void Page_Load(object sender, EventArgs e) 
{ 
    SendEmailTOAllUser(); 
} 


protected void SendEmail(string toAddress, string fromAddress, string MailSubject, string MessageBody, bool isBodyHtml) 
{ 
    SmtpClient sc = new SmtpClient("SMTP (MAIL) ADDRESS"); 
    try 
    { 
     MailMessage msg = new MailMessage(); 
     msg.From = new MailAddress("[email protected]", "OUR SYSTEM"); 
     msg.To.Add(toAddress); 
     msg.Subject = MailSubject; 
     msg.Body = MessageBody; 
     msg.IsBodyHtml = isBodyHtml; 
     //Response.Write(msg); 
     sc.Send(msg); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

} 

protected void SendEmailTOAllUser() 
{ 
    string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspTest;Integrated Security=True"; 
    string cmdText = "SELECT QuizID, IsSent FROM dbo.QUIZ"; 
    string cmdText2 = "SELECT Username FROM dbo.employee"; 

    Collection<string> emailAddresses = new Collection<string>(); 
    string link = ""; 
    string body = ""; 

    using (SqlConnection conn = new SqlConnection(connString)) 
    { 
     conn.Open(); 
     // Open DB connection. 
     using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
     { 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader != null) 
      { 
       while (reader.Read()) 
       { 
        if (!(bool)reader["IsSent"]) 
        { 
         string quizid = reader["QuizID"].ToString(); 
         link = "<a href='http://pmv/pssp/StartQuiz.aspx?testid=" + quizid + "'> Click here to participate </a>"; 
         body = @"<b> Please try to participate in the new short safety quiz </b>" 
              + link + 
              @"<br /> <br /> 
         This email was generated using the <a href='http://pmv/pssp/Default.aspx'>PMOD Safety Services Portal </a>. 
         Please do not reply to this email. 
         ";  
        } 
       } 
      } 
      reader.Close(); 
     } 

     using (SqlCommand cmd = new SqlCommand(cmdText2, conn)) 
     { 
      SqlDataReader reader = cmd.ExecuteReader(); 
      if (reader != null) 
      { 
       while (reader.Read()) 
       { 
        string emailTo = reader["Username"].ToString(); 
        string receiverEmail = emailTo + "@gmail.com"; 
        emailAddresses.Add(receiverEmail); 
       } 
      } 
      reader.Close(); 
     } 
     conn.Close(); 
    } 

    foreach (string email in emailAddresses) 
    { 
     SendEmail(email, "", "Notification Email Subject", body, true); 
    } 
} 

답변

1

먼저, 코드 마지막 퀴즈에 대한 이메일을 보내드립니다 :

이것은 당신이 당신의 업데이트 쿼리를 작성하는 방법입니다.

둘째, 일반적으로 경험적으로 데이터베이스에서 절대적으로 필요한 데이터 만 검색해야합니다. 가 이미 전송 된 퀴즈를 읽을 이유가 없다, 그래서 당신은 해당 쿼리를 변경할 수 있습니다

string cmdText = "SELECT QuizID FROM dbo.QUIZ WHERE IsSent <> 1"; 

셋째, 당신은 퀴즈에 대한 전자 메일이 전송 된 후 즉시 각 퀴즈 IsSent을 업데이트해야합니다.

마지막으로, 여러 명의 이메일보다는 BCC 사용자로 모든 수신자가 포함 된 단일 이메일을 보내야합니다. 당신의 도움에 대한

protected void SendEmail(string toAddresses, string fromAddress, string MailSubject, string MessageBody, bool isBodyHtml) 
    { 
     SmtpClient sc = new SmtpClient("SMTP (MAIL) ADDRESS"); 
     try 
     { 
      MailMessage msg = new MailMessage(); 
      msg.From = new MailAddress("[email protected]", "OUR SYSTEM"); 

      // In case the mail system doesn't like no to recipients. This could be removed 
      msg.To.Add("[email protected]"); 

      msg.Bcc.Add(toAddresses); 
      msg.Subject = MailSubject; 
      msg.Body = MessageBody; 
      msg.IsBodyHtml = isBodyHtml; 
      //Response.Write(msg); 
      sc.Send(msg); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 

    } 

    protected void SendEmailTOAllUser() 
    { 
     string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=psspTest;Integrated Security=True"; 

     using (SqlConnection conn = new SqlConnection(connString)) 
     { 
      var sbEmailAddresses = new System.Text.StringBuilder(1000); 
      var quizIds = new List<int>(); 

      // Open DB connection. 
      conn.Open(); 

      string cmdText = "SELECT QuizID FROM dbo.QUIZ WHERE IsSent <> 1"; 
      using (SqlCommand cmd = new SqlCommand(cmdText, conn)) 
      { 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
       { 
        while (reader.Read()) 
        { 
         // There is only 1 column, so just retrieve it using the ordinal position 
         quizIds.Add(reader.GetInt32(0)); 
        } 
       } 
       reader.Close(); 
      } 

      string cmdText2 = "SELECT Username FROM dbo.employee"; 
      using (SqlCommand cmd = new SqlCommand(cmdText2, conn)) 
      { 
       SqlDataReader reader = cmd.ExecuteReader(); 
       if (reader != null) 
       { 
        while (reader.Read()) 
        { 
         var sName = reader.GetString(0); 
         if (!string.IsNullOrEmpty(sName) 
         { 
          if (sbEmailAddresses.Length != 0) 
          { 
           sbEmailAddresses.Append(","); 
          } 
          // Just use the ordinal position for the user name since there is only 1 column 
          sbEmailAddresses.Append(sName).Append("@gmail.com"); 
         } 
        } 
       } 
       reader.Close(); 
      } 

      string cmdText3 = "UPDATE dbo.Quiz SET IsSent = 1 WHERE QuizId = @QuizID"; 
      using (SqlCommand cmd = new SqlCommand(cmdText3, conn)) 
      { 
       // Add the parameter to the command 
       var oParameter = cmd.Parameters.Add("@QuizID", SqlDbType.Int); 
       // Get a local copy of the email addresses 
       var sEMailAddresses = sbEmailAddresses.ToString(); 

       foreach (int quizid in quizIds) 
       { 
        string link = "<a href='http://pmv/pssp/StartQuiz.aspx?testid=" + quizid + "'> Click here to participate </a>"; 
        string body = @"<b> Please try to participate in the new short safety quiz </b>" 
             + link + 
             @"<br /> <br /> 
        This email was generated using the <a href='http://pmv/pssp/Default.aspx'>PMOD Safety Services Portal </a>. 
        Please do not reply to this email. 
        "; 

        SendEmail(sEMailAddresses, "", "Notification Email Subject", body, true); 

        // Update the parameter for the current quiz 
        oParameter.Value = quizid; 
        // And execute the command 
        cmd.ExecuteNonQuery(); 
       } 
      } 
      conn.Close(); 
     } 
    } 
+0

감사 :

다음은 이러한 개념을 모두 포함하는 재 작성합니다. 나는 다음과 같은 오류가 있습니다 : 메일 헤더에 유효하지 않은 문자가 있습니다 : '@'그리고 그것을 고치는 방법을 모른다. 어떤 도움을 주시겠습니까? – user1093651

+0

죄송합니다. 코드에 오류가있어서 답변을 업데이트했습니다. if (sbEmailAddresses.Length == 0)를 if (sbEmailAddresses.Length! = 0)로 변경해야합니다. 주소 목록에 추가하기 전에 이름이 데이터베이스에서 읽히도록 업데이트했습니다. –

+0

도움 주셔서 대단히 감사합니다. 나는 그것을 알아낼 수 있었다. 나는 당신의 코드에서 조금 바뀌었다. 야, 고마워. 당신은 실제로 내 목숨을 구했지만 이제는 코드에 또 다른 문제가 있습니다. 문제는 다음과 같습니다. 사용자에게 보내지 않은 퀴즈 이상인 경우 시스템에서 퀴즈 테이블을 확인하기를 원합니다. 나는이 퀴즈들 중 첫 번째 퀴즈를 보내지 말고 모든 퀴즈 또는 마지막으로 생성 된 퀴즈 만 보내주기를 바란다. 그렇게하는 방법? – user1093651

1

, 나는 다음과 같이 ArrayList에 함께 제안 :

당신이 독자를 반복하여 while 루프에서
ArrayList quizIDs = new ArrayList(); 

변수를 reader["QuizID"].ToString()으로 설정하고 다음 줄을 추가하여 퀴즈 ID를 목록에 저장합니다.

quizIDs.Add(quizid); 

모든 전자 메일을 보내면 이전에 저장 한 모든 QuizID에 대해 IsSent 열을 업데이트하여 쿼리를 실행해야합니다. 그것은 현재의 약자로,

string updateQuery = "UPDATE dbo.QUIZ SET IsSent = 1 WHERE QuizID in (" + String.Join(",", quizIDs) + ")"; 
관련 문제