File in use after email as attachment

I made a form where the user can fill it out, browser for a file, and then click submit.  I have it setup so the form data is emailed to me along with the attachment.  It works except I can not delete the attachment from the server because it is still in use.  Why is the file still in use after emailing it out?  If I remove this line   (upload the attachment but dont send it in the email)  then the file is not in use and I can delete it after.)  Why when I add the following line is the file in use after and can not be deleted??

message.Attachments.Add(new Attachment(strdir + strfilename));
LVL 7
Kurt4949Asked:
Who is Participating?
 
Bob LearnedConnect With a Mentor Commented:
If you create a 'using' block, the message should be disposed upon completion.  If you force garbage collection (used judiciously), then it should release the resources immediately.

void submitForm(Object s, EventArgs e)
    {
        if (Page.IsValid == true)
        {

            string fromEmail;
            string toEmail;
            string userHostAddress = "";


            string strdir = "D:\\wwwTesting\\files\\upload\\";
            string strfilename = Path.GetFileName(txtFile.PostedFile.FileName);
            txtFile.PostedFile.SaveAs(strdir + strfilename);
           

            fromEmail = "webmaster@me.com";
            toEmail = "kurt@me.com";
            //get IP Address
            userHostAddress = Request.UserHostAddress;

            // System.Net.Mail.SmtpClient is the new class in 2.0
            SmtpClient smtpClient = new SmtpClient();
            using (MailMessage message = new MailMessage())
            {
                       
               try
              {
                 smtpClient.Host = "localhost";
                 smtpClient.Port = 25;
                 message.From = new MailAddress(fromEmail);

                 message.To.Add(toEmail);
                 message.Subject = " Form Submission";
 
                //Begin - Message body content
                message.IsBodyHtml = true;

            //html message body
            message.Body = "<html>" +
                           "<head>" +
                           "<title>Form Submission</title>" +
                           "</head>" +

                           "<body>" +
                           "<font face=\"Arial, Helvetica, sans-serif\" size=\"2\">" +
                           "<b>Form Submission</b><br /><br />" +
                           "<b>Salutation:</b>    " + salutation.Text +
                            "<br /><b>First name:</b>   " + fName.Text +
                            "<br /><b>Last name:</b>     " + lName.Text +
                            "<br /><br /><b>Comments:</b><br /> " + comments.Text +
                            "</font></body></html>";

            //End - Message body content
       
            //Attach File
            message.Attachments.Add(new Attachment(strdir + strfilename));


            // Send SMTP mail
            smtpClient.Send(message);

            // on success hide / show panels
            lblStatus.Text = "Email successfully sent.";
            panelContactForm.Visible = false;
            panelThankYou.Visible = true;

            }
            catch (Exception ex)
            {
                lblStatus.Text = "Send Email Failed.<br>" + ex.Message;

            }


            }// end using      

            // Force garbage collection to close the message immediately.
            GC.Collect();
           
            //Uploaded file deleted after sending e-mail
                File.Delete(strdir + strfilename);

        }//end if Page.IsValid

    }

Bob
0
 
Bob LearnedCommented:
.NET version?  2002, 2003, or 2005?

Bob
0
 
Bob LearnedCommented:
Should it be MailAttachment, instead of Attachment?

Bob
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 
Kurt4949Author Commented:
For example if I tell asp.net to delete the file after then I get this error


 Exception Details: System.IO.IOException: The process cannot access the file 'D:\wwwTesting\promessInc\upload\forms.css' because it is being used by another process.

Source Error:

Line 114:
Line 115:            //Uploaded file deleted after sending e-mail
Line 116:                File.Delete(strdir + strfilename);
Line 117:      
Line 118:            
0
 
Kurt4949Author Commented:
asp.net 2.0 with C#
0
 
Kurt4949Author Commented:
I believe that line is correct.  I"m using System.Net.Mail

example here http://www.systemnetmail.com/faq/2.3.aspx 
0
 
davehunt00Commented:
Here's a similar set of code I use. r2("Attachment") is a field with the file name.  You might want to add the Try Catch stuff in case you ever hit an exception.

        If (r2("Attachment").ToString <> "") Then
            Dim MsgAttachmentPath As String = Server.MapPath(r2("Attachment").ToString)
            Dim attachment As System.Web.Mail.MailAttachment                  
            Try
                attachment = New System.Web.Mail.MailAttachment(MsgAttachmentPath)
                emailMessage.Attachments.Add(attachment)
            Catch ex As Exception
                Dim sb As New System.Text.StringBuilder
                sb.Append("my note about where this occurs")
                sb.Append("Message: " & ex.Message.ToString)
                sb.Append("InnerException: " & ex.InnerException.ToString)
                sb.Append("Target site: " & ex.TargetSite.Name.ToString)
                sb.Append("Stack Trace: " & ex.StackTrace.ToString)
                exString = sb.ToString
                SendErrorEmail(exString)
            End Try
        End If

Hope that helps.  
Dave
0
 
Bob LearnedCommented:
Yeah, what happens if you use System.Web.Mail, instead of System.Net.Mail?

Bob
0
 
Kurt4949Author Commented:
Here is my code.  It works perfect execpt that I can not delete the attachement after.  I even get the email with the attachment.    


void submitForm(Object s, EventArgs e)
    {
        if (Page.IsValid == true)
        {

            string fromEmail;
            string toEmail;
            string userHostAddress = "";


            string strdir = "D:\\wwwTesting\\files\\upload\\";
            string strfilename = Path.GetFileName(txtFile.PostedFile.FileName);
            txtFile.PostedFile.SaveAs(strdir + strfilename);
           

            fromEmail = "webmaster@me.com";
            toEmail = "kurt@me.com";
            //get IP Address
            userHostAddress = Request.UserHostAddress;


            // System.Net.Mail.SmtpClient is the new class in 2.0
            SmtpClient smtpClient = new SmtpClient();
            MailMessage message = new MailMessage();
           
           
            try
            {
              smtpClient.Host = "localhost";
            smtpClient.Port = 25;
            message.From = new MailAddress(fromEmail);

            message.To.Add(toEmail);
            message.Subject = " Form Submission";
 
            //Begin - Message body content
            message.IsBodyHtml = true;

            //html message body
            message.Body = "<html>" +
                           "<head>" +
                           "<title>Form Submission</title>" +
                           "</head>" +

                           "<body>" +
                           "<font face=\"Arial, Helvetica, sans-serif\" size=\"2\">" +
                           "<b>Form Submission</b><br /><br />" +
                           "<b>Salutation:</b>    " + salutation.Text +
                            "<br /><b>First name:</b>   " + fName.Text +
                            "<br /><b>Last name:</b>     " + lName.Text +
                            "<br /><br /><b>Comments:</b><br /> " + comments.Text +
                            "</font></body></html>";

            //End - Message body content
       
            //Attach File
            message.Attachments.Add(new Attachment(strdir + strfilename));


            // Send SMTP mail
            smtpClient.Send(message);

            // on success hide / show panels
            lblStatus.Text = "Email successfully sent.";
            panelContactForm.Visible = false;
            panelThankYou.Visible = true;

            }
            catch (Exception ex)
            {
                lblStatus.Text = "Send Email Failed.<br>" + ex.Message;

            }


            //Uploaded file deleted after sending e-mail
                File.Delete(strdir + strfilename);
     
           
        }//end if Page.IsValid

    }

</script>
0
 
davehunt00Commented:
More as a guess than anything, try clearing the attachments.

So, before File.Delete, try Message.Attachments.Clear


0
 
Kurt4949Author Commented:
Hi Bob,

The using blocked did the trick. Thanks!

using (MailMessage message = new MailMessage())
            {
}


Kurt
0
All Courses

From novice to tech pro — start learning today.