【发布时间】:2018-08-23 10:27:53
【问题描述】:
我有一个邮件程序,我想在其中向多个收件人发送邮件。收件人可以来自数据库或 Excel 工作表。这是代码:
protected void btnSubmit_Click(object sender, EventArgs e)
{
GetAllRecipient();
Msg = null;
ClientScript.RegisterStartupScript(GetType(), "alert", "alert('Email sent.');", true);
}
public void SendHTMLMail()
{
StreamReader reader = new StreamReader(Server.MapPath("~/one.html"));
string readFile = reader.ReadToEnd();
Regex regx = new Regex("(?<!src=\")http(s)?://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*([a-zA-Z0-9\\?\\#\\=\\/]){1})?", RegexOptions.IgnoreCase);
string output = regx.ToString();
output = readFile;
Msg.Body = output.ToString();
Msg.IsBodyHtml = true;
int i = 0;
string username = Server.UrlEncode(this.txtUsername.Text);
output = regx.Replace(output, new MatchEvaluator((match) =>
{
var url = Uri.EscapeDataString(match.Value.ToString());
url = url.Replace("%3F", "&").Replace("%3D", "=");
return $"http://localhost4654/two?sender={username}&link={url}&mailer_id={i}";
}));
Msg.From = new MailAddress(txtUsername.Text);
Msg.Subject = null;
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential(txtUsername.Text, txtpwd.Text);
smtp.EnableSsl = true;
}
public void GetAllRecipient()
{
if (RadioButton1.Checked)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT address FROM address1";
cmd.Connection = sql;
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
sql.Open();
da.Fill(dt);
sql.Close();
for (int a = 0; a < dt.Rows.Count; a++)
{
foreach (DataRow row in dt.Rows)
{
Msg.To.Add(row["address"].ToString());
SendHTMLMail();
}
}
}
else if (RadioButton2.Checked)
{
string connectionString = "";
if (FileUpload1.HasFile)
{
string fileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
string fileExtension = Path.GetExtension(FileUpload1.PostedFile.FileName);
string fileLocation = Server.MapPath("~/App_Data/" + fileName);
FileUpload1.SaveAs(fileLocation);
if (fileExtension == ".xls")
{
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
}
else if (fileExtension == ".xlsx")
{
connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
}
OleDbConnection con = new OleDbConnection(connectionString);
OleDbCommand cmd = new OleDbCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.Connection = con;
OleDbDataAdapter dAdapter = new OleDbDataAdapter(cmd);
DataTable dt = new DataTable();
con.Open();
DataTable dtExcelSheetName = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
string getExcelSheetName = dtExcelSheetName.Rows[0]["Table_Name"].ToString();
cmd.CommandText = "SELECT address FROM [" + getExcelSheetName + "]";
dAdapter.SelectCommand = cmd;
dAdapter.Fill(dt);
con.Close();
for (int a = 0; a < dt.Rows.Count; a++)
{
foreach (DataRow row in dt.Rows)
{
Msg.To.Add(row["address"].ToString());
SendHTMLMail();
smtp.Send(Msg);
}
}
}
}
else if (RadioButton3.Checked)
{
if (FileUpload2.HasFile)
{
string fileName = Path.GetFileName(FileUpload2.PostedFile.FileName);
string fileLocation = Server.MapPath("~/App_Data/" + fileName);
FileUpload2.SaveAs(fileLocation);
StreamReader sr = new StreamReader(fileLocation);
String line = sr.ReadToEnd();
string[] toAddressArray;
toAddressArray = line.Split(new char[] { ' ' });
foreach (string a in toAddressArray)
{
Msg.To.Add(a);
}
}
}
}
我面临的问题是 - 当我发送邮件时,它会在同一封邮件中发送给所有收件人,而不是单独发送。我怎样才能分开发送邮件,以便没有两个收件人互相认识。 此外,在我作为邮件正文发送的 HTML 页面中,有一些链接。当收件人单击任何链接时,我将在文本框“rep.text”中检索他的邮件 ID。因此,即使单击链接的人是第 4 位或第 5 位,我也会从收件人列表中获取姓氏。当我使用密件抄送时也会发生这种情况。
【问题讨论】:
-
使用 Msg.Bcc.Add 不要使用 Msg.To.Add
-
但在这里我还要做一件事。在我作为邮件正文发送的 html 页面中,有一些链接。当收件人单击任何链接时,我正在检索他的邮件 ID。所以,在使用密件抄送的同时,我会从密件抄送列表中获取姓氏,即使点击链接的人是第 4 位或第 5 位
-
我已经编辑了代码@AdinugrahaTawaqal
-
遍历所有用户并向每个用户发送一封电子邮件,以便他们获得唯一的链接。
-
因为我是这个平台的新手,所以我对 .net 了解不多。你能提供代码吗? @Scrobi
标签: c# .net sql-server smtp oledbconnection