gpt4 book ai didi

c# - 在 C# 中将 MSG 电子邮件转换为 PDF 文件

转载 作者:行者123 更新时间:2023-12-04 12:57:45 25 4
gpt4 key购买 nike

我正在使用 GemBox.EmailGemBox.Document将电子邮件转换为 PDF。
这是我的代码:

static void Main()
{
MailMessage message = MailMessage.Load("input.eml");
DocumentModel document = new DocumentModel();

if (!string.IsNullOrEmpty(message.BodyHtml))
document.Content.LoadText(message.BodyHtml, LoadOptions.HtmlDefault);
else
document.Content.LoadText(message.BodyText, LoadOptions.TxtDefault);

document.Save("output.pdf");
}
该代码适用于 EML 文件,但不适用于 MSG( MailMessage.BodyHtmlMailMessage.BodyText )都是空的。
我怎样才能使这对消息也有效?

最佳答案

问题发生在特定的 MSG 文件中,这些文件在 RTF 正文中没有 HTML 内容,而是具有原始 RTF 正文。
MailMessage 类当前不公开 RTF 正文的 API(仅纯文本和 HTML 正文)。不过,您可以将其检索为 Attachment 名为“ Body.rtf ”。
同样仅供引用,您遇到的另一个问题是电子邮件 HTML 正文中的图像未内联,因此,在导出为 PDF 时您将丢失它们。
无论如何,请尝试使用以下方法:

static void Main()
{
// Load an email (or retrieve it with POP or IMAP).
MailMessage message = MailMessage.Load("input.msg");

// Create a new document.
DocumentModel document = new DocumentModel();

// Import the email's body to the document.
LoadBody(message, document);

// Save the document as PDF.
document.Save("output.pdf");
}

static void LoadBody(MailMessage message, DocumentModel document)
{
if (!string.IsNullOrEmpty(message.BodyHtml))
{
var htmlOptions = LoadOptions.HtmlDefault;
// Replace attached CID images to inlined DATA urls.
var htmlBody = ReplaceEmbeddedImages(message.BodyHtml, message.Attachments);
// Load HTML body to the document.
document.Content.End.LoadText(htmlBody, htmlOptions);
}
else if (message.Attachments.Any(a => a.FileName == "Body.rtf"))
{
var rtfAttachment = message.Attachments.First(a => a.FileName == "Body.rtf");
var rtfOptions = LoadOptions.RtfDefault;
// Get RTF body from the attachment.
var rtfBody = rtfOptions.Encoding.GetString(rtfAttachment.Data.ToArray());
// Load RTF body to the document.
document.Content.End.LoadText(rtfBody, rtfOptions);
}
else
{
// Load TXT body to the document.
document.Content.End.LoadText(message.BodyText, LoadOptions.TxtDefault);
}
}

static string ReplaceEmbeddedImages(string htmlBody, AttachmentCollection attachments)
{
var srcPattern =
"(?<=<img.+?src=[\"'])" +
"(.+?)" +
"(?=[\"'].*?>)";

// Iterate through the "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 the "src" attribute with the inlined image.
htmlBody = $"{htmlBody.Substring(0, match.Index)}{embeddedSrc}{htmlBody.Substring(match.Index + match.Length)}";
}
}

return htmlBody;
}
有关更多信息(例如如何将电子邮件标题和附件添加到输出 PDF),请查看 Convert Email to PDF例子。

关于c# - 在 C# 中将 MSG 电子邮件转换为 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64063601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com