【问题标题】:How to attach a file to an email in c#如何在c#中将文件附加到电子邮件中
【发布时间】:2012-07-12 14:24:45
【问题描述】:

您好,我相信我非常接近于找出我的代码出了什么问题,但希望有人可以帮助我或为我指明正确的方向。我能够运行我的程序,并且在用户将要上传文件的页面上,它让我可以选择文件。但是当我按下提交时,其他信息会发送给我,但文件永远不会出现。我认为这是因为当文件发送到我的电子邮件时,我无法确定将文件临时保存在哪里。这是我目前的代码:

此代码还用于我网站上的评论/请求页面,用户可以在其中评论并添加屏幕截图。

private string SendMessage(string strTo, string strFrom, string strSubject, string    strMessage, string strAttachment, string strBCC)
{
    try
    {
        MailMessage mailMsg;
        string strEmail = "";
        string strSmtpClient = ConfigurationManager.AppSettings["SmtpClient"];
        string[] arrEmailAddress = strTo.Split(';');
        for (int intCtr = 0; intCtr < arrEmailAddress.Length; intCtr++)
        {
            strEmail = "";
            if (arrEmailAddress[intCtr].ToString().Trim() != "")
            {
                strEmail = arrEmailAddress[intCtr].ToString().Trim();
                mailMsg = new MailMessage(strFrom, strEmail, strSubject, strMessage);
                mailMsg.IsBodyHtml = true;
                if (!strBCC.Trim().Equals(string.Empty))
                    mailMsg.Bcc.Add(strBCC);

                SmtpClient smtpClient = new SmtpClient(strSmtpClient);
                smtpClient.UseDefaultCredentials = true;
                smtpClient.Port = 25;

                smtpClient.Send(mailMsg);
                mailMsg.Dispose();
            }
        }
        return "Message sent to " + strTo + " at " + DateTime.Now.ToString() + ".";
    }
    catch (Exception objEx)
    {
        return objEx.Message.ToString();
    }

    string strUpLoadDateTime = System.DateTime.Now.ToString("yyyyMMddHHmmss");
    string strFileName1 = string.Empty;
    if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
    {
        string strUploadFileName1 = File1.PostedFile.FileName;
        strFileName1 = strUpLoadDateTime + "." + Path.GetFileNameWithoutExtension(strUploadFileName1) + Path.GetExtension(strUploadFileName1);
        strFileName1 = strFileName1.Replace("'", "");
        string strSaveLocation = Server.MapPath("") + "\\" + strFileName1;
        File1.PostedFile.SaveAs(strSaveLocation);
        txtComments.Text = "The file has been uploaded";
    }

我的问题是我在哪里出错了,我应该将文件放在我希望保存文件的位置。

以下部分代码是我在发送电子邮件时用来格式化电子邮件的部分。并选择将在电子邮件中发送的内容。

protected void Submit_Click1(object sender, EventArgs e)
{
    try
    {
        string dandt = System.DateTime.Now.ToString("yyyyMMddHHmmss");
        string strMessage = "Bug Name: " + txtBugName.Text.Trim() + "<br/>" +
                     "Module Name: " + ddlModule.SelectedValue + "<br/>" +
                     "Page Name: " + ddlPage.SelectedValue + "<br/>" +
                     "Description: " + txtComments.Text.Trim() + "<br/>" +
                      File1.f + "<br/>" +
                      "Email is" + " " + txtemail.Text.Trim() + "<br/>" +
                      "The request was sent at" + dandt;  

        SendMessage(ConfigurationManager.AppSettings["EmailAddrTo"],
            ConfigurationManager.AppSettings["EmailAddrFrom"],
            txtBugName.Text.Trim(),
            strMessage, "", "");
    }
    catch 
    {
    }
}

由于某种原因,当我按下提交时,我的电子邮件中没有发送任何内容。我还试图弄清楚如何在电子邮件中输入电子邮件的发送时间和日期。尽管很明显我的电子邮件会包含这些信息,但如果电子邮件由于某种原因被延迟,我希望知道用户按下提交按钮的时间和日期。 File.F 在这部分代码中的位置是我试图弄清楚如何将文件附件发送到电子邮件的地方,但我不确定代码中应该使用什么语法。

【问题讨论】:

  • 无论如何,使用System.Text.StringBuild 代替如此大的字符串连接。会更快!
  • 你建议我用哪个部分替换它?
  • System.Text.StringBuilder - var sb = new StringBuilder(); sb.Add("someText");等等等等 sb.ToString(); - 虽然与这个问题并不相关,但我不会真正优化代码,直到它起作用哈哈:D
  • 好点是的,在我尝试改变(并且可能搞砸)其他东西之前,我会尝试让这个工作正常进行。谢谢你的意见,我很感激一切
  • 我看不到你在哪里使用“strAttachment”!在我看来,您没有使用此变量。

标签: c# email attachment


【解决方案1】:

您似乎正在尝试将用户计算机中的某些文件附加到您发送的电子邮件中。如果是这种情况,您需要先上传文件,然后再致电SendMessage.

在您的Submit_Click 中,您需要做的第一件事是将文件上传到某处的代码。另外,从strMessage 中删除File1.f,我怀疑这会导致您的消息对您无效。

上传文件后,将 strSavedLocation(您保存文件的文件位置)传递给您的 SendMessage() 方法。

在您的SendMessage 方法中,您可以在构建MailMessage 的位置附加带有以下代码的文件。 strAttachment 是您上传文件的路径名:

var attachment = new Attachment(strAttachment);
// Add time stamp information for the file.
ContentDisposition disposition = attachment.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(strAttachment);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(strAttachment);
disposition.ReadDate = System.IO.File.GetLastAccessTime(strAttachment);
mailMsg.Attachments.Add(attachment);

【讨论】:

  • 好的,谢谢,我想我明白了。绝对是个问题。谢谢,如果你有时间请回来看看编辑:我到底把你给我的代码放在哪里?再次感谢您!
  • @user1486774,Buck 的答案的代码排列如下所述;只需用我的答案中的代码块替换以/*** Added mail attachment... 开头的三行。另外,不要忘记您需要调用 mailMsg.Attachments.Add(attachment) 才能将文件实际附加到您的 MailMessage.
  • 非常感谢。我也添加了您告诉我的所有内容,并且收到了最后一条错误消息。 contentDisposition 带有红色下划线,错误消息显示:找不到类型或命名空间名称“contentdisposition”(您是否缺少 using 指令或程序集引用?)这是什么意思?这表明我需要改变什么?
  • @user1486774,这意味着您在代码顶部缺少using 指令。 using System.Net.Mime
  • 谢谢布拉德。只是想说声谢谢,你是个好人如果有什么办法可以报答你,让我知道
【解决方案2】:

在我看来,这里的主要部分减去了方便的 System.Net.Mail.Attachment。

如果我这样做,我会将文件上传处理代码移动到 Submit_Click 处理程序中,然后只需添加 Mail.Attachment 代码。

    private string SendMessage(string strTo, string strFrom, string strSubject, string strMessage, string strAttachment, string strBCC)
    {
        try
        {
            System.Net.Mail.MailMessage mailMsg;
            string strEmail = "";
            string strSmtpClient = ConfigurationManager.AppSettings["SmtpClient"];
            string[] arrEmailAddress = strTo.Split(';');
            for (int intCtr = 0; intCtr < arrEmailAddress.Length; intCtr++)
            {
                strEmail = "";
                if (arrEmailAddress[intCtr].ToString().Trim() != "")
                {
                    strEmail = arrEmailAddress[intCtr].ToString().Trim();
                    mailMsg = new MailMessage(strFrom, strEmail, strSubject, strMessage);
                    mailMsg.IsBodyHtml = true;
                    if (!strBCC.Trim().Equals(string.Empty))
                        mailMsg.Bcc.Add(strBCC);

                    /*** Added mail attachment handling ***/    
                    System.Net.Mail.Attachment attachment;
                    attachment = new System.Net.Mail.Attachment(strAttachment);
                    mailMsg.Attachments.Add(attachment);

                    SmtpClient smtpClient = new SmtpClient(strSmtpClient);
                    smtpClient.UseDefaultCredentials = true;
                    smtpClient.Port = 25;

                    smtpClient.Send(mailMsg);
                    mailMsg.Dispose();
                }
            }
            return "Message sent to " + strTo + " at " + DateTime.Now.ToString() + ".";
        }
        catch (Exception objEx)
        {
            return objEx.Message.ToString();
        }
    }

    protected void Submit_Click1(object sender, EventArgs e)
    {
        try
        {
            /*** Moved from SendMessage function ****/
            string strUpLoadDateTime = System.DateTime.Now.ToString("yyyyMMddHHmmss");
            string strFileName1 = string.Empty;
            if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength > 0))
            {
                string strUploadFileName1 = File1.PostedFile.FileName;
                strFileName1 = strUpLoadDateTime + "." + Path.GetFileNameWithoutExtension(strUploadFileName1) + Path.GetExtension(strUploadFileName1);
                strFileName1 = strFileName1.Replace("'", "");
                string strSaveLocation = Server.MapPath("") + "\\" + strFileName1;
                File1.PostedFile.SaveAs(strSaveLocation);
                txtComments.Text = "The file has been uploaded";
            }

            string dandt = System.DateTime.Now.ToString("yyyyMMddHHmmss");
            string strMessage = "Bug Name: " + txtBugName.Text.Trim() + "<br/>" +
                         "Module Name: " + ddlModule.SelectedValue + "<br/>" +
                         "Page Name: " + ddlPage.SelectedValue + "<br/>" +
                         "Description: " + txtComments.Text.Trim() + "<br/>" +
                          strSaveLocation + "<br/>" +
                          "Email is" + " " + txtemail.Text.Trim() + "<br/>" +
                          "The request was sent at" + dandt;


            SendMessage(ConfigurationManager.AppSettings["EmailAddrTo"],
                ConfigurationManager.AppSettings["EmailAddrFrom"],
                txtBugName.Text.Trim(),
                strMessage, strSaveLocation, "");
        }
        catch
        {
        }
    }

关于使用StringBuilder的说明,我同意,我会这样使用:

System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendFormat("Bug Name: {0}<br/>", txtBugName.Text.Trim());
sb.AppendFormat("Module Name: {0}<br/>", ddlModule.SelectedValue);       

编辑添加: 另外,请参阅上面关于使用 ContentDisposition 的 Brad 的回答。

【讨论】:

  • 非常感谢我对编码非常陌生,并且将这段代码放在一起观看了许多教程。所以我知道这很糟糕,但我什至不明白我自己的所有代码到底是做什么的。那么添加你建议的内容会做什么?
  • new System.Net.Mail.Attachment(strAttachment) 代码将使用您传入的字符串路径创建一个 .NET 附件对象。mailMsg.Attachments.Add 实际上将附加在路径 strAttachment 中找到的文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2014-07-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多