簡體   English   中英

如何在C#中將文件附加到電子郵件

[英]How to attach a file to an email in c#

嗨,我相信我幾乎可以弄清楚我的代碼有什么問題,但我希望有人可以幫助我或為我指出正確的方向。 我能夠運行我的程序,並且在用戶將要上傳文件的頁面上,它為我提供了選擇文件的選項。 但是,當我按提交時,其他信息會發送給我,但文件永遠不會出現。 我認為這是因為我很難確定文件發送到我的電子郵件后在哪里臨時保存文件。 這是我目前的代碼:

此代碼還用於在我的網站上提供評論/請​​求頁面,用戶可以在其中評論並添加屏幕截圖。

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表示的位置是我試圖弄清楚如何將附件發送到電子郵件的地方,但是我不確定代碼中應該使用哪種語法。

您似乎正在嘗試將用戶計算機中的某些文件附加到您發送的電子郵件中。 在這種情況下,您需要先上載文件,然后再調用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);

在我看來,您這里的主要部分要減去方便的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的回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM