5

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?

ChrisRun
  • 993
  • 1
  • 10
  • 24

2 Answers2

1

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

Troopers
  • 5,127
  • 1
  • 37
  • 64
1

@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("from@gmail.com"),
            Subject = "This is subject.",
            Body = "This is text.",
            IsBodyHtml = true,
            To = { "to@someDomain.com" }
        })
        {
            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

Eulogy
  • 197
  • 1
  • 1
  • 14
  • First: Thank you for your opinion. Second: Did not work with the ContentType as parameter either. – ChrisRun Jan 14 '16 at 14:07
  • @ChrisRun, I edited my previous answer with a working code. Let me know if it works for you. – Eulogy Jan 14 '16 at 15:54
  • sorry, still doesn't work. The only solution I found was to first save the file on the server and then set the path to the physical location of that file. – ChrisRun Jan 19 '16 at 07:24
  • Thats weird. it works for me, saving the file on the server not makes sense. – Eulogy Jan 19 '16 at 12:21