2015-02-06 43 views
0

我有此代码可在按钮单击后发送电子邮件。在查询中使用多个值在asp.net中发送电子邮件

我想在查询中使用aspnet_Users.UserName作为电子邮件的一部分,但它不起作用。

以下是我的代码。

谢谢

SqlDataReader reader; 
string sendMessage = "SELECT aspnet_Membership.Email, aspnet_Users.UserName, User_Profile.FirstName FROM aspnet_Membership INNER JOIN aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId INNER JOIN User_Profile ON aspnet_Users.UserId = User_Profile.UserId WHERE (aspnet_Membership.UserId = @UserId)"; 
using (SqlConnection myConnection = new SqlConnection(connectionString)) 
{ 
    myConnection.Open(); 
    SqlCommand myCommand = new SqlCommand(sendMessage, myConnection); 
    myCommand.Parameters.AddWithValue("@UserId", newUserId); 
    ArrayList emailArray = new ArrayList(); 
    reader = myCommand.ExecuteReader(); 

    while (reader.Read()) 
    { 
     emailArray.Add(reader["email"]); 
     string name = reader["UserName"].ToString(); 
    } 

    foreach (string email in emailArray) 
    { 

     //send new confirmation email 
     const string username = "------------"; 
     const string password = "------------"; 
     SmtpClient smtpclient = new SmtpClient(); 
     MailMessage mail = new MailMessage(); 
     MailAddress fromaddress = new MailAddress("-------------", "--------"); 
     smtpclient.Host = "---------"; 
     smtpclient.Port = 25; 
     mail.From = fromaddress; 
     mail.To.Add(email); 
     mail.Subject = ("Welcome to -------); 
     //mail.Attachments.Add(new mail); 
     mail.IsBodyHtml = true; 
     mail.Body = 
     //the message that goes in the body of the email 
     "+ HttpUtility.HtmlEncode(name) + "; 

     smtpclient.EnableSsl = false; 
     smtpclient.DeliveryMethod = SmtpDeliveryMethod.Network; 
     smtpclient.Credentials = new System.Net.NetworkCredential(username, password); 
     smtpclient.Send(mail); 
    } 
    reader.Close(); 
    myConnection.Close(); 

} 
+4

你从来不会在'while'块中用'username'做任何事情。 – mason 2015-02-06 20:15:37

+0

@mason thaks,你建议我用while循环中的用户名做什么? – Musa 2015-02-06 20:35:03

回答

0
Dictionary<string, string> emails = new Dictionary<string, string>(); 
... 
while (reader.Read()) 
{ 
    emails[Convert.ToString(reader["email"])] = Convert.ToString(reader["UserName"]); 
} 

foreach(string email in emails.Keys) 
{ 
    ... 
    mail.To.Add(email); 
    ... 
    mail.Body = "Greetings " + emails[email] + "!". 
    ... 
} 
1

你已经把“用户名”从数据库到一个名为“名”变量,但在后面的代码,你尝试引用“用户名” - 这可能是空的。

+0

谢谢,我已更改名称以正确反映,但仍无法正常工作 – Musa 2015-02-06 20:36:13

0
public class EmailModel 
{ 
    public string ToAddress {get; set;} 
    public string Username {get; set;} 
} 

var myCommand = new SqlCommand("SELECT aspnet_Membership.Email, aspnet_Users.UserName, User_Profile.FirstName FROM aspnet_Membership INNER JOIN aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId INNER JOIN User_Profile ON aspnet_Users.UserId = User_Profile.UserId WHERE (aspnet_Membership.UserId = @UserId)"); 
myCommand.Parameters.AddWithValue("@UserId", newUserId); 
var emails = new List<EmailModel>(); 
using (var myConnection = new SqlConnection(connectionString)) 
{ 
    myCommand.Conection = myConnection; 
    myConnection.Open();   
    reader = myCommand.ExecuteReader();  
    while (reader.Read()) 
    { 
     emails.Add(new EmailModel(){ 
      ToAddress = reader["email"].ToString(), 
      Username = reader["UserName"].ToString() 
     });   
    } 
} 

foreach (var email in emails) 
{ 

    //send new confirmation email 
    SmtpClient smtpclient = new SmtpClient(); 
    MailMessage mail = new MailMessage(); 
    MailAddress fromaddress = new MailAddress("-------------", "--------"); 
    smtpclient.Host = "---------"; 
    smtpclient.Port = 25; 
    mail.From = fromaddress; 
    mail.To.Add(email.ToAddress); 
    mail.Subject = ("Welcome to -------""); 
    mail.IsBodyHtml = true; 
    mail.Body = "Hi "+email.Username; 
    smtpclient.EnableSsl = false; 
    smtpclient.DeliveryMethod = SmtpDeliveryMethod.Network; 
    string smtp_username=""; 
    string smtp_password="";//better not put this in code, pull it from .config file 
    smtpclient.Credentials = new System.Net.NetworkCredential(smtp_username, smtp_password); 
    smtpclient.Send(mail); 
} 

我们需要定义将不得不在我们已经从数据库中检索到的电子邮件中使用的信息的类。在上面,你可以看到我创建了一个新的EmailModel类(你应该把它放在一个单独的文件中并根据需要添加更多的属性),然后从数据库填充它。我的代码不会使数据库连接保持活动状态(为什么在实际发送电子邮件时将其打开?!这是浪费资源)。我也使用通用的List<T>类,而不是很少使用的ArrayList

然后我循环访问列表中的EmailModel,并使用EmailModel中的属性为每个电子邮件生成一封电子邮件。

+0

非常感谢您的反馈。我得到很多的错误无法找到类型或命名空间名称'词典'(你是否缺少使用指令或程序集引用?) – Musa 2015-02-06 20:58:18

+0

@Musa我没有使用我的代码中的字典,那是伊戈尔的回答。但是这个字典与我使用的List 类在同一个命名空间中。右键单击字典或列表,然后让Visual Studio通过单击“解决”为其添加参考,然后选择“using System.Collections.Generic;”选项(这是您未来应如何解决该类型的缺失命名空间错误)。或者手动添加'使用System.Collections.Generic;'到你的类的顶部。 – mason 2015-02-06 20:59:53

相关问题