在 SQL Server 上的 send_dbmail 上将 CSS 添加到 HTML 生成的电子邮件

问题描述

我正在尝试在通过 sql Server 中的存储过程生成的报告电子邮件添加 CSS。该功能正在运行,只是当我在电子邮件中收到它时,状态上的 CSS 显示如下:

enter image description here

这就是我为 CSS 编码所做的:

DECLARE @xml NVARCHAR(MAX);
DECLARE @html NVARCHAR(MAX);

SET @xml = CAST((
SELECT 
TransactionTable.RequestName as 'td',CASE WHEN  TransactionTable.Approved = 0  THEN '<p style="font-weight:bold;color: rgb(209,168,35);">PENDING</p>'
 WHEN  TransactionTable.Approved = NULL THEN '<p style="font-weight:bold;color: rgb(209,35);">PENDING</p>'
 WHEN TransactionTable.Approved = 1  THEN '<p style="font-weight:bold;color: rgb(35,209,35);">APPROVED</p>' 
 WHEN TransactionTable.Approved = 2  THEN '<p style="font-weight:bold;color: rgb(228,26,26);">REJECTED</p>' 
 ELSE
 '<p style="color: rgb(209,35);">PENDING</p>'
 END  as 'td',TransactionTable.Comments as 'td',CONVERT(VARCHAR(20),TransactionTable.ApprovedDate,100) as 'td',from 
TransactionTable  
ORDER BY ApproverOrder FOR XML PATH('tr'),ELEMENTS XSINIL) AS NVARCHAR(MAX));

SET @html = '<html>
                 <head>
                     <link href="https://fonts.googleapis.com/css2?family=Baloo+2&display=swap" rel="stylesheet">
                     <style>
                       body {font-family:''Baloo 2'';}
                     </style>
                     <Meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                     <Meta name="viewport" content="width=device-width,initial-scale=1.0"/>
                 </head>
            <body>
                <table>
                    <tr>
                        <td>Request Name</td>
                        <td>Status</td>
                        <td>Comment</td>
                        <td>Update On</td>
                    </tr>
                    <tr>
                    '+ @xml +'
                    </tr>
                </table>
            </body>
            </html>';

        EXEC msdb.dbo.sp_send_dbmail
        @importance='normal',@FROM_address='noreply@mail.com',@body =  @html,@body_format ='HTML',@recipients = 'myemail@mail.com',@subject = 'ApprovalReport' ;

在运行 sp_send_dbmail 之前,我需要做些什么才能使 CSS 正常工作?

解决方法

FOR XML PATH 的输出没有产生您期望的结果。如果你把它简化为一个最小的例子,这就是你正在做的代码:

DECLARE @xml NVARCHAR(MAX);
SET @xml = CAST((
SELECT 
 CASE WHEN  Approved = 0  THEN '<p style="font-weight:bold;color: rgb(209,168,35);">PENDING</p>'
 WHEN  Approved = NULL THEN '<p style="font-weight:bold;color: rgb(209,35);">PENDING</p>'
 WHEN Approved = 1  THEN '<p style="font-weight:bold;color: rgb(35,209,35);">APPROVED</p>' 
 WHEN Approved = 2  THEN '<p style="font-weight:bold;color: rgb(228,26,26);">REJECTED</p>' 
 ELSE
 '<p style="color: rgb(209,35);">PENDING</p>'
 END  as 'td'
from (values (1,1)) T(ApproverOrder,Approved)
ORDER BY ApproverOrder FOR XML PATH('tr'),ELEMENTS XSINIL) AS NVARCHAR(MAX));
select @xml;

产生:

<tr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><td>&lt;p style="font-weight:bold;color: rgb(35,35);"&gt;APPROVED&lt;/p&gt;</td></tr>

请注意 < 标签周围的 >p 字符是如何编码为 &lt;&gt; 序列的。尝试重新排列您的代码,使其更像以下内容:

DECLARE @xml NVARCHAR(MAX);
SET @xml = CAST((
SELECT 
 CASE
   WHEN  Approved = 0  THEN 'font-weight:bold;color: rgb(209,35);'
   WHEN  Approved = NULL THEN 'font-weight:bold;color: rgb(209,35);'
   WHEN Approved = 1  THEN 'font-weight:bold;color: rgb(35,35);'
   WHEN Approved = 2  THEN 'font-weight:bold;color: rgb(228,26);'
   ELSE 'color: rgb(209,35);'
 END  as 'td/p/@style',CASE
   WHEN  Approved = 0  THEN 'PENDING'
   WHEN  Approved = NULL THEN 'PENDING'
   WHEN Approved = 1  THEN 'APPROVED'
   WHEN Approved = 2  THEN 'REJECTED'
   ELSE 'PENDING'
 END as 'td/p'
from (values (1,ELEMENTS XSINIL) AS NVARCHAR(MAX));
select @xml;

产生输出:

<tr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><td><p style="font-weight:bold;color: rgb(35,35);">APPROVED</p></td></tr>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...