C# 如何在邮件正文中插入数据库值或字符串

C# 如何在邮件正文中插入数据库值或字符串,c#,sql,sendmail,sqldatareader,C#,Sql,Sendmail,Sqldatareader,我想在电子邮件正文中插入数据库内容,数据读取器的索引0包含每个电子邮件地址的id号,我想使用在邮件正文中添加id号发送邮件,例如:员工id为5。 我需要在同一行中存在的每个邮件正文上插入每个id。 我用这个代码在身体里插入id,但没用 message.Body = "The Employee id is 5 "+reader[1].ToString(); 完整代码为: MailMessage message = new MailMessage(); message.Subject = "Em

我想在电子邮件正文中插入数据库内容,数据读取器的索引0包含每个电子邮件地址的id号,我想使用在邮件正文中添加id号发送邮件,例如:员工id为5。 我需要在同一行中存在的每个邮件正文上插入每个id。 我用这个代码在身体里插入id,但没用

message.Body = "The Employee id is 5  "+reader[1].ToString();
完整代码为:

MailMessage message = new MailMessage();
message.Subject = "Employee Access ";

message.From = new MailAddress("avvv@gmail.com");
var fromAddress = "avvv@gmail.com";
const string fromPassword="password";
var smtp = new System.Net.Mail.SmtpClient();
{
    smtp.Host = "smtp.gmail.com";
    smtp.EnableSsl = true;
    smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    smtp.Timeout = 20000;


    OleDbCommand cmd = null;
    OleDbCommand cmd2 = null;

    string queryString = "select id,email,status from tableemail";
    using (OleDbConnection connection = new OleDbConnection("Provider = OraOLEDB.Oracle.1; Data Source = xe;
    Password=654321;User ID = xpress; unicode=true"))
    {
        OleDbCommand command = new OleDbCommand(queryString, connection);
        connection.Open();
        cmd = new OleDbCommand(queryString);
        cmd.Connection = connection;
        OleDbDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            MailAddress to = new MailAddress(reader[1].ToString());
            message.To.Add(to);   
        }

        message.Body = "The Employee id is 5  "+reader[1].ToString();
        smtp.Send(message);
        reader.Close();
    }
}

我可以使用数据读取器在正文中插入多个数据库字段吗?

我不确定您的代码究竟是如何需要此功能的,但据我所知,您可以这样做。使用数据表


我认为问题在于,您在DataReader读取最后一条记录后调用它。Reader.Read返回了false,这意味着Reader[1]应该抛出一个错误,因为没有可读取的内容

我不知道你是想要邮件正文中的每一个值还是最后一个值。。。假设你想要每一个,像这样的东西应该会起作用:

using (OleDbConnection connection = new OleDbConnection(cs))
{
    connection.Open();

    using (OleDbCommand cmd = new OleDbCommand(queryString, connection))
    {
        using (OleDbDataReader reader = cmd.ExecuteReader())
        {
            StringBuilder body = new StringBuilder();

            while (reader.Read())
            {
                string to = reader.GetString(0);
                message.To.Add(to);
                body.AppendFormat("The Employee id is 5 {0}<br>", to);
            }

            message.Body = body.ToString();
            reader.Close();
        }
    }
}
smtp.Send(message);
如果您真的只想要原始代码所暗示的最后一个,那么我只需要将它保存在循环中的本地字符串中,然后在读卡器循环之后添加它


在一个无关的问题上,您将两次实例化OLE命令对象。我消除了上面代码段中的重复项。

如果性能不是问题,数据也不是很大的话。您可以使用datatable,然后您可以轻松地对其进行迭代并发送邮件。请提供使用datatable的示例??多次发送给用户的邮件,我只需要用户一次接收一封邮件execution@moonir01您想将邮件发送到具有不同内容的单个邮件id吗?是的,我想将邮件发送到具有不同内容的单个邮件id。@moonir01您能给我看一些虚拟数据吗。您从数据库中获得的信息以及您想要发送的信息ID电子邮件----------------------1abc1@outlook.com2.abc2@gmail.com3.abc3@yahoo.com
using (OleDbConnection connection = new OleDbConnection(cs))
{
    connection.Open();

    using (OleDbCommand cmd = new OleDbCommand(queryString, connection))
    {
        using (OleDbDataReader reader = cmd.ExecuteReader())
        {
            StringBuilder body = new StringBuilder();

            while (reader.Read())
            {
                string to = reader.GetString(0);
                message.To.Add(to);
                body.AppendFormat("The Employee id is 5 {0}<br>", to);
            }

            message.Body = body.ToString();
            reader.Close();
        }
    }
}
smtp.Send(message);