Отправка массовых писем с путями вложения в базу данных - PullRequest
1 голос
/ 21 марта 2012

Мне просто нужна помощь. По сути, я создаю приложение для 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="myemail@email.com";
                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;
                            }
                        }

                    }
                }
            }

Ответы [ 5 ]

4 голосов
/ 21 марта 2012

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

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

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

ОБНОВЛЕНИЕ:

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

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;
        }
    }
}
1 голос
/ 21 марта 2012

У вас есть два цикла: один для списка отправителей (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 голосов
/ 21 марта 2012

Не знаю, зачем вам нужны списки и циклы массивов в методе 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
  }
0 голосов
/ 21 марта 2012
        private void sendMail()
        {

            string from="myemail@email.com";
            foreach (string sendTo in emailList)
            {

                foreach (string sendAttachments in attachList)
                {

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

0 голосов
/ 21 марта 2012

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

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

private void sendMail()
{
    string from = "myemail@email.com";
    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;
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...