问题 - 我正在使用 MailKit 实用程序,需要将图像嵌入到我的 MailKit 消息的正文中。我还没有看到关于如何通过内存流完成此操作的示例或参考。我在资源文件中保存了一个文件,我想将其显示在电子邮件正文中而不是作为附件。
下面的工作如图所示,尽管有一个不需要的硬编码路径
using MailKit.Net.Smtp;
using MailKit;
public static List<MessageSet> MessageList = new List<MessageSet>();
public static void SendErrorNotification(MONMessage message)
{
var email = new MimeMessage();
try
{
var supportImage = GetImageByName("support_image.jpg");
var byteArray = BitmapToByteArray(supportImage);
MemoryStream imageMemoryStream = new MemoryStream(byteArray);
var validateMessage = MessageList.Where(m => m.MessageTime == message.MessageTime && m.MessageSetVal == message.MessageSet && m.MessageStatus == message.Status);
if (validateMessage.Count() == 0)
{
email.From.Add(new MailboxAddress("Monitor", "[email protected]"));
email.To.Add(new MailboxAddress("Lancair", "[email protected]"));
email.Subject = "Environment Error Found - Please Review";
var Name = message.Name == string.Empty ? message.Name : "N/A";
var emailText = "<br><br>" + "The following error has occurred within the Data Environment" + "<br>"
+ "Time: " + message.MessageTime + "<br>"
+ " Database: " + message.DBName + "<br>"
+ " Name: " + Name + "<br>"
+ " Event Id: " + message.EventID + "<br>"
+ " Message: " + message.Text + "</b>";
email.Body = new TextPart(MimeKit.Text.TextFormat.Html)
{
Text = emailText
};
BodyBuilder _body = new BodyBuilder
{
HtmlBody = email.Body.ToString(),
};
var image = _body.LinkedResources.Add("C:\\Personal\\support_image.png");
image.ContentId = MimeUtils.GenerateMessageId();
_body.HtmlBody = string.Format(@"<p>Hello Support</p><br><img src=""cid:{0}"">", image.ContentId) + _body.HtmlBody;
email.Body = _body.ToMessageBody();
// Add Message to Sent List
MessageList.Add(new MessageSet { MessageTime = message.MessageTime, MessageSetVal = message.MessageSet, MessageStatus = message.Status });
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
{
smtp.Connect("mymail.home.com", 0, false);
smtp.Send(email);
smtp.Disconnect(true);
}
}
// Save Message
} catch (Exception ex)
{ Debug.WriteLine(ex.Message); }
}
public static Bitmap GetImageByName(string imageName)
{
System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
string resourceName = asm.GetName().Name + ".Properties.Resources";
var rm = new System.Resources.ResourceManager(resourceName, asm);
return (Bitmap)rm.GetObject(imageName);
}
public static byte[] BitmapToByteArray(Bitmap bitmap)
{
BitmapData bmpdata = null;
try
{
bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
int numbytes = bmpdata.Stride * bitmap.Height;
byte[] bytedata = new byte[numbytes];
IntPtr ptr = bmpdata.Scan0;
Marshal.Copy(ptr, bytedata, 0, numbytes);
return bytedata;
}
finally
{
if (bmpdata != null)
bitmap.UnlockBits(bmpdata);
}
}
替换此行:
var image = _body.LinkedResources.Add("C:\\Personal\\support_image.png");
这样:
var image = _body.LinkedResources.Add("support_image.png", imageMemoryStream);