[英]Add Attachment base64 image in MailMessage and read it in html body
目前我必須使用MailMessage
和SmtpClient
發送電子郵件,但我需要發送當前在MailAddress
正文中的base64
string
中的圖片。
我知道有必要把它放在Attachment
,但我不知道如何將base64
放在MailMessage
類中,然后讀取它以便在電子郵件正文中可視化圖像。 我沒有 url 圖像路徑。
將正文 HTML 轉換為 AlternateView 的完整方法
bodyHtml示例(您可以將其傳遞到下面的MailMessage代碼塊中)
<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>
使用此方法,您可以通過多個 ESP(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;
}
將 Base64 轉換為流:
public static Stream Base64ToImageStream(string base64String)
{
byte[] imageBytes = Convert.FromBase64String(base64String);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
return ms;
}
設置郵件消息:
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);
嵌入圖像到您的郵件:(它不是一樣添加附件文件消息)
如果您使用 system.net.mail 命名空間發送郵件,則不需要將圖像轉換為 base64。
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);
更新:
這是將圖像嵌入到您的郵件消息中的一種有點老套的方式。
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("\r\n", 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);
你的 html 郵件正文應該有以下標簽:
<img alt ="" src ="cid:MyImage"/>
<body>
<img src='data:image/jpeg;base64, <!-- base64 data --> />
</body>
在郵件的 HTML 中使用上面的 img 標簽
或者你可以附加如下
Attachment attachment = new Attachment(base64String);
attachment.TransferEncoding = TransferEncoding.Base64;
mailmessage.Attachments.Add(attachment);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.