ChrisRun
ChrisRun

Reputation: 993

C# Sending Email with attached file (image)

My method sends an email using a SMTP Relay Server.

Everything works fine (the email gets sent), except for that the attached file (the image) is somehow compressed/notexistent and not able to retrieve from the email.

The method looks like this:

public static bool SendEmail(HttpPostedFileBase uploadedImage)
        {
            try
            {              
                var message = new MailMessage() //To/From address
                {
                    Subject = "This is subject."
                    Body = "This is text."
                };                             

                    if (uploadedImage != null && uploadedImage.ContentLength > 0)
                    {
                        System.Net.Mail.Attachment attachment;
                        attachment = new System.Net.Mail.Attachment(uploadedImage.InputStream, uploadedImage.FileName);
                        message.Attachments.Add(attachment);
                    }
                message.IsBodyHtml = true;

                var smtpClient = new SmtpClient();
                //SMTP Credentials
                smtpClient.Send(message);
                return true;
            }
            catch (Exception ex)
            {
            //Logg exception
                return false;
            }
        }
  1. The uploadedImage is not null.
  2. ContentLength is 1038946 bytes (correct size).

However, the email that is being sent contains the image as an attachment with correct filename, although it's size is 0 bytes.

What am I missing?

Upvotes: 5

Views: 3349

Answers (2)

Eulogy
Eulogy

Reputation: 317

@ChrisRun,

  1. You should change the parameter HttpPostedFileBase as byte[] for example. This way you could re-use your class in more places.
  2. Try changing FileName for ContentType and add the MediaTypeNames.Image.Jpeg.
  3. Also, add the using directive for dispose the MailMessage and SmtpClient

        using (var message = new MailMessage
        {
            From = new MailAddress("[email protected]"),
            Subject = "This is subject.",
            Body = "This is text.",
            IsBodyHtml = true,
            To = { "[email protected]" }
        })
        {
            if (imageFile != null && imageFile.ContentLength > 0)
            {
                message.Attachments.Add(new Attachment(imageFile.InputStream, imageFile.ContentType, MediaTypeNames.Image.Jpeg));
            }
    
            using (var client = new SmtpClient("smtp.gmail.com")
            {
                Credentials = new System.Net.NetworkCredential("user", "password"),
                EnableSsl = true
            })
            {
                client.Send(message);
            }
        }
    

Cheers

Upvotes: 1

Troopers
Troopers

Reputation: 5452

The second parameter of constructor of System.Net.Mail.Attachment is not the file name. It's the content type. And perhaps ensure your stream position is 0 before to create attachment

Upvotes: 1

Related Questions