发送包含存储在数据库中的多个附件的电子邮件(ASP.NET C#)

Posted

技术标签:

【中文标题】发送包含存储在数据库中的多个附件的电子邮件(ASP.NET C#)【英文标题】:Sending email with multiple attachments stored in database (ASP.NET C#) 【发布时间】:2014-05-10 07:15:21 【问题描述】:

我希望发送包含多份简历的电子邮件。每个学生都有一份个人资料,上面附有他们的简历(有些学生不止一份),这些都存储在数据库中。用户搜索符合特定条件的学生并将学生简历通过电子邮件发送给潜在雇主。

数据库:

cvID - int
UserName - varchar(50)
FileName - varchar(50)
FileType - nvarchar(50)
Data - varbinary(MAX)

进行搜索时,相应的学生会在结果中显示每个学生的可用简历下拉框。用户从他们希望附加到电子邮件的下拉框中选择简历,单击“附加”,然后将该文件名添加到电子邮件区域的列表框中。

一旦用户选择了他们希望附加的所有简历,他们就会填写剩余的电子邮件字段...收件人、发件人、主题、消息等。当用户单击“发送”时,我需要代码来附加文件从数据库中的 ListBox 中列出并发送电子邮件。

ASPX.CS 页面 使用 System.Net.Mail

protected void emlSend_Click(object sender, EventArgs e)

    MailMessage email = new MailMessage();

    email.From = new MailAddress(txtFrom.Text);
    email.To.Add(txtTo.Text);
    email.Subject = txtSub.Text;
    email.Body = txtMsg.Text;

    //Loop through lstFiles to get all values
    foreach (ListItem item in lstFiles.Items)
    
        if (item.Selected)
        
            //Save value to string
            string lstItem = item.Text;
            string lstValue = item.Value;

            //Connect to Server
            string constr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            
                using (SqlCommand cmd = new SqlCommand())
                
                    //Use value in Select statement
                    cmd.CommandText = "SELECT FileName, FileType, Data from CVData where cvID = '" + lstValue + "'";
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    
                        //Get CV Data
                        sdr.Read();
                        bytes = (byte[])sdr["Data"];
                        fileName = sdr["FileName"].ToString();

                        //Attach Data as Email Attachment
                        email.Attachments.Add(... //This is where I am now stuck

                    
                    con.Close();
                
            
        

使用下面...

email.Attachments.Add(new Attachment(new MemoryStream(bytes, fileName)));

给我这个错误:

编译器错误消息: CS1502:'System.IO.MemoryStream.MemoryStream(byte[], bool)' 的最佳重载方法匹配有一些无效参数

如果我以错误的方式尝试此操作,请告诉我。这是我第一次尝试做这样的事情,所以任何帮助将不胜感激!

【问题讨论】:

yangliuaspnet.blogspot.com/2013/02/… 【参考方案1】:

您需要使用 System.Net.Mail 命名空间。 System.Web.Mail.MailMessage 已过时。

下面是您将附件添加到 MailMessage 的方法。

// assumption is that the dropdown values contain a key to the file
// contents (resume) in the DB and the contents are retrieved as a 
// byte array.

if (lstFiles != null)

 foreach (var fileName in lstFiles)
 
  int cvId = 42; // can come from dropdown etc. basically a key to the file.
  byte[] resumeBytes = GetResumeFromDatabaseAsBytes(cvId);
  email.Attachments.Add(new Attachment(new MemoryStream(resumeBytes, fileName)));
 


public static byte[] GetResumeFromDatabaseAsBytes(int cvID)

 var connectionString = "YOUR_CONNECTION_STRING";

 using (var sqlConnection = new SqlConnection(connectionString))
 
     using (var sqlCommand = new SqlCommand("SELECT TOP 1 FileName, FileType, Data From  RESUME_TABLE_NAME Where cvID = " + cvID, sqlConnection))
    
        using (var reader = sqlCommand.ExecuteReader())
        
            if (reader.Read())
            
                // e.g. John_Doe.docx
                string fileName = reader["FileName"].ToString() + "." + reader["FileType"].ToString();
                byte[] cvData = (byte[])reader["Data"];

                //return cvData;
            
        
    
 

以上只是获取简历内容的示例。您可以通过传递正确的参数在 1 次调用中获取所有简历。让我们知道您使用的数据访问方法。

【讨论】:

感谢您迄今为止的帮助。我不确定如何处理“GetResumeFromDatabaseAsBytes(fileName); part... 这是一种以字节格式获取简历内容的方法。简历存储在哪里以及如何存储?例如在数据库列中? 是的,作为二进制数据存储在此问题/帖子顶部的数据库中 您可以使用标准 SQL 检索代码,使用 ADO.NET 或 Linq2SQl 或 EF。 (无论您使用什么).. 我的答案中有一个示例代码 我在 foreach (var fileName in lstFiles) 行上遇到错误:编译器错误消息:CS1579:foreach 语句无法对“System.Web.UI.WebControls.ListBox”类型的变量进行操作因为“System.Web.UI.WebControls.ListBox”不包含“GetEnumerator”的公共定义。我错过了什么?【参考方案2】:
protected void emlSend_Click(object sender, EventArgs e)


    byte[] bytes;
    string fileName;

    MailMessage email = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("attgmail");

    email.From = new MailAddress(txtFrom.Text);
    email.To.Add(txtTo.Text);
    email.Subject = txtSub.Text;
    email.Body = txtMsg.Text;

    //Loop through lstFiles to get all values
    foreach (ListItem item in lstFiles.Items)
    
        if (item.Selected)
        
            //Save value to string
            string lstItem = item.Text;
            string lstValue = item.Value;

            //Connect to Server
            string constr = ConfigurationManager.ConnectionStrings["fishbowlConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            
                using (SqlCommand cmd = new SqlCommand())
                
                    //Use value in Select statement
                    cmd.CommandText = "SELECT FileName, FileType, Data from CVData where cvID = '" + lstValue + "'";
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    
                        //Get CV Data
                        sdr.Read();
                        bytes = (byte[])sdr["Data"];
                        fileName = sdr["FileName"].ToString();

                        //This works if files are stored in folder instead of the below code
                        //Attachment resume = new Attachment(Server.MapPath(VirtualPathUtility.ToAbsolute("~/images/cv/" + fileName)));

                        //Attach Data as Email Attachment
                        MemoryStream pdf = new MemoryStream(bytes);
                        Attachment data = new Attachment(pdf, fileName);
                        email.Attachments.Add(data);
                    
                    con.Close();
                
            
        
    

    //send the message
    SmtpClient smtp = new SmtpClient();
    smtp.Send(email);

    lblEmail.Text = "Email was sent Successfully";

【讨论】:

以上是关于发送包含存储在数据库中的多个附件的电子邮件(ASP.NET C#)的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 在电子邮件中发送多个附件

使用命令行和 sendmail 发送带有多个附件的电子邮件

打开包含多个附件的电子邮件,同时将选择器限制为仅电子邮件应用程序?

iTextSharp - 在电子邮件附件中发送内存中的 pdf

如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件

Biztalk:包含映射到 CSV 的电子邮件的 XML,作为附件发送