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

5
我是使用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文件?


MSG是一种不同于EML和MS Outlook特定的文件格式。请检查GemBox是否能够真正处理它们。也许你需要告诉它要预期什么。 - Fildor
嗯,... 这里说他们可以。而且它是由文件扩展名决定的。所以你的代码应该可以正常工作。你能验证一下你的.msg文件是否是有效的Outlook邮件文件并且有内容吗?你能试试另一个带有msg扩展名的文件吗?你能在Outlook或者其中一个“outlook-msg reader”应用程序中打开它吗? - Fildor
@Fildor,根据他们的 Convert 示例,它应该支持 MSG、EML 和 MHTML 格式。 - NixonUposseen
是的,我也刚刚读到了。因此,要么存在错误(我怀疑),要么您的MSG文件不是有效的MS Outlook消息文件。我建议尝试另一个文件,并在联系支持之前仔细检查该文件以确保它是有效的。 - Fildor
1
@NixonUposseen 我认为问题可能是与你的MSG文件有关,因此请尝试Fildor提供的建议。如果问题仍然存在,请将你的MSG文件上传到某个地方,以便我可以查看它。 - Mario Z
1个回答

6

该问题出现在特定的MSG文件中,这些文件在RTF正文中没有HTML内容,而是有一个原始的RTF正文。

MailMessage类目前没有公开API来获取RTF正文(只有纯文本和HTML正文)。不过,您可以将其作为名为“Body.rtf”的Attachment进行检索。

另外,需要注意的是,电子邮件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;
        // Get the HTML body with embedded images.
        var htmlBody = message.GetEmbeddedBodyHtml();
        // Load the 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 the RTF body from the attachment.
        var rtfBody = rtfOptions.Encoding.GetString(rtfAttachment.Data.ToArray());
        // Load the 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);
    }
}

如需更多信息(例如如何将电子邮件头和附件添加到输出 PDF 中),请查看 将电子邮件转换为PDF 示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接