Search code examples
c#imageemail-attachments

How to attach multi images in email body in windows application?


I am working on windows application for email sending. For text formatting i used tinymce editor for email body.

Used tinymce insert image functionality for adding image in email body but when email is sent to user. Images does not appear in user email body.

Then i tried to add base64 image manually as below:

<img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOYAAABLCAYAAABk6PuLAAAACXBIWXMAASdHAAEnRwEEDs /'>

Which is failed to load images.

Can we use linked resources and alternate view in tiny mce?

How to load images in email body?


Solution

  • Tiny MCE is just an HTML editor and not a tool which can be used for creating alternate views for email.

    Moreover, all email clients don't support inline images (with data URL).

    Alternate view is the only way to ensure that all email clients will be able to show your content in the intended manner.

    Create a dictionary of linked resources:

    Dictionary<string, byte[]> linkedResources = new Dictionary<string, byte[]>();
    linkedResources.Add("img1", byte[]);
    

    Create a common method to send email:

    public bool SendEmail(Dictionary<string, byte[]> linkedResources)
    {
     using (SmtpClient mailSender = new SmtpClient("SmtpHost", 22))
     {
        MailMessage emailMessage = new MailMessage()
        {
            Subject = "Subject",
            SubjectEncoding = Encoding.ASCII,
            IsBodyHtml = true,
            Body = "Message",
            BodyEncoding = Encoding.ASCII,
            From = new MailAddress("Sender@domain.com")
        };
    
        emailMessage.BodyEncoding = Encoding.ASCII;
        emailMessage.IsBodyHtml = true;
        AlternateView av = AlternateView.CreateAlternateViewFromString(emailMessage.Body, null, MediaTypeNames.Text.Html);
    
        foreach (var item in linkedResources)
        {
            MemoryStream streamBitmap = new MemoryStream(item.Value);
            var linkedResource = new LinkedResource(streamBitmap, MediaTypeNames.Image.Jpeg);
            linkedResource.ContentId = item.Key;
            av.LinkedResources.Add(linkedResource);
        }
        emailMessage.AlternateViews.Add(av);
        mailSender.Send(emailMessage);
    
        return true;
     }
    }