无法使用 MailKit 在电子邮件中嵌入图像
Cannot embed images in email with MailKit
这个问题已经在 SO 上的几个地方提出并回答了,特别是在这里:
并处理我的确切查询,但答案似乎不适用于我的情况。
我尝试构建一个简单的邮件程序,将图像嵌入 HTML 电子邮件中,但在多个客户端中,所有图像最终仍作为附件。
我怀疑我处理图像附件(一个 .gif 和几个 .png)的方式有问题:
// Add pictures to embedded resources and replace links to pictures in the message
foreach (string imgpath in ImgPaths)
{
var image = builder.LinkedResources.Add(imgpath);
image.ContentId = MimeUtils.GenerateMessageId();
image.ContentDisposition = new ContentDisposition() { Disposition = ContentDisposition.Inline };
HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
}
builder.HtmlBody = HtmlFormat;
message.Body = builder.ToMessageBody();
我可以从电子邮件中看到(例如,在 Gmail 中收到),确实表明图像被列为:
src="images/cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei"
在我试过的两个客户端(gmail 和 roundcube)中,所有图像都作为附件附加。我已经浏览了您的教程并检查了这里的所有内容:https://whosebug.com/search?q=Mailkit+Embed
可悲的是,我似乎无法找到我的错误。希望@jstedfast 能看到我在哪里犯了错误?
更新
如@jstedfast 所述,更正后的代码应该是(无论如何对我而言):
foreach (string imgpath in ImgPaths)
{
var test = Path.GetFileName(imgpath);
var image = builder.LinkedResources.Add(imgpath);
image.ContentId = MimeUtils.GenerateMessageId();
image.ContentDisposition = new ContentDisposition() { Disposition = ContentDisposition.Inline };
//HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
HtmlFormat = HtmlFormat.Replace($"images/{test}", string.Format("cid:{0}", image.ContentId)); //use images/filename
}
这看起来像问题:
<img src="images/cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei" .../>
需要:
<img src="cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei" .../>
我的猜测是,为了解决这个问题,您需要更改以下代码行:
HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
对此:
HtmlFormat = HtmlFormat.Replace(imgpath, string.Format("cid:{0}", image.ContentId));
希望对您有所帮助!
这个问题已经在 SO 上的几个地方提出并回答了,特别是在这里:
我尝试构建一个简单的邮件程序,将图像嵌入 HTML 电子邮件中,但在多个客户端中,所有图像最终仍作为附件。
我怀疑我处理图像附件(一个 .gif 和几个 .png)的方式有问题:
// Add pictures to embedded resources and replace links to pictures in the message
foreach (string imgpath in ImgPaths)
{
var image = builder.LinkedResources.Add(imgpath);
image.ContentId = MimeUtils.GenerateMessageId();
image.ContentDisposition = new ContentDisposition() { Disposition = ContentDisposition.Inline };
HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
}
builder.HtmlBody = HtmlFormat;
message.Body = builder.ToMessageBody();
我可以从电子邮件中看到(例如,在 Gmail 中收到),确实表明图像被列为:
src="images/cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei"
在我试过的两个客户端(gmail 和 roundcube)中,所有图像都作为附件附加。我已经浏览了您的教程并检查了这里的所有内容:https://whosebug.com/search?q=Mailkit+Embed 可悲的是,我似乎无法找到我的错误。希望@jstedfast 能看到我在哪里犯了错误?
更新
如@jstedfast 所述,更正后的代码应该是(无论如何对我而言):
foreach (string imgpath in ImgPaths)
{
var test = Path.GetFileName(imgpath);
var image = builder.LinkedResources.Add(imgpath);
image.ContentId = MimeUtils.GenerateMessageId();
image.ContentDisposition = new ContentDisposition() { Disposition = ContentDisposition.Inline };
//HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
HtmlFormat = HtmlFormat.Replace($"images/{test}", string.Format("cid:{0}", image.ContentId)); //use images/filename
}
这看起来像问题:
<img src="images/cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei" .../>
需要:
<img src="cid:TPSXHQUDSAU4.JJRKUIEGLTZ5@Loralei" .../>
我的猜测是,为了解决这个问题,您需要更改以下代码行:
HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId));
对此:
HtmlFormat = HtmlFormat.Replace(imgpath, string.Format("cid:{0}", image.ContentId));
希望对您有所帮助!