C# Sending Email with attached file (image)

2019-06-22 08:06发布

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?

2条回答
叼着烟拽天下
2楼-- · 2019-06-22 08:51

@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

查看更多
Root(大扎)
3楼-- · 2019-06-22 09:00

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

查看更多
登录 后发表回答