C# 一次发送多封电子邮件

C# 一次发送多封电子邮件,c#,database,oledb,C#,Database,Oledb,我想给不止一个人发送电子邮件。为什么此代码显示此消息:“参数'to'不能是空字符串参数名称:to” 您必须至少添加一个收件人: mm.To.Add("email@example.com"); 您还可以添加多个收件人。尝试以下操作: mm.To.Add(new MailAddress("addres1@emailserver.com")); mm.To.Add(new MailAddress("addres2@emailserver.com")); 别忘了添加您发送邮件的地址: mm.From

我想给不止一个人发送电子邮件。为什么此代码显示此消息:“参数'to'不能是空字符串参数名称:to”


您必须至少添加一个收件人:

mm.To.Add("email@example.com");
您还可以添加多个收件人。

尝试以下操作:

mm.To.Add(new MailAddress("addres1@emailserver.com"));
mm.To.Add(new MailAddress("addres2@emailserver.com"));
别忘了添加您发送邮件的地址:

mm.From = new MailAddress("addres3@emailserver.com"));
如果您将以密件抄送方式发送电子邮件,您可以使用:

mm.Bcc.Add(new MailAddress("addres1@emailserver.com"));
mm.Bcc.Add(new MailAddress("addres2@emailserver.com"));

来源:

从数据表中获取电子邮件地址后,检查电子邮件是否为空。如果为空,则继续下一行

string email = row["Email"].ToString();
if(String.IsNullOrEmpty(value) || value.Trim().Length == 0)
{
    continue;
}

我猜您从datatable收到的电子邮件可能是空的或空的。因此,在继续发送电子邮件之前,请确保检查空字符串

if(String.IsNullOrEmpty(value))
    continue;
connection.Open();
varcommand1 = new OleDbCommand();
command1.Connection = connection;
varcq = "Select Email From student where S_ID in(select S_ID FROM studentbook where DateDiff('d',[Issue_Date], NOW())=31) ";
command1.CommandText = cq;
varda1 = new OleDbDataAdapter(command1);
vardt1 = new DataTable();
da1.Fill(dt1);
using (var mm = new MailMessage())
{
    foreach (DataRow row in dt1.Rows)
    {
        varemail = row["Email"].ToString();
        if(string.IsNullOrWhitespace(email))
            continue;
        mm.Bcc.Add(email);   
    }
    mm.From.Add("SenderEmailAddress");   
    mm.Subject = "Attention please,renew your book";
    mm.Body = string.Format("1 month over,you should renew or return the book");

    mm.IsBodyHtml = true;
    SmtpClient smtp = new SmtpClient();
    smtp.Host = "smtp.gmail.com";
    smtp.EnableSsl = true;
    var credentials = new System.Net.NetworkCredential();
    credentials.UserName = "xxxxxxxxxxxxx";
    credentials.Password = "xxxxxxxxxx";
    smtp.UseDefaultCredentials = true;
    smtp.Credentials = credentials;
    smtp.Port = 587;
    smtp.Send(mm);
}
另外,如果您要向多个收件人发送同一封电子邮件,则不要在foreach循环中执行所有操作,而是将收件人添加到
mm.to.add(“要发送的电子邮件地址”)然后最后发送电子邮件

if(String.IsNullOrEmpty(value))
    continue;
connection.Open();
varcommand1 = new OleDbCommand();
command1.Connection = connection;
varcq = "Select Email From student where S_ID in(select S_ID FROM studentbook where DateDiff('d',[Issue_Date], NOW())=31) ";
command1.CommandText = cq;
varda1 = new OleDbDataAdapter(command1);
vardt1 = new DataTable();
da1.Fill(dt1);
using (var mm = new MailMessage())
{
    foreach (DataRow row in dt1.Rows)
    {
        varemail = row["Email"].ToString();
        if(string.IsNullOrWhitespace(email))
            continue;
        mm.Bcc.Add(email);   
    }
    mm.From.Add("SenderEmailAddress");   
    mm.Subject = "Attention please,renew your book";
    mm.Body = string.Format("1 month over,you should renew or return the book");

    mm.IsBodyHtml = true;
    SmtpClient smtp = new SmtpClient();
    smtp.Host = "smtp.gmail.com";
    smtp.EnableSsl = true;
    var credentials = new System.Net.NetworkCredential();
    credentials.UserName = "xxxxxxxxxxxxx";
    credentials.Password = "xxxxxxxxxx";
    smtp.UseDefaultCredentials = true;
    smtp.Credentials = credentials;
    smtp.Port = 587;
    smtp.Send(mm);
}

您应该检查数据库结果中的空值。显然,存在一个带有空电子邮件地址的记录。您还应该考虑将多个收件人添加到<代码> BCC < /代码>中,而不是<代码> >代码> >这将允许您只发送一次消息。还应该处理<代码> SMTPclipse < /代码>。这是OP使用构造函数所做的事情,最好将这些添加到密件抄送字段,为了保护隐私。这是OP使用构造函数所做的。我不知道我必须在哪里更改我的代码。请编辑我的代码,这样对我会更好