static string ReplaceEmbeddedImages(string htmlBody, AttachmentCollection attachments) { var srcPattern = "(?<=<img.+?src=[\"'])" + "(.+?)" + "(?=[\"'].*?>)"; // Iterate through "src" attributes from HTML images in reverse order. foreach (var match in Regex.Matches(htmlBody, srcPattern, RegexOptions.IgnoreCase).Cast <Match>().Reverse()) { var imageId = match.Value.Replace("cid:", ""); Attachment attachment = attachments.FirstOrDefault(a => a.ContentId == imageId); if (attachment != null) { // Create inlined image data. E.g. "data:image/png;base64,AABBCC..." ContentEntity entity = attachment.MimeEntity; var embeddedImage = entity.Charset.GetString(entity.Content); var embeddedSrc = $"data:{entity.ContentType};{entity.TransferEncoding},{embeddedImage}"; // Replace "src" attribute with inlined image. htmlBody = $"{htmlBody.Substring(0, match.Index)}{embeddedSrc}{htmlBody.Substring(match.Index + match.Length)}"; } } return(htmlBody); }