3

我正在使用 SSRS Web 服务生成 HTML4.0 格式的报告,然后尝试使用 System.Net.Mail 发送它们(我知道 SSRS 已内置报告计划,但我们需要处理所有计划的进程在一个中心位置)。所以,我正在生成 html 文件,然后尝试构建邮件消息,如下所示:

using (var sw = new StreamReader(htmlFile))
{
    mail_body = sw.ReadToEnd();
}

var mail = new MailMessage
                {
                    From = new MailAddress(mail_from),
                    Subject = mail_subject,
                    IsBodyHtml = true,
                    Body = mail_body
                };

唯一的问题是,当我这样做时,虽然 html 文件在浏览器中打开时看起来很好,但在 Outlook 中它最终会被水平挤压。

例如,这就是我的 html 文件在 IE 中的样子:

在此处输入图像描述

但是当我使用上述方法发送电子邮件后,在 Outlook 中它最终看起来像这样:

在此处输入图像描述

似乎施加了某种线宽限制,但我不确定这发生在什么级别。

有没有人对可能导致这种情况的原因有任何见解?

谢谢!

4

4 回答 4

9

我们遇到了类似的问题,经过很多变通方法后,我们终于在 SSRS 配置中找到了一个可以解决问题的参数:OutlookCompat。启用此功能后,HTML4.0 电子邮件在 Outlook 中看起来不再被挤压。

有关详细信息,请参阅MSDN 文档。您可以在 SSRS 配置文件(适用于所有报告和调用者)中设置此值,也可以在调用 ASMX 时直接设置此值。

SSRS 配置示例:

<Extension Name="HTML4.0" Type="...">
    <Configuration>
       <DeviceInfo>
          <OutlookCompat>True</OutlookCompat>
       </DeviceInfo>
    </Configuration>
</Extension>
于 2013-03-25T07:02:16.667 回答
3

我找到了一个原因加上解决方案/解决方法,我希望其他人可以利用它。

我将 MHT 文件中的 base64 编码 HTML 与直接生成的 HTML4.0 标记进行了比较,发现了一个独特的重复出现的差异。HTML4.0 报告中的每个表格单元格类的定义如下:

.a23c
{
    padding-left: 2pt;
    padding-top: 2pt;
    padding-right: 2pt;
    padding-bottom: 2pt;
    border: 1pt solid Black;
    background-color: #d3d3d3;
    vertical-align: top;
    text-align: center;
    direction: ltr;
    layout-flow: horizontal;
    writing-mode: lr-tb;
}

但是,当我查看 MHT 文件中解码的 html 时,其中的类有两个额外的属性 - 宽度和最小宽度,例如

.a23c
{
    padding-left: 2pt;
    padding-top: 2pt;
    padding-right: 2pt;
    padding-bottom: 2pt;
    border: 1pt solid Black;
    background-color: #d3d3d3;
    vertical-align: top;
    text-align: center;
    direction: ltr;
    layout-flow: horizontal;
    writing-mode: lr-tb;
    min-width: 28.05mm;
    width: 28.05mm;
}

似乎未设置这些属性会导致 Outlook 将表格单元格向下挤压(可能是因为其 HTML 解析器将 100% 宽度定义为大约 80 列限制?)。

因此,知道了这一点,解决方法似乎很清楚:读入生成的 MHT 文件,在其中解码 base64 编码的 HTML 并将其作为邮件正文发送。这实际上似乎有效,并且代码最少:

var decoded_text = new StringBuilder();
using (var reader = new StreamReader(mhtFile))
{
    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        if (line != "Content-Transfer-Encoding: base64") continue;

        reader.ReadLine(); //chew up the blank line
        while ((line = reader.ReadLine()) != String.Empty)
            if (line != null)
                decoded_text.Append(Encoding.UTF8.GetString(Convert.FromBase64String(line)));
        break;
    }
}

我并不完全相信这段代码的健壮性,但目前它似乎工作得很好,所以我将接受这个作为答案。如果任何知识渊博的人最终阅读本文,将很高兴了解更好的解决方案!

于 2012-11-26T10:11:18.447 回答
3

我遇到了同样的问题,但接受的答案不适用于 Outlook 2013。ExpandContent 属性帮助我解决了宽度问题。

这是我的设备信息配置:

            const string devInfo = @"<DeviceInfo>" +
                                "<HTMLFragment>True</HTMLFragment> " +
                                "<OutlookCompat>True</OutlookCompat>" +
                                "<Toolbar>False</Toolbar>" +
                                "<ExpandContent>True</ExpandContent>" +
                               "</DeviceInfo>";

之后,报告通过 SOAP API 呈现,并提供了 devInfo:

reportBytes = reportService.Render(renderFormat, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

希望这可以帮助。

斯文

于 2015-06-18T11:42:50.360 回答
0

首先打开以下文件:

C:\Program Files\Microsoft SQL Server\MSRS12.MSSQLSERVER\Reporting Services\ReportServer

而不是尝试找到以下扩展名:

<Extension Name="HTML4.0"

现在确保您的扩展元素具有以下子元素:

 <Configuration>
       <DeviceInfo>
          <OutlookCompat>True</OutlookCompat>
       </DeviceInfo>
    </Configuration>

现在你的报告在前景中会更好。

于 2015-03-10T09:44:08.017 回答