Currently I have to send emails with MailMessage and SmtpClient but I need to send a picture that is currently in base64 string within the MailAddress body.
I have understood that it is necessary to put it in the Attachment, but I don’t know how to put base64 in MailMessage class and then read it in order to visualize image in the body of the email. I don’t have url image path.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Completed method to convert a body HTML to an AlternateView
bodyHtml example (you can pass it into the MailMessage code block below)
<p>example</p> <p><img src= "data:image/jpeg;base64,---base64string---"></p> <p>example</p> <p><img src= "data:image/png;base64,---base64string---"></p> <p>something</p>
With this method, you can visualize multiple images by many ESPs (gmail, outlook,…)
private static AlternateView ContentToAlternateView(string content)
{
var imgCount = 0;
List<LinkedResource> resourceCollection = new List<LinkedResource>();
foreach (Match m in Regex.Matches(content, "<img(?<value>.*?)>"))
{
imgCount++;
var imgContent = m.Groups["value"].Value;
string type = Regex.Match(imgContent, ":(?<type>.*?);base64,").Groups["type"].Value;
string base64 = Regex.Match(imgContent, "base64,(?<base64>.*?)"").Groups["base64"].Value;
if (String.IsNullOrEmpty(type) || String.IsNullOrEmpty(base64))
{
//ignore replacement when match normal <img> tag
continue;
}
var replacement = " src="cid:" + imgCount + """;
content = content.Replace(imgContent, replacement);
var tempResource = new LinkedResource(Base64ToImageStream(base64), new ContentType(type))
{
ContentId = imgCount.ToString()
};
resourceCollection.Add(tempResource);
}
AlternateView alternateView = AlternateView.CreateAlternateViewFromString(content, null, MediaTypeNames.Text.Html);
foreach (var item in resourceCollection)
{
alternateView.LinkedResources.Add(item);
}
return alternateView;
}
Convert Base64 to Stream:
public static Stream Base64ToImageStream(string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
return ms;
}
Set up MailMessage :
MailMessage mail = new MailMessage();
mail.IsBodyHtml = true;
AlternateView alterView = ContentToAlternateView(bodyHtml);
mail.AlternateViews.Add(alterView);
//more settings
//...
//////////////
SmtpClient smtp = new SmtpClient(Host, Port) { EnableSsl = false };
smtp.Send(mail);
Method 2
To embed image into your mail message: (Its not same as adding an attachment file to message)
You dont need to convert image to base64 if you are using system.net.mail namespace to send your mail.
var mail = new MailMessage();
var imageToInline = new LinkedResource("Your image full path", MediaTypeNames.Image.Jpeg);
imageToInline.ContentId = "MyImage";
alternateView.LinkedResources.Add(imageToInline);
mail.AlternateViews.Add(body);
Update:
This is somewhat hacky way of embedding image to your mailMessage.
Byte[] bitmapData = Convert.FromBase64String(FixBase64ForImage("Your base64 image string"));
System.IO.MemoryStream streamBitmap = new System.IO.MemoryStream(bitmapData);
public static string FixBase64ForImage(string Image)
{
System.Text.StringBuilder sbText = new System.Text.StringBuilder(Image, Image.Length);
sbText.Replace("rn", string.Empty); sbText.Replace(" ", string.Empty);
return sbText.ToString();
}
var mail = new MailMessage();
var imageToInline = new LinkedResource(streamBitmap , MediaTypeNames.Image.Jpeg);
imageToInline.ContentId = "MyImage";
alternateView.LinkedResources.Add(imageToInline);
mail.AlternateViews.Add(body);
And your html mail body should have following tag:
<img alt ="" src ="cid:MyImage"/>
Method 3
<body>
<img src='data:image/jpeg;base64, <!-- base64 data --> />
</body>
use img tag as above in HTML of mail
or you can attach as below
Attachment attachment = new Attachment(base64String); attachment.TransferEncoding = TransferEncoding.Base64; mailmessage.Attachments.Add(attachment);
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0