2012-03-21 2 views
1

Мне просто нужна помощь. В основном я создаю приложение Windows, которое отправляет массовые письма нашим клиентам. поле «электронная почта» и «вложение» - из базы данных. поле вложения содержит только путь, в котором находится файл. Код работает, но вместо получения 5 сообщений электронной почты я получаю 15 писем.Отправка больших электронных писем с путями вложений в базе данных

Примечание: моя база данных содержит только 5 записей, поэтому я должен получить только 5 писем с вложениями:

Можете ли вы помочь мне, пожалуйста, спасибо!

Вот мой код:

 string email; 
     string attachment; 
     ArrayList emailList = new ArrayList(); 
     ArrayList attachList = new ArrayList(); 
     private static readonly Logger log = new _EventLogger(); 

     private void btnSend_Click(object sender, EventArgs e) 
     { 
      conn.Open(); 
      SqlCommand cmdgetEmail = new SqlCommand("Select EMAIL, PATH from MEMBERREQUIREMENTS WHERE STATUS=0", conn); 
      SqlDataReader getEmail = cmdgetEmail.ExecuteReader(); 
      //count = 0; 
      while (getEmail.Read()) 
      { 
       //count++; 
       //email = getEmail.GetValue(i).ToString(); 
       //emailList.Add(email); 
       //i = i + 1 - 1; 
       email = getEmail.GetString(0); 
       emailList.Add(email); 
       attachment = getEmail.GetString(1); 
       attachList.Add(attachment); 
      } 
      getEmail.Close(); 
      conn.Close(); 
      sendMail(); 
     } 
      private void sendMail() 
      { 

       string from="[email protected]"; 
       foreach (string sendTo in emailList) 
       { 

        foreach (string sendAttachments in attachList) 
        { 
        MailMessage mail = new MailMessage(); 
        mail.To.Add(sendTo); 
        mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8); 
        mail.Subject = subject; 
        mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter; 
        mail.IsBodyHtml = true; 
        mail.Priority = MailPriority.High;  
        mail.Attachments.Add(new Attachment(sendAttachments)); 

         SmtpClient client = new SmtpClient(); 
         client.Credentials = new System.Net.NetworkCredential(from, "password"); 
         client.Host = "192.167.89.0"; 
         client.EnableSsl = false; 
         try 
         { 

          progress(); 
          client.Send(mail); 

         } 

         catch (Exception ex) 
         { 
          ProgressBar1.Visible = false; 
          timer1.Enabled = false; 
          Exception excpt = ex; 
          string errorMessage = string.Empty; 

          while (excpt != null) 
          { 

           errorMessage += excpt.ToString(); excpt = excpt.InnerException; 
           log.Error("Email - LMS Application Error", ex); 
           lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details."; 
           lblError.ForeColor = System.Drawing.Color.Red; 
          } 
         } 

        } 
       } 
      } 
+1

Заметим, что '[код] и' [/ код] 'псевдопользователей-теги ничего не значит. Лучший способ форматировать код - добавить четыре пробела к каждой строке.Если вы выберете весь свой код, а затем нажмите кнопку '{}' в редакторе, это будет просто работать. – sarnold

+0

извините, но редактор wysywig заблокирован на нашем брандмауэре, поэтому я не могу его увидеть. – Dhenn

+0

Я верю, что это нормально – Dhenn

ответ

4

Похоже, вы потянув кучу записей из вашего MEMBERREQUIREMENTS таблицы, содержащей адрес электронной почты и путь к привязанности, и создание списка электронной почты адресов и путей присоединения.

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

  • Каждый получатель должен получить только прикрепленное приложение, указанное в их записи. В этом случае вы не хотите перебирать вложения для каждого адреса, или, возможно,
  • каждый получатель должен получать каждое вложение, но вложения должны быть перечислены в отдельной таблице и не сохраняться в записи для каждого адреса в ваш MEMBERREQUIREMENTS таблица.

UPDATE:

Ниже приведен код, чтобы сделать первый. Обратите внимание, что это лишь минимальное редактирование Опубликованная кода, и не устанавливает имена переменных и т.д., или предоставить любую дополнительную проверку ошибок (которые вы, вероятно, хотите сделать):

private static readonly Logger log = new _EventLogger(); 


private void btnSend_Click(object sender, EventArgs e) 
{ 
    conn.Open(); 
    SqlCommand cmdgetEmail = new SqlCommand("Select EMAIL, PATH from MEMBERREQUIREMENTS WHERE STATUS=0", conn); 
    SqlDataReader getEmail = cmdgetEmail.ExecuteReader(); 
    while (getEmail.Read()) 
    { 
     email = getEmail.GetString(0); 
     attachment = getEmail.GetString(1); 
     this.sendMail(email, attachment) 
    } 
    getEmail.Close(); 
    conn.Close(); 
} 

private void sendMail(string sendTo, string sendAttachments) 
{ 
    MailMessage mail = new MailMessage(); 
    mail.To.Add(sendTo); 
    mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8); 
    mail.Subject = subject; 
    mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter; 
    mail.IsBodyHtml = true; 
    mail.Priority = MailPriority.High; 
    mail.Attachments.Add(new Attachment(sendAttachments)); 

    SmtpClient client = new SmtpClient(); 
    client.Credentials = new System.Net.NetworkCredential(from, "password"); 
    client.Host = "192.167.89.0"; 
    client.EnableSsl = false; 
    try 
    { 

     progress(); 
     client.Send(mail); 

    } 

    catch (Exception ex) 
    { 
     ProgressBar1.Visible = false; 
     timer1.Enabled = false; 
     Exception excpt = ex; 
     string errorMessage = string.Empty; 

     while (excpt != null) 
     { 

      errorMessage += excpt.ToString(); excpt = excpt.InnerException; 
      log.Error("Email - LMS Application Error", ex); 
      lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details."; 
      lblError.ForeColor = System.Drawing.Color.Red; 
     } 
    } 
} 
+0

У вас это есть, это то, что я действительно хочу: каждый получатель должен получить – Dhenn

+0

Можете ли вы дать мне код для исправления? – Dhenn

+0

Да, я отредактировал свой ответ, чтобы включить код. – Ergwun

0

Это потому, что у вас есть вызов client.Send(mail); внутри ваших привязок для цикла foreach. Он должен находиться за пределами этого цикла.

попробуйте изменить метод sendMail к этому:

private void sendMail() 
{ 
    string from = "[email protected]"; 
    foreach (string sendTo in emailList) 
    { 
     MailMessage mail = new MailMessage(); 
     mail.To.Add(sendTo); 
     mail.From = new MailAddress(from, "Company Name'", Encoding.UTF8); 
     mail.Subject = subject; 
     mail.Body = msgBodyHead + msgBodyHead2 + msgDate + msgGreet + msgBody + msgAdobe + msgAssistance + msgCompliment + msgfooter; 
     mail.IsBodyHtml = true; 
     mail.Priority = MailPriority.High; 
     foreach (string sendAttachments in attachList) 
     { 
      mail.Attachments.Add(new Attachment(sendAttachments)); 
     } 

     SmtpClient client = new SmtpClient(); 
     client.Credentials = new System.Net.NetworkCredential(from, "password"); 
     client.Host = "192.167.89.0"; 
     client.EnableSsl = false; 
     try 
     { 

      progress(); 
      client.Send(mail); 

     } 

     catch (Exception ex) 
     { 
      ProgressBar1.Visible = false; 
      timer1.Enabled = false; 
      Exception excpt = ex; 
      string errorMessage = string.Empty; 

      while (excpt != null) 
      { 

       errorMessage += excpt.ToString(); excpt = excpt.InnerException; 
       log.Error("Email - LMS Application Error", ex); 
       lblError.Text = "There was an error occured while processing your request.\n Please see Event Viewer for more details."; 
       lblError.ForeColor = System.Drawing.Color.Red; 
      } 
     } 
    } 
} 
+0

, и теперь я получаю 5 писем, но все прикрепленные файлы прилагаются в письме. Моя проблема заключается в том, что каждый получатель должен получать только приложение, указанное в их записи. Например, если [email protected] имеет значение 1.pdf, он должен получать только 1.pdf, другие файлы не прилагаются. – Dhenn

+0

@ Dhenn Используйте ответ Эргвуна выше. Он выглядит хорошо, и он избил меня до него. – Robbie

+0

Он удаляет петлю foreach, ее работу, но она отправляет только 1 электронное письмо с приложением. – Dhenn

1

У вас есть две петли, одна для списка отправителей (5) и один для списка вложений (вероятно, 3), что в общей сложности 15 выполнение кода для отправки электронной почты. Я бы реорганизовать метод sendmail к чему-то вроде:

foreach (string sendTo in emailList) 
{ 
    // construct email fields ... 
    // ... 

    foreach (string sendAttachments in attachList) 
    { 
     mail.Attachments.Add(new Attachment(sendAttachments)); 
    } 

    // send email ... 
    // ... 
} 
+0

так как исправить? – Dhenn

+0

Основываясь на ваших комментариях к ответам других, кажется, что в вашем запросе может быть больше одного приложения. Вам нужно отладить ваш код и точно увидеть, что вы получаете от базы данных. –

0
 private void sendMail() 
     { 

      string from="[email protected]"; 
      foreach (string sendTo in emailList) 
      { 

       foreach (string sendAttachments in attachList) 
       { 

Вы итерация attachList, но я ничего не вижу в этом цикле, чтобы ограничить attachList для вложений, предназначенных только для получателя sendTo.

0

Не знаю, зачем вам это нужно, что списки массивов и циклов в методе Sendmail, возможно, что-то вроде этого:

/// ...snip 
    email = getEmail.GetString(0); 
    attachment = getEmail.GetString(1); 
    SendOneMail(email, attachment); 
    /// ... snip 


    private void SendOneMail(string email, string attach) 
    { 
    /// send yust one mail 
    } 
Смежные вопросы