我只是需要帮助。基本上我正在创建一个向我们的客户发送批量电子邮件的 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;
}
}
}
}
}
请您参考如下方法:
看起来您正在从 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;
}
}
}
